Signed-off-by: Zebediah Figura <z.figura12(a)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 );
--
2.7.4