Zebediah Figura : user32: Kill focus before minimizing a window.

Alexandre Julliard julliard at winehq.org
Fri Feb 2 12:24:39 CST 2018


Module: wine
Branch: master
Commit: 9b2dd2db6ac44ed02cbe04673646ace15fda758a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9b2dd2db6ac44ed02cbe04673646ace15fda758a

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jan 30 19:56:24 2018 -0600

user32: Kill focus before minimizing a window.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 9cf4ed3..7be83571 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);
@@ -10072,6 +10071,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);
@@ -10115,6 +10121,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);
@@ -10124,6 +10135,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 );




More information about the wine-cvs mailing list