[RAPPS] Hide the main window during active download/install if the user closes it (#7014)

This commit is contained in:
Whindmar Saksit 2024-09-26 18:58:30 +02:00 committed by GitHub
parent 2f83e6a65d
commit 053939e27c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 55 additions and 2 deletions

View File

@ -318,13 +318,13 @@ CMainWindow::ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPa
case WM_CREATE:
if (!InitControls())
::PostMessageW(hwnd, WM_CLOSE, 0, 0);
::PostMessageW(hwnd, DM_REPOSITION, 0, 0);
break;
case WM_DESTROY:
{
ShowWindow(SW_HIDE);
hMainWnd = NULL;
SaveSettings(hwnd, &SettingsInfo);
FreeLogs();
delete m_ClientPanel;
@ -333,6 +333,19 @@ CMainWindow::ProcessWindowMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPa
return 0;
}
case WM_CLOSE:
ShowWindow(SW_HIDE);
return g_Busy;
case WM_NOTIFY_OPERATIONCOMPLETED:
if (!g_Busy && !IsWindowVisible())
SendMessage(WM_CLOSE, 0, 0);
break;
case DM_REPOSITION:
EmulateDialogReposition(hwnd); // We are not a real dialog, we need help from a real one
break;
case WM_COMMAND:
OnCommand(wParam, lParam);
break;

View File

@ -30,6 +30,8 @@ VOID
CopyTextToClipboard(LPCWSTR lpszText);
VOID
ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem, POINT *Point = NULL);
VOID
EmulateDialogReposition(HWND hwnd);
BOOL
StartProcess(const CStringW &Path, BOOL Wait);
BOOL

View File

@ -13,4 +13,8 @@
#include "misc.h"
#include "configparser.h"
extern LONG g_Busy;
#define WM_NOTIFY_OPERATIONCOMPLETED (WM_APP + 0)
#endif /* _RAPPS_H */

View File

@ -470,6 +470,7 @@ CDownloadManager::DownloadDlgProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lPa
{
case WM_INITDIALOG:
{
g_Busy++;
HICON hIconSm, hIconBg;
CStringW szTempCaption;
@ -557,6 +558,12 @@ CDownloadManager::DownloadDlgProc(HWND Dlg, UINT uMsg, WPARAM wParam, LPARAM lPa
}
return TRUE;
case WM_DESTROY:
g_Busy--;
if (hMainWnd)
PostMessage(hMainWnd, WM_NOTIFY_OPERATIONCOMPLETED, 0, 0);
return FALSE;
default:
return FALSE;
}

View File

@ -39,6 +39,31 @@ CopyTextToClipboard(LPCWSTR lpszText)
CloseClipboard();
}
static INT_PTR CALLBACK
NothingDlgProc(HWND hDlg, UINT uMsg, WPARAM, LPARAM)
{
return uMsg == WM_CLOSE ? DestroyWindow(hDlg) : FALSE;
}
VOID
EmulateDialogReposition(HWND hwnd)
{
static const DWORD DlgTmpl[] = { WS_POPUP | WS_CAPTION | WS_SYSMENU, 0, 0, 0, 0, 0 };
HWND hDlg = CreateDialogIndirectW(NULL, (LPDLGTEMPLATE)DlgTmpl, NULL, NothingDlgProc);
if (hDlg)
{
RECT r;
GetWindowRect(hwnd, &r);
if (SetWindowPos(hDlg, hDlg, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOZORDER | SWP_NOACTIVATE))
{
SendMessage(hDlg, DM_REPOSITION, 0, 0);
if (GetWindowRect(hDlg, &r))
SetWindowPos(hwnd, hwnd, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_NOZORDER | SWP_NOACTIVATE);
}
SendMessage(hDlg, WM_CLOSE, 0, 0);
}
}
VOID
ShowPopupMenuEx(HWND hwnd, HWND hwndOwner, UINT MenuID, UINT DefaultItem, POINT *Point)
{

View File

@ -367,6 +367,7 @@ ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow)
if (hWindow)
{
/* Activate the window in the other instance */
ShowWindow(hWindow, SW_SHOW);
SwitchToThisWindow(hWindow, TRUE);
if (bAppwizMode)
PostMessage(hWindow, WM_COMMAND, ID_ACTIVATE_APPWIZ, 0);

View File

@ -14,6 +14,7 @@
#include <conutils.h>
LPCWSTR szWindowClass = L"ROSAPPMGR2";
LONG g_Busy = 0;
HWND hMainWnd;
HINSTANCE hInst;