[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