wine/dlls x11drv/winpos.c user/tests/msg.c

Alexandre Julliard julliard at wine.codeweavers.com
Wed Nov 9 04:35:48 CST 2005


ChangeSet ID:	21187
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/09 04:35:48

Modified files:
	dlls/x11drv    : winpos.c 
	dlls/user/tests: msg.c 

Log message:
	Don't call SetWindowPos in ShowWindow if a parent window is not
	visible, only toggle the WS_VISIBLE flag.

Patch: http://cvs.winehq.org/patch.py?id=21187

Old revision  New revision  Changes     Path
 1.140         1.141         +15 -5      wine/dlls/x11drv/winpos.c
 1.100         1.101         +17 -4      wine/dlls/user/tests/msg.c

Index: wine/dlls/x11drv/winpos.c
diff -u -p wine/dlls/x11drv/winpos.c:1.140 wine/dlls/x11drv/winpos.c:1.141
--- wine/dlls/x11drv/winpos.c:1.140	9 Nov 2005 10:35:48 -0000
+++ wine/dlls/x11drv/winpos.c	9 Nov 2005 10:35:48 -0000
@@ -1003,12 +1003,22 @@ BOOL X11DRV_ShowWindow( HWND hwnd, INT c
         if (!IsWindow( hwnd )) return wasVisible;
     }
 
-    /* ShowWindow won't activate a not being maximized child window */
-    if ((style & WS_CHILD) && cmd != SW_MAXIMIZE)
-        swp |= SWP_NOACTIVATE | SWP_NOZORDER;
+    if (!IsWindowVisible( GetAncestor( hwnd, GA_PARENT )))
+    {
+        /* if parent is not visible simply toggle WS_VISIBLE and return */
+        if (showFlag) WIN_SetStyle( hwnd, WS_VISIBLE, 0 );
+        else WIN_SetStyle( hwnd, 0, WS_VISIBLE );
+    }
+    else
+    {
+        /* ShowWindow won't activate a not being maximized child window */
+        if ((style & WS_CHILD) && cmd != SW_MAXIMIZE)
+            swp |= SWP_NOACTIVATE | SWP_NOZORDER;
+
+        SetWindowPos( hwnd, HWND_TOP, newPos.left, newPos.top,
+                      newPos.right, newPos.bottom, LOWORD(swp) );
+    }
 
-    SetWindowPos( hwnd, HWND_TOP, newPos.left, newPos.top,
-                  newPos.right, newPos.bottom, LOWORD(swp) );
     if (cmd == SW_HIDE)
     {
         HWND hFocus;
Index: wine/dlls/user/tests/msg.c
diff -u -p wine/dlls/user/tests/msg.c:1.100 wine/dlls/user/tests/msg.c:1.101
--- wine/dlls/user/tests/msg.c:1.100	9 Nov 2005 10:35:48 -0000
+++ wine/dlls/user/tests/msg.c	9 Nov 2005 10:35:48 -0000
@@ -543,6 +543,15 @@ static const struct message WmDestroyChi
     { WM_NCDESTROY, sent },
     { 0 }
 };
+/* DestroyWindow for a visible child window with invisible parent */
+static const struct message WmDestroyInvisibleChildSeq[] = {
+    { HCBT_DESTROYWND, hook },
+    { WM_PARENTNOTIFY, sent|parent|wparam, WM_DESTROY },
+    { WM_SHOWWINDOW, sent|wparam, 0 },
+    { WM_DESTROY, sent },
+    { WM_NCDESTROY, sent },
+    { 0 }
+};
 /* Moving the mouse in nonclient area */
 static const struct message WmMouseMoveInNonClientAreaSeq[] = { /* FIXME: add */
     { WM_NCHITTEST, sent },
@@ -2855,14 +2864,14 @@ static void test_showwindow(void)
     /* ShowWindow(SW_SHOWNA) with child and parent invisible */ 
     trace("calling ShowWindow( SW_SHOWNA) for invisible child with invisible parent\n");
     ok( ShowWindow(hchild, SW_SHOWNA) == FALSE, "ShowWindow: window was visible\n" );
-    ok_sequence(WmSHOWNAChildInvisParInvis, "ShowWindow(SW_SHOWNA) invisible child and parent", TRUE);
+    ok_sequence(WmSHOWNAChildInvisParInvis, "ShowWindow(SW_SHOWNA) invisible child and parent", FALSE);
     trace("done\n");
     /* ShowWindow(SW_SHOWNA) with child visible and parent invisible */ 
     ok( ShowWindow(hchild, SW_SHOW) != FALSE, "ShowWindow: window was invisible\n" );
     flush_sequence();
     trace("calling ShowWindow( SW_SHOWNA) for the visible child and invisible parent\n");
     ok( ShowWindow(hchild, SW_SHOWNA) != FALSE, "ShowWindow: window was invisible\n" );
-    ok_sequence(WmSHOWNAChildVisParInvis, "ShowWindow(SW_SHOWNA) visible child and invisible parent", TRUE);
+    ok_sequence(WmSHOWNAChildVisParInvis, "ShowWindow(SW_SHOWNA) visible child and invisible parent", FALSE);
     trace("done\n");
     /* ShowWindow(SW_SHOWNA) with child visible and parent visible */
     ShowWindow( hwnd, SW_SHOW);
@@ -3176,12 +3185,12 @@ static void test_messages(void)
     ok_sequence(WmCreateChildSeq, "CreateWindow:child", FALSE);
 
     ShowWindow( hchild, SW_SHOW );
-    ok_sequence(WmShowChildInvisibleParentSeq, "ShowWindow:show child with invisible parent", TRUE);
+    ok_sequence(WmShowChildInvisibleParentSeq, "ShowWindow:show child with invisible parent", FALSE);
     ok(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE, "WS_VISIBLE should be set\n");
     ok(!IsWindowVisible(hchild), "IsWindowVisible() should return FALSE\n");
 
     ShowWindow( hchild, SW_HIDE );
-    ok_sequence(WmHideChildInvisibleParentSeq, "ShowWindow:hide child with invisible parent", TRUE);
+    ok_sequence(WmHideChildInvisibleParentSeq, "ShowWindow:hide child with invisible parent", FALSE);
     ok(!(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE), "WS_VISIBLE should be not set\n");
     ok(!IsWindowVisible(hchild), "IsWindowVisible() should return FALSE\n");
 
@@ -3195,7 +3204,11 @@ static void test_messages(void)
     ok(!(GetWindowLongA(hchild, GWL_STYLE) & WS_VISIBLE), "WS_VISIBLE should not be set\n");
     ok(!IsWindowVisible(hchild), "IsWindowVisible() should return FALSE\n");
 
+    SetWindowPos(hchild, 0,0,0,0,0, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER);
+    flush_sequence();
     DestroyWindow(hchild);
+    ok_sequence(WmDestroyInvisibleChildSeq, "DestroyInvisibleChildSeq", FALSE);
+
     DestroyWindow(hparent);
     flush_sequence();
 



More information about the wine-cvs mailing list