x11drv: Try2: ShowWindow(SW_MAXIMIZE) should ignore WS_MAXIMIZE [bug1735]

Vitaliy Margolen wine-patch at kievinfo.com
Sun Oct 16 16:35:41 CDT 2005


Patch haven't really changed. The only difference is that CreateWindow calls
ShowWindow(,SW_SHOW) instead. This will remove extra calls associated with
GetMinMaxInfo.
Also updated tests for extra wine's messages.

With some tests to show the correct behavior. This causing problems when window
is created with WS_MAXIMIZED state set, but had it's size changed before call
ShowWindow. This affects Delphi programs that read their design time state from
the resources. Which most of the time doesn't have correct maximized size.

Vitaliy Margolen

changelog:
  x11drv:
  - ShowWindow(SW_MAXIMIZE) should ignore window's maximized state.
-------------- next part --------------
Index: dlls/user/win.c
===================================================================
RCS file: /home/wine/wine/dlls/user/win.c,v
retrieving revision 1.20
diff -u -p -r1.20 win.c
--- dlls/user/win.c	3 Oct 2005 18:48:36 -0000	1.20
+++ dlls/user/win.c	16 Oct 2005 20:44:31 -0000
@@ -1062,7 +1062,7 @@ static HWND WIN_CreateWindowEx( CREATEST
     if (cs->style & WS_VISIBLE)
     {
         if (cs->style & WS_MAXIMIZE)
-            sw = SW_SHOWMAXIMIZED;
+            sw = SW_SHOW;
         else if (cs->style & WS_MINIMIZE)
             sw = SW_SHOWMINIMIZED;
 
Index: dlls/x11drv/winpos.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/winpos.c,v
retrieving revision 1.139
diff -u -p -r1.139 winpos.c
--- dlls/x11drv/winpos.c	28 Sep 2005 15:13:10 -0000	1.139
+++ dlls/x11drv/winpos.c	16 Oct 2005 20:44:32 -0000
@@ -966,9 +966,7 @@ BOOL X11DRV_ShowWindow( HWND hwnd, INT c
 
 	case SW_SHOWMAXIMIZED: /* same as SW_MAXIMIZE */
             swp |= SWP_SHOWWINDOW | SWP_FRAMECHANGED;
-            if( !(style & WS_MAXIMIZE) )
-		 swp |= WINPOS_MinMaximize( hwnd, SW_MAXIMIZE, &newPos );
-            else swp |= SWP_NOSIZE | SWP_NOMOVE;
+            swp |= WINPOS_MinMaximize( hwnd, SW_MAXIMIZE, &newPos );
             break;
 
 	case SW_SHOWNA:
Index: dlls/user/tests/msg.c
===================================================================
RCS file: /home/wine/wine/dlls/user/tests/msg.c,v
retrieving revision 1.93
diff -u -p -r1.93 msg.c
--- dlls/user/tests/msg.c	28 Sep 2005 18:11:10 -0000	1.93
+++ dlls/user/tests/msg.c	16 Oct 2005 20:44:31 -0000
@@ -343,6 +343,99 @@ static const struct message WmDestroyOve
     { WM_NCDESTROY, sent },
     { 0 }
 };
+/* CreateWindow(WS_MAXIMAZE|WS_VISIBLE) for popup window */
+static const struct message WmCreateMaxPopupSeq[] = {
+    { HCBT_CREATEWND, hook },
+    { WM_NCCREATE, sent },
+    { WM_NCCALCSIZE, sent|wparam, 0 },
+    { WM_CREATE, sent },
+    { WM_SIZE, sent },
+    { WM_MOVE, sent },
+    { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE },
+    { WM_GETMINMAXINFO, sent },
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE|SWP_FRAMECHANGED|0x8000 },
+    { WM_NCCALCSIZE, sent|wparam, TRUE },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOREDRAW|SWP_NOZORDER|0x8000  },
+    { WM_MOVE, sent|defwinproc },
+    { WM_SIZE, sent|defwinproc },
+    { WM_SHOWWINDOW, sent|wparam, 1 },
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE },
+    { HCBT_ACTIVATE, hook },
+    { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 },
+    /* Wine does not send this message for focus changes */
+    { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE },
+    { WM_ACTIVATEAPP, sent|wparam, 1 },
+    { WM_NCACTIVATE, sent|wparam, 1 },
+    { WM_ACTIVATE, sent|wparam, 1 },
+    { HCBT_SETFOCUS, hook },
+    { WM_SETFOCUS, sent|wparam|defwinproc, 0 },
+    { WM_SYNCPAINT, sent|wparam|optional, 4 },
+    { WM_NCPAINT, sent|wparam|defwinproc|optional, 1 },
+    { WM_ERASEBKGND, sent|defwinproc|optional },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTMOVE|SWP_NOCLIENTSIZE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOZORDER|SWP_NOSIZE },
+    { 0 }
+};
+/* CreateWindow(WS_MAXIMAZE) for popup window, not initially visible */
+static const struct message WmCreateInvisibleMaxPopupSeq[] = {
+    { HCBT_CREATEWND, hook },
+    { WM_NCCREATE, sent },
+    { WM_NCCALCSIZE, sent|wparam, 0 },
+    { WM_CREATE, sent },
+    { WM_SIZE, sent },
+    { WM_MOVE, sent },
+    { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE },
+    { WM_GETMINMAXINFO, sent },
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE|SWP_FRAMECHANGED|0x8000 },
+    { WM_NCCALCSIZE, sent|wparam, TRUE },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOREDRAW|SWP_NOZORDER|0x8000  },
+    { WM_MOVE, sent|defwinproc },
+    { WM_SIZE, sent|defwinproc },
+    { 0 }
+};
+/* ShowWindow(SW_SHOWMAXIMIZED) for a resized not visible popup window */
+static const struct message WmShowMaxPopupResizedSeq[] = {
+    { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE },
+    { WM_GETMINMAXINFO, sent },
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED },
+    { WM_NCCALCSIZE, sent|wparam, TRUE },
+    { HCBT_ACTIVATE, hook },
+    { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 },
+    /* Wine does not send this message for focus changes */
+    { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE },
+    { WM_ACTIVATEAPP, sent|wparam, 1 },
+    { WM_NCACTIVATE, sent|wparam, 1 },
+    { WM_ACTIVATE, sent|wparam, 1 },
+    { HCBT_SETFOCUS, hook },
+    { WM_SETFOCUS, sent|wparam|defwinproc, 0 },
+    { WM_NCPAINT, sent|wparam|optional, 1 },
+    { WM_ERASEBKGND, sent|optional },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTMOVE|SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOZORDER },
+    /* WinNT4.0 sends WM_MOVE */
+    { WM_MOVE, sent|defwinproc|optional },
+    { WM_SIZE, sent|defwinproc },
+    { 0 }
+};
+/* ShowWindow(SW_SHOWMAXIMIZED) for a not visible popup window */
+static const struct message WmShowMaxPopupSeq[] = {
+    { HCBT_MINMAX, hook|lparam, 0, SW_MAXIMIZE },
+    { WM_GETMINMAXINFO, sent },
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_SHOWWINDOW|SWP_FRAMECHANGED },
+    { WM_NCCALCSIZE, sent|wparam, TRUE },
+    { HCBT_ACTIVATE, hook },
+    { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 },
+    /* Wine does not send this message for focus changes */
+    { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_NOSIZE|SWP_NOMOVE },
+    { WM_ACTIVATEAPP, sent|wparam, 1 },
+    { WM_NCACTIVATE, sent|wparam, 1 },
+    { WM_ACTIVATE, sent|wparam, 1 },
+    { HCBT_SETFOCUS, hook },
+    { WM_SETFOCUS, sent|wparam|defwinproc, 0 },
+    { WM_SYNCPAINT, sent|wparam|optional, 4 },
+    { WM_NCPAINT, sent|wparam|defwinproc|optional, 1 },
+    { WM_ERASEBKGND, sent|defwinproc|optional },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_SHOWWINDOW|SWP_FRAMECHANGED|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER },
+    { 0 }
+};
 /* CreateWindow (for a child popup window, not initially visible) */
 static const struct message WmCreateChildPopupSeq[] = {
     { HCBT_CREATEWND, hook },
@@ -2824,6 +2917,7 @@ static void test_scroll_messages(HWND hw
 static void test_showwindow(void)
 {
     HWND hwnd, hchild;
+    RECT rc;
 
     hwnd = CreateWindowExA(0, "TestWindowClass", "Test overlapped", WS_OVERLAPPEDWINDOW,
                            100, 100, 200, 200, 0, 0, 0, NULL);
@@ -2883,6 +2977,73 @@ static void test_showwindow(void)
 
     DestroyWindow(hwnd);
     flush_sequence();
+
+    /* Now onto popup windows */
+    /* Test 1:
+     * 1. Create invisible maximized popup window.
+     * 2. Move and resize it.
+     * 3. Show it maximized.
+     */
+    trace("calling CreateWindowExA( WS_MAXIMIZE ) for invisible maximized popup window\n");
+    hwnd = CreateWindowExA(0, "TestWindowClass", "Test popup", WS_POPUP | WS_MAXIMIZE,
+                           100, 100, 200, 200, 0, 0, 0, NULL);
+    ok (hwnd != 0, "Failed to create popup window\n");
+    todo_wine ok_sequence(WmCreateInvisibleMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", TRUE);
+    trace("done\n");
+
+    GetWindowRect(hwnd, &rc);
+    ok( rc.right-rc.left == GetSystemMetrics(SM_CXSCREEN) &&
+        rc.bottom-rc.top == GetSystemMetrics(SM_CYSCREEN),
+        "Invalid maximized size before ShowWindow (%ld,%ld)-(%ld,%ld)\n",
+        rc.left, rc.top, rc.right, rc.bottom);
+    /* Reset window's size & position */
+    SetWindowPos(hwnd, 0, 10, 10, 200, 200, SWP_NOZORDER | SWP_NOACTIVATE);
+    flush_sequence();
+
+    trace("calling ShowWindow( SW_SHOWMAXIMIZE ) for invisible popup window\n");
+    ShowWindow(hwnd, SW_SHOWMAXIMIZED);
+    todo_wine ok_sequence(WmShowMaxPopupResizedSeq, "ShowWindow(SW_SHOWMAXIMIZED):popup", TRUE);
+    trace("done\n");
+
+    GetWindowRect(hwnd, &rc);
+    todo_wine ok( rc.right-rc.left == GetSystemMetrics(SM_CXSCREEN) &&
+        rc.bottom-rc.top == GetSystemMetrics(SM_CYSCREEN),
+        "Invalid maximized size after ShowWindow (%ld,%ld)-(%ld,%ld)\n",
+        rc.left, rc.top, rc.right, rc.bottom);
+    DestroyWindow(hwnd);
+    flush_sequence();
+
+    /* Test 2:
+     * 1. Create invisible maximized popup window.
+     * 2. Show it maximized.
+     */
+    trace("calling CreateWindowExA( WS_MAXIMIZE ) for invisible maximized popup window\n");
+    hwnd = CreateWindowExA(0, "TestWindowClass", "Test popup", WS_POPUP | WS_MAXIMIZE,
+                           100, 100, 200, 200, 0, 0, 0, NULL);
+    ok (hwnd != 0, "Failed to create popup window\n");
+    todo_wine ok_sequence(WmCreateInvisibleMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", TRUE);
+    trace("done\n");
+
+    trace("calling ShowWindow( SW_SHOWMAXIMIZE ) for invisible popup window\n");
+    ShowWindow(hwnd, SW_SHOWMAXIMIZED);
+    todo_wine ok_sequence(WmShowMaxPopupSeq, "ShowWindow(SW_SHOWMAXIMIZED):popup", TRUE);
+    trace("done\n");
+    DestroyWindow(hwnd);
+    flush_sequence();
+
+    /* Test 3:
+     * 1. Create visible maximized popup window.
+     * 2. Move and resize it.
+     * 3. Show it maximized.
+     */
+    trace("calling CreateWindowExA( WS_MAXIMIZE ) for maximized popup window\n");
+    hwnd = CreateWindowExA(0, "TestWindowClass", "Test popup", WS_POPUP | WS_MAXIMIZE | WS_VISIBLE,
+                           100, 100, 200, 200, 0, 0, 0, NULL);
+    ok (hwnd != 0, "Failed to create popup window\n");
+    todo_wine ok_sequence(WmCreateMaxPopupSeq, "CreateWindow(WS_MAXIMIZED):popup", TRUE);
+    trace("done\n");
+    DestroyWindow(hwnd);
+    flush_sequence();
 }
 
 static void test_sys_menu(HWND hwnd)


More information about the wine-patches mailing list