Vitaliy Margolen : user32: ClipCursor should use virtual screen resolution for empty/invalid rects.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 14 14:24:07 CST 2006


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

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Thu Dec 14 10:33:51 2006 -0700

user32: ClipCursor should use virtual screen resolution for empty/invalid rects.

---

 dlls/user32/cursoricon.c    |   19 +++++++++++--------
 dlls/user32/tests/monitor.c |   27 +++++++++++++++++++++++++++
 dlls/winex11.drv/winpos.c   |    1 +
 3 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index f4d861b..7be797e 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -1558,8 +1558,16 @@ HCURSOR WINAPI GetCursor(void)
  */
 BOOL WINAPI ClipCursor( const RECT *rect )
 {
-    if (!rect) SetRectEmpty( &CURSOR_ClipRect );
-    else CopyRect( &CURSOR_ClipRect, rect );
+    RECT virt;
+
+    SetRect( &virt, 0, 0, GetSystemMetrics( SM_CXVIRTUALSCREEN ),
+                          GetSystemMetrics( SM_CYVIRTUALSCREEN ) );
+    OffsetRect( &virt, GetSystemMetrics( SM_XVIRTUALSCREEN ),
+                       GetSystemMetrics( SM_YVIRTUALSCREEN ) );
+
+    if (!IntersectRect( &CURSOR_ClipRect, &virt, rect ))
+        CURSOR_ClipRect = virt;
+
     return TRUE;
 }
 
@@ -1569,12 +1577,7 @@ BOOL WINAPI ClipCursor( const RECT *rect
  */
 BOOL WINAPI GetClipCursor( RECT *rect )
 {
-    if (rect)
-    {
-       CopyRect( rect, &CURSOR_ClipRect );
-       return TRUE;
-    }
-    return FALSE;
+    return CopyRect( rect, &CURSOR_ClipRect );
 }
 
 
diff --git a/dlls/user32/tests/monitor.c b/dlls/user32/tests/monitor.c
index 153a353..de91f44 100644
--- a/dlls/user32/tests/monitor.c
+++ b/dlls/user32/tests/monitor.c
@@ -141,6 +141,33 @@ static void test_ChangeDisplaySettingsEx
         dm.dmFields           = vid_modes_test[i].fields;
         res = ChangeDisplaySettingsEx(NULL, &dm, NULL, CDS_FULLSCREEN, NULL);
         ok(res == vid_modes_test[i].res, "Failed to change resolution[%d]: %d\n", i, res);
+
+        if (res == DISP_CHANGE_SUCCESSFUL)
+        {
+            RECT r, r1, virt;
+
+            SetRect(&virt, 0, 0, GetSystemMetrics(SM_CXVIRTUALSCREEN), GetSystemMetrics(SM_CYVIRTUALSCREEN));
+            OffsetRect(&virt, GetSystemMetrics(SM_XVIRTUALSCREEN), GetSystemMetrics(SM_YVIRTUALSCREEN));
+
+            /* Resolution change resets clip rect */
+            ok(GetClipCursor(&r), "GetClipCursor() failed\n");
+            ok(EqualRect(&r, &virt), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom);
+
+            ok(ClipCursor(NULL), "ClipCursor() failed\n");
+            ok(GetClipCursor(&r), "GetClipCursor() failed\n");
+            ok(EqualRect(&r, &virt), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom);
+
+            /* This should always work. Primary monitor is at (0,0) */
+            SetRect(&r1, 10, 10, 20, 20);
+            ok(ClipCursor(&r1), "ClipCursor() failed\n");
+            ok(GetClipCursor(&r), "GetClipCursor() failed\n");
+            ok(EqualRect(&r, &r1), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom);
+
+            SetRect(&r1, virt.left - 10, virt.top - 10, virt.right + 20, virt.bottom + 20);
+            ok(ClipCursor(&r1), "ClipCursor() failed\n");
+            ok(GetClipCursor(&r), "GetClipCursor() failed\n");
+            ok(EqualRect(&r, &virt), "Invalid clip rect: (%d %d) x (%d %d)\n", r.left, r.top, r.right, r.bottom);
+        }
     }
     res = ChangeDisplaySettingsEx(NULL, NULL, NULL, CDS_RESET, NULL);
     ok(res == DISP_CHANGE_SUCCESSFUL, "Failed to reset default resolution: %d\n", res);
diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c
index 5a88a74..6d04769 100644
--- a/dlls/winex11.drv/winpos.c
+++ b/dlls/winex11.drv/winpos.c
@@ -843,6 +843,7 @@ void X11DRV_handle_desktop_resize( unsig
     X11DRV_SetWindowPos( hwnd, 0, &virtual_screen_rect, &virtual_screen_rect,
                            SWP_NOZORDER|SWP_NOMOVE, NULL );
     data->lock_changes--;
+    ClipCursor(NULL);
     SendMessageTimeoutW( HWND_BROADCAST, WM_DISPLAYCHANGE, screen_depth,
                          MAKELPARAM( width, height ), SMTO_ABORTIFHUNG, 2000, NULL );
 




More information about the wine-cvs mailing list