Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/user32/tests/win.c | 31 ++++++++++++++++++++++++++++++- dlls/user32/winpos.c | 8 ++++++++ 2 files changed, 38 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index d95b831..e134d54 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -3113,7 +3113,6 @@ todo_wine ShowWindow(hwnd, SW_SHOWMINIMIZED); ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); ok( GetFocus() != child, "Focus should not be on child %p\n", child ); -todo_wine ok( GetFocus() != hwnd, "Focus should not be on parent %p\n", hwnd ); old_wnd_proc = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, (LONG_PTR)set_focus_on_activate_proc); ShowWindow(hwnd, SW_RESTORE); @@ -10273,6 +10272,13 @@ static void test_minimize_window(HWND hwndMain) ShowWindow(hwnd2, SW_RESTORE); check_active_state(hwnd2, hwnd2, hwnd2);
+ /* try SW_SHOWMINIMIZED */ + ShowWindow(hwnd2, SW_SHOWMINIMIZED); + check_active_state(hwnd2, hwnd2, 0); + + ShowWindow(hwnd2, SW_RESTORE); + check_active_state(hwnd2, hwnd2, hwnd2); + /* hide a non-active window */ ShowWindow(hwnd, SW_MINIMIZE); check_active_state(hwnd2, hwnd2, hwnd2); @@ -10316,6 +10322,11 @@ static void test_minimize_window(HWND hwndMain) todo_wine check_active_state(hwnd2, hwnd2, hwnd2);
+ /* with SW_SHOWMINIMIZED */ + ShowWindow(hwnd3, SW_RESTORE); + ShowWindow(hwnd3, SW_SHOWMINIMIZED); + check_active_state(hwnd3, hwnd3, 0); + /* hide an owner window */ ShowWindow(hwnd, SW_RESTORE); ShowWindow(hwnd2, SW_RESTORE); @@ -10325,6 +10336,24 @@ static void test_minimize_window(HWND hwndMain) check_active_state(hwnd2, hwnd2, hwnd2);
DestroyWindow(hwnd3); + + /* test a child window - focus should be yielded back to the parent */ + ShowWindow(hwnd, SW_RESTORE); + hwnd3 = CreateWindowExA(0, "MainWindowClass", "Child window 3", WS_CHILD|WS_VISIBLE, + 100, 100, 200, 200, hwnd, 0, GetModuleHandleA(NULL), NULL); + SetFocus(hwnd3); + check_active_state(hwnd, hwnd, hwnd3); + ShowWindow(hwnd3, SW_MINIMIZE); + check_active_state(hwnd, hwnd, hwnd); + + /* with SW_SHOWMINIMIZED */ + ShowWindow(hwnd3, SW_RESTORE); + SetFocus(hwnd3); + check_active_state(hwnd, hwnd, hwnd3); + ShowWindow(hwnd3, SW_SHOWMINIMIZED); + check_active_state(hwnd, hwnd, hwnd); + + DestroyWindow(hwnd3); DestroyWindow(hwnd2); DestroyWindow(hwnd);
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index 5579de4..f68227a 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -928,6 +928,14 @@ UINT WINPOS_MinMaximize( HWND hwnd, UINT cmd, LPRECT rect ) if (IsZoomed( hwnd )) win_set_flags( hwnd, WIN_RESTORE_MAX, 0 ); else win_set_flags( hwnd, 0, WIN_RESTORE_MAX );
+ if (GetFocus() == hwnd) + { + if (GetWindowLongW(hwnd, GWL_STYLE) & WS_CHILD) + SetFocus(GetAncestor(hwnd, GA_PARENT)); + else + SetFocus(0); + } + old_style = WIN_SetStyle( hwnd, WS_MINIMIZE, WS_MAXIMIZE );
wpl.ptMinPosition = WINPOS_GetMinimizedPos( hwnd, wpl.ptMinPosition );
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- This and the previous patch fix a WM-dependent failure. Most window managers activate another window when one is minimized, including that of native Windows. The test does in fact account for this, however, Wine currently activates windows incorrectly, both by sending the WM_CANCELMODE message and by failing to kill focus before minimizing a window.
This test was succeeding (inside todo_wine) on the testbot, which uses fvwm in focus-follows-mouse mode, since in that case another window would never be activated.
dlls/user32/tests/msg.c | 2 +- dlls/winemac.drv/window.c | 6 +----- dlls/winex11.drv/event.c | 1 - 3 files changed, 2 insertions(+), 7 deletions(-)
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 082b560..305d503 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -5087,7 +5087,7 @@ static void test_messages(void)
ShowWindow(hwnd, SW_MINIMIZE); flush_events(); - ok_sequence(WmShowMinOverlappedSeq, "ShowWindow(SW_SHOWMINIMIZED):overlapped", TRUE); + ok_sequence(WmShowMinOverlappedSeq, "ShowWindow(SW_SHOWMINIMIZED):overlapped", FALSE); flush_sequence();
if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_MINIMIZE) diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index ff140a1..48b44a6 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2327,11 +2327,7 @@ void macdrv_window_lost_focus(HWND hwnd, const macdrv_event *event) TRACE("win %p/%p fg %p\n", hwnd, event->window, GetForegroundWindow());
if (hwnd == GetForegroundWindow()) - { - SendMessageW(hwnd, WM_CANCELMODE, 0, 0); - if (hwnd == GetForegroundWindow()) - SetForegroundWindow(GetDesktopWindow()); - } + SetForegroundWindow(GetDesktopWindow()); }
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index a0bfe05..9bd4e11 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -804,7 +804,6 @@ static BOOL X11DRV_FocusIn( HWND hwnd, XEvent *xev ) return; } if (hwnd != GetForegroundWindow()) return; - SendMessageW( hwnd, WM_CANCELMODE, 0, 0 );
/* don't reset the foreground window, if the window which is getting the focus is a Wine window */
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=35659
Your paranoid android.
=== build (build) === Patch failed to apply
Hi,
While running your changed tests on Windows, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check? Full results can be found at https://testbot.winehq.org/JobDetails.pl?Key=35658
Your paranoid android.
=== build (build) === Patch failed to apply