From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/input.c | 48 +++++++++++++++++------------------- dlls/win32u/sysparams.c | 17 ++++++++++--- dlls/win32u/win32u_private.h | 2 +- dlls/win32u/window.c | 16 ++++-------- 4 files changed, 42 insertions(+), 41 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 0324909c954..9a4ee0e25a1 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -706,22 +706,19 @@ UINT WINAPI NtUserSendInput( UINT count, INPUT *inputs, int size ) */ BOOL WINAPI NtUserSetCursorPos( INT x, INT y ) { - POINT pt = { x, y }; + RECT rect = {x, y, x, y}; BOOL ret; INT prev_x, prev_y, new_x, new_y; UINT dpi;
- if ((dpi = get_thread_dpi())) - { - HMONITOR monitor = monitor_from_point( pt, MONITOR_DEFAULTTOPRIMARY, get_thread_dpi() ); - pt = map_dpi_point( pt, dpi, get_monitor_dpi( monitor )); - } + dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); + rect = map_dpi_rect( rect, get_thread_dpi(), dpi );
SERVER_START_REQ( set_cursor ) { req->flags = SET_CURSOR_POS; - req->x = pt.x; - req->y = pt.y; + req->x = rect.left; + req->y = rect.top; if ((ret = !wine_server_call( req ))) { prev_x = reply->prev_x; @@ -742,9 +739,10 @@ BOOL get_cursor_pos( POINT *pt ) { struct object_lock lock = OBJECT_LOCK_INIT; const desktop_shm_t *desktop_shm; - BOOL ret; + BOOL ret = TRUE; DWORD last_change = 0; NTSTATUS status; + RECT rect; UINT dpi;
if (!pt) return FALSE; @@ -755,15 +753,16 @@ BOOL get_cursor_pos( POINT *pt ) pt->y = desktop_shm->cursor.y; last_change = desktop_shm->cursor.last_change; } - ret = !status; + if (status) return FALSE;
/* query new position from graphics driver if we haven't updated recently */ - if (ret && NtGetTickCount() - last_change > 100) ret = user_driver->pGetCursorPos( pt ); - if (ret && (dpi = get_thread_dpi())) - { - HMONITOR monitor = monitor_from_point( *pt, MONITOR_DEFAULTTOPRIMARY, 0 ); - *pt = map_dpi_point( *pt, get_monitor_dpi( monitor ), dpi ); - } + if (NtGetTickCount() - last_change > 100) ret = user_driver->pGetCursorPos( pt ); + if (ret) return FALSE; + + SetRect( &rect, pt->x, pt->y, pt->x, pt->y ); + dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); + rect = map_dpi_rect( rect, dpi, get_thread_dpi() ); + *pt = *(POINT *)&rect.left; return ret; }
@@ -2619,8 +2618,10 @@ BOOL get_clip_cursor( RECT *rect, UINT dpi )
if (!status) { - HMONITOR monitor = monitor_from_rect( rect, MONITOR_DEFAULTTOPRIMARY, 0 ); - *rect = map_dpi_rect( *rect, get_monitor_dpi( monitor ), dpi ); + UINT ctx = set_thread_dpi_awareness_context( NTUSER_DPI_PER_MONITOR_AWARE ); + UINT dpi_from = monitor_dpi_from_rect( *rect, get_thread_dpi() ); + *rect = map_dpi_rect( *rect, dpi_from, dpi ); + set_thread_dpi_awareness_context( ctx ); } return !status; } @@ -2666,7 +2667,7 @@ BOOL process_wine_clipcursor( HWND hwnd, UINT flags, BOOL reset ) */ BOOL WINAPI NtUserClipCursor( const RECT *rect ) { - UINT dpi; + UINT dpi_from = get_thread_dpi(), dpi_to; BOOL ret; RECT new_rect;
@@ -2675,12 +2676,9 @@ BOOL WINAPI NtUserClipCursor( const 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; - } + dpi_to = monitor_dpi_from_rect( *rect, dpi_from ); + new_rect = map_dpi_rect( *rect, dpi_from, dpi_to ); + rect = &new_rect; }
SERVER_START_REQ( set_cursor ) diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 481c568ce02..e16e8869b40 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2231,10 +2231,7 @@ static struct monitor *get_monitor_from_handle( HMONITOR handle ) return NULL; }
-/********************************************************************** - * get_monitor_dpi - */ -UINT get_monitor_dpi( HMONITOR handle ) +static UINT get_monitor_dpi( HMONITOR handle ) { struct monitor *monitor; UINT dpi = system_dpi; @@ -3813,6 +3810,18 @@ HMONITOR monitor_from_point( POINT pt, UINT flags, UINT dpi ) return monitor_from_rect( &rect, flags, dpi ); }
+UINT monitor_dpi_from_rect( RECT rect, UINT dpi ) +{ + struct monitor *monitor; + UINT ret = system_dpi; + + if (!lock_display_devices()) return 0; + if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi ))) ret = monitor_get_dpi( monitor ); + unlock_display_devices(); + + return ret; +} + /* see MonitorFromWindow */ HMONITOR monitor_from_window( HWND hwnd, UINT flags, UINT dpi ) { diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index f7d869d1feb..fff5004c950 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -167,7 +167,6 @@ extern LONG get_char_dimensions( HDC hdc, TEXTMETRICW *metric, int *height ); extern HBITMAP get_display_bitmap(void); extern INT get_display_depth( UNICODE_STRING *name ); extern RECT get_display_rect( const WCHAR *display ); -extern UINT get_monitor_dpi( HMONITOR monitor ); extern BOOL get_monitor_info( HMONITOR handle, MONITORINFO *info, UINT dpi ); extern UINT get_win_monitor_dpi( HWND hwnd ); extern RECT get_primary_monitor_rect( UINT dpi ); @@ -193,6 +192,7 @@ extern RECT rect_thread_to_win_dpi( HWND hwnd, RECT rect ); extern HMONITOR monitor_from_point( POINT pt, UINT flags, UINT dpi ); extern HMONITOR monitor_from_rect( const RECT *rect, UINT flags, UINT dpi ); extern HMONITOR monitor_from_window( HWND hwnd, UINT flags, UINT dpi ); +extern UINT monitor_dpi_from_rect( RECT rect, UINT dpi ); extern BOOL update_display_cache( BOOL force ); extern void user_lock(void); extern void user_unlock(void); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 4d5e57d3710..88bf35ccb8e 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -903,8 +903,8 @@ UINT get_dpi_for_window( HWND hwnd ) } if (win == WND_DESKTOP) { - POINT pt = { 0, 0 }; - return get_monitor_dpi( monitor_from_point( pt, MONITOR_DEFAULTTOPRIMARY, 0 )); + RECT rect = {0}; + return monitor_dpi_from_rect( rect, get_thread_dpi() ); } if (win != WND_OTHER_PROCESS) { @@ -1899,12 +1899,10 @@ static struct window_surface *get_window_surface( HWND hwnd, UINT swp_flags, BOO struct window_surface *new_surface; struct window_rects monitor_rects; UINT monitor_dpi, style, ex_style; - HMONITOR monitor; RECT dummy; HRGN shape;
- monitor = monitor_from_rect( &rects->window, MONITOR_DEFAULTTONEAREST, get_thread_dpi() ); - monitor_dpi = get_monitor_dpi( monitor ); + monitor_dpi = monitor_dpi_from_rect( rects->window, get_thread_dpi() );
style = NtUserGetWindowLongW( hwnd, GWL_STYLE ); ex_style = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ); @@ -1977,7 +1975,6 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru struct window_rects old_rects; RECT extra_rects[3]; struct window_surface *old_surface; - HMONITOR monitor; UINT monitor_dpi;
is_layered = new_surface && new_surface->alpha_mask; @@ -1998,9 +1995,7 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru valid_rects = NULL; }
- monitor = monitor_from_rect( &new_rects->window, MONITOR_DEFAULTTONEAREST, get_thread_dpi() ); - monitor_dpi = get_monitor_dpi( monitor ); - + monitor_dpi = monitor_dpi_from_rect( new_rects->window, get_thread_dpi() ); monitor_rects = map_dpi_window_rects( *new_rects, get_thread_dpi(), monitor_dpi );
SERVER_START_REQ( set_window_pos ) @@ -5354,8 +5349,7 @@ static void map_dpi_create_struct( CREATESTRUCTW *cs, UINT dpi_to )
if (!dpi_from || !dpi_to) { - POINT pt = { cs->x, cs->y }; - UINT mon_dpi = get_monitor_dpi( monitor_from_point( pt, MONITOR_DEFAULTTONEAREST, dpi_from )); + UINT mon_dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); if (!dpi_from) dpi_from = mon_dpi; else dpi_to = mon_dpi; }