Alexandre Julliard : user32: SetWindowRgn should call SetWindowPos, not RedrawWindow.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Oct 31 05:43:04 CST 2006


Module: wine
Branch: master
Commit: 93825eab3e0938f65e9bdcc14519a05cc3def4a4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=93825eab3e0938f65e9bdcc14519a05cc3def4a4

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 30 17:43:38 2006 +0100

user32: SetWindowRgn should call SetWindowPos, not RedrawWindow.

---

 dlls/user/tests/msg.c |   68 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/user/winpos.c    |    8 +++++-
 2 files changed, 75 insertions(+), 1 deletions(-)

diff --git a/dlls/user/tests/msg.c b/dlls/user/tests/msg.c
index 14a7bdd..6149170 100644
--- a/dlls/user/tests/msg.c
+++ b/dlls/user/tests/msg.c
@@ -7996,6 +7996,73 @@ #undef track_query
 #undef track_hover_cancel
 }
 
+
+static const struct message WmSetWindowRgn[] = {
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE },
+    { WM_NCCALCSIZE, sent|wparam, 1 },
+    { WM_NCPAINT, sent }, /* wparam != 1 */
+    { WM_GETTEXT, sent|defwinproc|optional },
+    { WM_ERASEBKGND, sent|optional }, /* FIXME: remove optional once Wine is fixed */
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE },
+    { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 },
+    { 0 }
+};
+
+static const struct message WmSetWindowRgn_no_redraw[] = {
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW },
+    { WM_NCCALCSIZE, sent|wparam, 1 },
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW },
+    { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 },
+    { 0 }
+};
+
+static const struct message WmSetWindowRgn_clear[] = {
+    { WM_WINDOWPOSCHANGING, sent|wparam, SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE },
+    { WM_NCCALCSIZE, sent|wparam, 1 },
+    { WM_NCPAINT, sent }, /* wparam != 1 */
+    { WM_GETTEXT, sent|defwinproc|optional },
+    { WM_ERASEBKGND, sent|optional }, /* FIXME: remove optional once Wine is fixed */
+    { WM_WINDOWPOSCHANGED, sent|wparam, SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE|SWP_NOACTIVATE|SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE },
+    { WM_NCCALCSIZE, sent|wparam|optional, 1 },
+    { WM_NCPAINT, sent|optional }, /* wparam != 1 */
+    { WM_GETTEXT, sent|defwinproc|optional },
+    { WM_ERASEBKGND, sent|optional },
+    { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 },
+    { EVENT_OBJECT_LOCATIONCHANGE, winevent_hook|wparam|lparam, 0, 0 },
+    { 0 }
+};
+
+static void test_SetWindowRgn(void)
+{
+    HRGN hrgn;
+    HWND hwnd = CreateWindowExA(0, "TestWindowClass", "Test overlapped", WS_OVERLAPPEDWINDOW,
+                                100, 100, 200, 200, 0, 0, 0, NULL);
+    ok( hwnd != 0, "Failed to create overlapped window\n" );
+
+    ShowWindow( hwnd, SW_SHOW );
+    UpdateWindow( hwnd );
+    flush_events();
+    flush_sequence();
+
+    trace("testing SetWindowRgn\n");
+    hrgn = CreateRectRgn( 0, 0, 150, 150 );
+    SetWindowRgn( hwnd, hrgn, TRUE );
+    ok_sequence( WmSetWindowRgn, "WmSetWindowRgn", FALSE );
+
+    hrgn = CreateRectRgn( 30, 30, 160, 160 );
+    SetWindowRgn( hwnd, hrgn, FALSE );
+    ok_sequence( WmSetWindowRgn_no_redraw, "WmSetWindowRgn_no_redraw", FALSE );
+
+    hrgn = CreateRectRgn( 0, 0, 180, 180 );
+    SetWindowRgn( hwnd, hrgn, TRUE );
+    ok_sequence( WmSetWindowRgn, "WmSetWindowRgn2", FALSE );
+
+    SetWindowRgn( hwnd, 0, TRUE );
+    ok_sequence( WmSetWindowRgn_clear, "WmSetWindowRgn_clear", FALSE );
+
+    DestroyWindow( hwnd );
+}
+
 START_TEST(msg)
 {
     BOOL ret;
@@ -8060,6 +8127,7 @@ #endif
     test_edit_messages();
     test_quit_message();
     test_TrackMouseEvent();
+    test_SetWindowRgn();
 
     UnhookWindowsHookEx(hCBT_hook);
     if (pUnhookWinEvent)
diff --git a/dlls/user/winpos.c b/dlls/user/winpos.c
index fbc99a2..55716ba 100644
--- a/dlls/user/winpos.c
+++ b/dlls/user/winpos.c
@@ -265,7 +265,13 @@ int WINAPI SetWindowRgn( HWND hwnd, HRGN
 
     if (ret) ret = USER_Driver->pSetWindowRgn( hwnd, hrgn, bRedraw );
 
-    if (ret && bRedraw) RedrawWindow( hwnd, NULL, 0, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE );
+    if (ret)
+    {
+        UINT swp_flags = SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED;
+        if (hrgn) swp_flags |= SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE;
+        if (!bRedraw) swp_flags |= SWP_NOREDRAW;
+        SetWindowPos( hwnd, 0, 0, 0, 0, 0, swp_flags );
+    }
     return ret;
 }
 




More information about the wine-cvs mailing list