https://git.reactos.org/?p=reactos.git;a=commitdiff;h=053939e27cbf4d6475fb33b6fc16199bd944880d
commit 053939e27cbf4d6475fb33b6fc16199bd944880d Author: Whindmar Saksit <whinds...@proton.me> AuthorDate: Thu Sep 26 18:58:30 2024 +0200 Commit: GitHub <nore...@github.com> CommitDate: Thu Sep 26 18:58:30 2024 +0200 [RAPPS] Hide the main window during active download/install if the user closes it (#7014) --- base/applications/rapps/gui.cpp | 17 +++++++++++++++-- base/applications/rapps/include/misc.h | 2 ++ base/applications/rapps/include/rapps.h | 4 ++++ base/applications/rapps/loaddlg.cpp | 7 +++++++ base/applications/rapps/misc.cpp | 25 +++++++++++++++++++++++++ base/applications/rapps/unattended.cpp | 1 + base/applications/rapps/winmain.cpp | 1 + 7 files changed, 55 insertions(+), 2 deletions(-) diff --git a/base/applications/rapps/gui.cpp b/base/applications/rapps/gui.cpp index 562e383685c..70cedb28a21 100644 --- a/base/applications/rapps/gui.cpp +++ b/base/applications/rapps/gui.cpp @@ -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; diff --git a/base/applications/rapps/include/misc.h b/base/applications/rapps/include/misc.h index 91ede797f08..4617050855a 100644 --- a/base/applications/rapps/include/misc.h +++ b/base/applications/rapps/include/misc.h @@ -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 diff --git a/base/applications/rapps/include/rapps.h b/base/applications/rapps/include/rapps.h index 02cb22182ae..49bb4691f09 100644 --- a/base/applications/rapps/include/rapps.h +++ b/base/applications/rapps/include/rapps.h @@ -13,4 +13,8 @@ #include "misc.h" #include "configparser.h" +extern LONG g_Busy; + +#define WM_NOTIFY_OPERATIONCOMPLETED (WM_APP + 0) + #endif /* _RAPPS_H */ diff --git a/base/applications/rapps/loaddlg.cpp b/base/applications/rapps/loaddlg.cpp index 27fb028d3f9..3e477dbe0b5 100644 --- a/base/applications/rapps/loaddlg.cpp +++ b/base/applications/rapps/loaddlg.cpp @@ -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; } diff --git a/base/applications/rapps/misc.cpp b/base/applications/rapps/misc.cpp index 400f0b588e6..c5fe6f0c4bc 100644 --- a/base/applications/rapps/misc.cpp +++ b/base/applications/rapps/misc.cpp @@ -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) { diff --git a/base/applications/rapps/unattended.cpp b/base/applications/rapps/unattended.cpp index 38c13caeffe..12ffe79254a 100644 --- a/base/applications/rapps/unattended.cpp +++ b/base/applications/rapps/unattended.cpp @@ -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); diff --git a/base/applications/rapps/winmain.cpp b/base/applications/rapps/winmain.cpp index 9c32c4cd887..2c5c06a300f 100644 --- a/base/applications/rapps/winmain.cpp +++ b/base/applications/rapps/winmain.cpp @@ -14,6 +14,7 @@ #include <conutils.h> LPCWSTR szWindowClass = L"ROSAPPMGR2"; +LONG g_Busy = 0; HWND hMainWnd; HINSTANCE hInst;