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