[PATCH 1/2] user32: Allow the backends to defer restoring minimized windows.

Arkadiusz Hiler ahiler at codeweavers.com
Fri Jul 2 08:01:28 CDT 2021


When restoring a minimized window the WM_SYSCOMMAND SC_RESTORE message
should arrive after WM_NCACTIVATE but before WM_ACTIVATE and WM_SETFOCUS.

Some games depend on that ordering and the related window state.

For example Project CARS 3 expects window to be both active and in the
foreground (wrt GetActiveWindow() and GetForegroundWindow()) when
receiving those messages.

Without being active the window doesn't restore properly, see
82c6ec3a32f4 ("winex11.drv: Activate window when restoring from iconic state.")

But if the activate messages arrive before the window is in the
foreground, the game tries to re-acquire DirectInput DISCL_FOREGROUND
devices too early and fails, which results in non-working keyboards and
controllers.

Signed-off-by: Arkadiusz Hiler <ahiler at codeweavers.com>
---
 dlls/user32/focus.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/dlls/user32/focus.c b/dlls/user32/focus.c
index 4c18238a98b..e804720c7ca 100644
--- a/dlls/user32/focus.c
+++ b/dlls/user32/focus.c
@@ -148,6 +148,13 @@ static BOOL set_active_window( HWND hwnd, HWND *prev, BOOL mouse, BOOL focus )
     if (IsWindow(hwnd))
     {
         SendMessageW( hwnd, WM_NCACTIVATE, (hwnd == GetForegroundWindow()), (LPARAM)previous );
+
+        if (GetPropW( hwnd, L"__WINE_RESTORE_WINDOW" ))
+        {
+            SetPropW( hwnd, L"__WINE_RESTORE_WINDOW", NULL );
+            SendMessageW( hwnd, WM_SYSCOMMAND, SC_RESTORE, 0 );
+        }
+
         SendMessageW( hwnd, WM_ACTIVATE,
                       MAKEWPARAM( mouse ? WA_CLICKACTIVE : WA_ACTIVE, IsIconic(hwnd) ),
                       (LPARAM)previous );
-- 
2.32.0




More information about the wine-devel mailing list