From: Zebediah Figura Subject: [PATCH resend 1/2] user32: Kill focus before minimizing a window. Message-Id: <1517363785-16238-1-git-send-email-z.figura12@gmail.com> Date: Tue, 30 Jan 2018 19:56:24 -0600 Signed-off-by: Zebediah Figura --- 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 ); -- 2.7.4