[PATCH v2 1/2] winex11.drv: Activate window when restoring from iconic state.

Zhiyi Zhang zzhang at codeweavers.com
Fri May 24 04:22:09 CDT 2019


Some games, e.g., Mirror's Edge waits for WM_ACTIVATE
when restoring from iconic state.

Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
v2: SetActiveWindow only when restoring from iconic state and window is visible.

This doesn't break existing tests, see https://testbot.winehq.org/JobDetails.pl?Key=52779

I couldn't find a good way to test this because it manifests when clicking on the taskbar
icon, rather via ShowWindow or WM_SYSCOMMAND message.

But I do have some proves that activate messages are sent before WM_SYSCOMMAND SC_RESTORE.

#1 Click on minimized notepad taskbar icon message trace by spy++ on Windows 10 1809

---- Click happens ---- 
<000001> 00000000000203C4 S WM_WINDOWPOSCHANGING lpwp:00000012439BF540
<000002> 00000000000203C4 R WM_WINDOWPOSCHANGING
<000003> 00000000000203C4 S WM_WINDOWPOSCHANGED lpwp:00000012439BF540
<000004> 00000000000203C4 R WM_WINDOWPOSCHANGED
---- Begin of activate messages ----
<000005> 00000000000203C4 S WM_ACTIVATEAPP fActive:True dwThreadID:00001758
<000006> 00000000000203C4 R WM_ACTIVATEAPP
<000007> 00000000000203C4 S WM_NCACTIVATE fActive:True
<000008> 00000000000203C4 R WM_NCACTIVATE
<000009> 00000000000203C4 S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:True hwndPrevious:(null)
<000010> 00000000000203C4 R WM_ACTIVATE
---- WM_SYSCOMMAND SC_RESTORE ----
<000011> 00000000000203C4 P WM_SYSCOMMAND uCmdType:SC_RESTORE xPos:0 yPos:0 (used mnemonic)
<000012> 00000000000203C4 S WM_QUERYOPEN
<000013> 00000000000203C4 R WM_QUERYOPEN fOpenIsOk:True
<000014> 00000000000203C4 S WM_WINDOWPOSCHANGING lpwp:00000012439BECA0
<000015> 00000000000203C4 S WM_GETMINMAXINFO lpmmi:00000012439BE530
<000016> 00000000000203C4 R WM_GETMINMAXINFO lpmmi:00000012439BE530
<000017> 00000000000203C4 R WM_WINDOWPOSCHANGING
<000018> 00000000000203C4 S WM_NCCALCSIZE fCalcValidRects:True lpncsp:00000012439BEC70
<000019> 00000000000203C4 S message:0x0093 [Unknown] wParam:00000000 lParam:00000012439BE300
<000020> 00000000000203C4 R message:0x0093 [Unknown] lResult:00000001
<000021> 00000000000203C4 R WM_NCCALCSIZE fuValidRect:0000 lpncsp:00000012439BEC70
<000022> 00000000000203C4 S WM_NCPAINT hrgn:00000001
... ...

#2 The reason why Mirror's Edge doesn't handle WM_SYSCOMMAND SC_RESTORE

Disassembly of the game win proc shows that the win proc return 0 directly
when handling WM_SYSCOMMAND SC_RESTORE in fullscreen mode, instead of
handing it to DefWindowProc or do any sort of processing. So this means
it rely on the WM_ACTIVATE message before WM_SYSCOMMAND.

 dlls/winex11.drv/event.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 6054f645c4..5c465aa033 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -1266,6 +1266,8 @@ static void handle_wm_state_notify( HWND hwnd, XPropertyEvent *event, BOOL updat
             {
                 TRACE( "restoring win %p/%lx\n", data->hwnd, data->whole_window );
                 release_win_data( data );
+                if ((style & (WS_MINIMIZE | WS_VISIBLE)) == (WS_MINIMIZE | WS_VISIBLE))
+                    SetActiveWindow( hwnd );
                 SendMessageW( hwnd, WM_SYSCOMMAND, SC_RESTORE, 0 );
                 return;
             }
-- 
2.20.1





More information about the wine-devel mailing list