https://git.reactos.org/?p=reactos.git;a=commitdiff;h=053939e27cbf4d6475fb3…
commit 053939e27cbf4d6475fb33b6fc16199bd944880d
Author: Whindmar Saksit <whindsaks(a)proton.me>
AuthorDate: Thu Sep 26 18:58:30 2024 +0200
Commit: GitHub <noreply(a)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;