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;

Reply via email to