Signed-off-by: Zebediah Figura z.figura12@gmail.com --- Initial version was dependent on some patches in my local tree; sorry for the spam.
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 f492ecc..917ab61 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); @@ -10071,6 +10070,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); @@ -10114,6 +10120,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); @@ -10123,6 +10134,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 10f0fd0..c1b55b5 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -983,6 +983,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_FindIconPos( 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 f391ab9..2ff0c76 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 e49a445..7c07907 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -2335,11 +2335,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 */
Zebediah Figura z.figura12@gmail.com wrote:
--- 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 */
Menu modal loop depends on this, and probably will be broken if WM_CANCELMODE no longer sent.
On 30/01/18 20:56, Dmitry Timoshkov wrote:
Zebediah Figura z.figura12@gmail.com wrote:
--- 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 */
Menu modal loop depends on this, and probably will be broken if WM_CANCELMODE no longer sent.
Actually, as far as my testing shows, it's broken right now. Windows doesn't send WM_CANCELMODE on focus loss, even if the window is tracking a menu.
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=35661
Your paranoid android.
=== w1064 (32 bit win) === win.c:2331: Test failed: expected !100 win.c:2331: Test failed: expected !100