From 91c095cd46fa5158764b5d70c02196f45bf8271c Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 14 Feb 2022 14:07:25 +0100 Subject: [PATCH] win32u: Move NtUserClipCursor implementation from user32. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/user32/cursoricon.c | 49 ------------------------------------ dlls/user32/user32.spec | 2 +- dlls/user32/winpos.c | 2 +- dlls/win32u/cursoricon.c | 48 +++++++++++++++++++++++++++++++++++ dlls/win32u/driver.c | 6 +++++ dlls/win32u/gdiobj.c | 1 + dlls/win32u/sysparams.c | 6 ++--- dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 5 ++++ dlls/win32u/wrappers.c | 6 +++++ include/ntuser.h | 1 + 11 files changed, 73 insertions(+), 55 deletions(-) diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c index d163d1a7360..32c04852bf9 100644 --- a/dlls/user32/cursoricon.c +++ b/dlls/user32/cursoricon.c @@ -1942,55 +1942,6 @@ HCURSOR WINAPI DECLSPEC_HOTPATCH SetCursor( HCURSOR hCursor /* [in] Handle of cu } -/*********************************************************************** - * ClipCursor (USER32.@) - */ -BOOL WINAPI DECLSPEC_HOTPATCH ClipCursor( const RECT *rect ) -{ - UINT dpi; - BOOL ret; - RECT new_rect; - - TRACE( "Clipping to %s\n", wine_dbgstr_rect(rect) ); - - if (rect) - { - if (rect->left > rect->right || rect->top > rect->bottom) return FALSE; - if ((dpi = get_thread_dpi())) - { - new_rect = map_dpi_rect( *rect, dpi, - get_monitor_dpi( MonitorFromRect( rect, MONITOR_DEFAULTTOPRIMARY ))); - rect = &new_rect; - } - } - - SERVER_START_REQ( set_cursor ) - { - req->clip_msg = WM_WINE_CLIPCURSOR; - if (rect) - { - req->flags = SET_CURSOR_CLIP; - req->clip.left = rect->left; - req->clip.top = rect->top; - req->clip.right = rect->right; - req->clip.bottom = rect->bottom; - } - else req->flags = SET_CURSOR_NOCLIP; - - if ((ret = !wine_server_call( req ))) - { - new_rect.left = reply->new_clip.left; - new_rect.top = reply->new_clip.top; - new_rect.right = reply->new_clip.right; - new_rect.bottom = reply->new_clip.bottom; - } - } - SERVER_END_REQ; - if (ret) USER_Driver->pClipCursor( &new_rect ); - return ret; -} - - /*********************************************************************** * GetClipCursor (USER32.@) */ diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index c963dbaaee1..c8484d0e362 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -72,7 +72,7 @@ @ stub ClientThreadConnect @ stub ClientThreadSetup @ stdcall ClientToScreen(long ptr) -@ stdcall ClipCursor(ptr) +@ stdcall -import ClipCursor(ptr) NtUserClipCursor @ stdcall CloseClipboard() @ stdcall CloseDesktop(long) NtUserCloseDesktop @ stdcall CloseTouchInputHandle(long) diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index ff23206b395..9f3303fecc0 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -2849,7 +2849,7 @@ void WINPOS_SysCommandSizeMove( HWND hwnd, WPARAM wParam ) pt.x = (short)LOWORD(dwPoint); pt.y = (short)HIWORD(dwPoint); capturePoint = pt; - ClipCursor( NULL ); + NtUserClipCursor( NULL ); TRACE("hwnd %p command %04lx, hittest %d, pos %d,%d\n", hwnd, syscommand, hittest, pt.x, pt.y); diff --git a/dlls/win32u/cursoricon.c b/dlls/win32u/cursoricon.c index ad7e51b507e..7b23dfb7d0b 100644 --- a/dlls/win32u/cursoricon.c +++ b/dlls/win32u/cursoricon.c @@ -79,3 +79,51 @@ HCURSOR WINAPI NtUserGetCursor(void) SERVER_END_REQ; return ret; } + +/*********************************************************************** + * NtUserClipCursor (win32u.@) + */ +BOOL WINAPI NtUserClipCursor( const RECT *rect ) +{ + UINT dpi; + BOOL ret; + RECT new_rect; + + TRACE( "Clipping to %s\n", wine_dbgstr_rect(rect) ); + + if (rect) + { + if (rect->left > rect->right || rect->top > rect->bottom) return FALSE; + if ((dpi = get_thread_dpi())) + { + HMONITOR monitor = monitor_from_rect( rect, MONITOR_DEFAULTTOPRIMARY, dpi ); + new_rect = map_dpi_rect( *rect, dpi, get_monitor_dpi( monitor )); + rect = &new_rect; + } + } + + SERVER_START_REQ( set_cursor ) + { + req->clip_msg = WM_WINE_CLIPCURSOR; + if (rect) + { + req->flags = SET_CURSOR_CLIP; + req->clip.left = rect->left; + req->clip.top = rect->top; + req->clip.right = rect->right; + req->clip.bottom = rect->bottom; + } + else req->flags = SET_CURSOR_NOCLIP; + + if ((ret = !wine_server_call( req ))) + { + new_rect.left = reply->new_clip.left; + new_rect.top = reply->new_clip.top; + new_rect.right = reply->new_clip.right; + new_rect.bottom = reply->new_clip.bottom; + } + } + SERVER_END_REQ; + if (ret) user_driver->pClipCursor( &new_rect ); + return ret; +} diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 39996086c6d..58c814556c6 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -1005,6 +1005,11 @@ static void CDECL loaderdrv_SetCursor( HCURSOR cursor ) load_driver()->pSetCursor( cursor ); } +static BOOL CDECL loaderdrv_ClipCursor( const RECT *clip ) +{ + return load_driver()->pClipCursor( clip ); +} + static void CDECL loaderdrv_UpdateClipboard(void) { load_driver()->pUpdateClipboard(); @@ -1034,6 +1039,7 @@ static const struct user_driver_funcs lazy_load_driver = .pEnumDisplaySettingsEx = loaderdrv_EnumDisplaySettingsEx, .pUpdateDisplayDevices = loaderdrv_UpdateDisplayDevices, .pSetCursor = loaderdrv_SetCursor, + .pClipCursor = loaderdrv_ClipCursor, .pUpdateClipboard = loaderdrv_UpdateClipboard, .pScrollDC = nulldrv_ScrollDC, .pSystemParametersInfo = nulldrv_SystemParametersInfo, diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 002c7539498..6a7bf2d6044 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1153,6 +1153,7 @@ static struct unix_funcs unix_funcs = NtUserCallOneParam, NtUserCallTwoParam, NtUserChangeDisplaySettings, + NtUserClipCursor, NtUserCountClipboardFormats, NtUserEnumDisplayDevices, NtUserEnumDisplayMonitors, diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 7123b0d95c8..d57203e330c 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1342,7 +1342,7 @@ void release_display_dc( HDC hdc ) /********************************************************************** * get_monitor_dpi */ -static UINT get_monitor_dpi( HMONITOR monitor ) +UINT get_monitor_dpi( HMONITOR monitor ) { /* FIXME: use the monitor DPI instead */ return system_dpi; @@ -1379,7 +1379,7 @@ static DPI_AWARENESS get_thread_dpi_awareness(void) /********************************************************************** * get_thread_dpi */ -static UINT get_thread_dpi(void) +UINT get_thread_dpi(void) { switch (get_thread_dpi_awareness()) { @@ -1936,7 +1936,7 @@ static BOOL get_monitor_info( HMONITOR handle, MONITORINFO *info ) return FALSE; } -static HMONITOR monitor_from_rect( const RECT *rect, DWORD flags, UINT dpi ) +HMONITOR monitor_from_rect( const RECT *rect, DWORD flags, UINT dpi ) { HMONITOR primary = 0, nearest = 0, ret = 0; UINT max_area = 0, min_distance = ~0u; diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 5ea2d3afc84..aa2ed8ab460 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -792,7 +792,7 @@ @ stub NtUserCheckWindowThreadDesktop @ stub NtUserChildWindowFromPointEx @ stub NtUserClearForeground -@ stub NtUserClipCursor +@ stdcall NtUserClipCursor(ptr) @ stub NtUserCloseClipboard @ stdcall -syscall NtUserCloseDesktop(long) @ stdcall -syscall NtUserCloseWindowStation(long) diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 9bce2b7207b..ee26d4af52a 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -196,6 +196,7 @@ struct unix_funcs ULONG_PTR (WINAPI *pNtUserCallTwoParam)( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ); LONG (WINAPI *pNtUserChangeDisplaySettings)( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ); + BOOL (WINAPI *pNtUserClipCursor)( const RECT *rect ); INT (WINAPI *pNtUserCountClipboardFormats)(void); NTSTATUS (WINAPI *pNtUserEnumDisplayDevices)( UNICODE_STRING *device, DWORD index, DISPLAY_DEVICEW *info, DWORD flags ); @@ -241,9 +242,13 @@ struct unix_funcs }; extern RECT get_display_rect( const WCHAR *display ) DECLSPEC_HIDDEN; +extern UINT get_monitor_dpi( HMONITOR monitor ) DECLSPEC_HIDDEN; extern UINT get_system_dpi(void) DECLSPEC_HIDDEN; extern int get_system_metrics( int index ) DECLSPEC_HIDDEN; +extern UINT get_thread_dpi(void) DECLSPEC_HIDDEN; extern RECT get_virtual_screen_rect( UINT dpi ) DECLSPEC_HIDDEN; +extern RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to ) DECLSPEC_HIDDEN; +extern HMONITOR monitor_from_rect( const RECT *rect, DWORD flags, UINT dpi ) DECLSPEC_HIDDEN; extern void wrappers_init( unixlib_handle_t handle ) DECLSPEC_HIDDEN; extern NTSTATUS gdi_init(void) DECLSPEC_HIDDEN; diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index aaabf51a2f8..9dcfed5b802 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -720,6 +720,12 @@ LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devm return unix_funcs->pNtUserChangeDisplaySettings( devname, devmode, hwnd, flags, lparam ); } +BOOL WINAPI NtUserClipCursor( const RECT *rect ) +{ + if (!unix_funcs) return FALSE; + return unix_funcs->pNtUserClipCursor( rect ); +} + INT WINAPI NtUserCountClipboardFormats(void) { if (!unix_funcs) return 0; diff --git a/include/ntuser.h b/include/ntuser.h index 89106f38628..b2aa11f90fd 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -131,6 +131,7 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ); ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ); LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ); +BOOL WINAPI NtUserClipCursor( const RECT *rect ); BOOL WINAPI NtUserCloseDesktop( HDESK handle ); BOOL WINAPI NtUserCloseWindowStation( HWINSTA handle ); INT WINAPI NtUserCountClipboardFormats(void);