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 );