From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/sysparams.c | 21 --------------------- dlls/user32/user32.spec | 2 +- dlls/win32u/syscall.c | 1 + dlls/win32u/sysparams.c | 21 +++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 8 ++++++++ include/ntuser.h | 1 + 8 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 46b85c0b102..285d7828c63 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -691,14 +691,6 @@ static POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ) return pt; }
-/********************************************************************** - * point_win_to_phys_dpi - */ -static POINT point_win_to_phys_dpi( HWND hwnd, POINT pt ) -{ - return map_dpi_point( pt, GetDpiForWindow( hwnd ), get_win_monitor_dpi( hwnd ) ); -} - /********************************************************************** * point_phys_to_win_dpi */ @@ -879,19 +871,6 @@ DPI_AWARENESS_CONTEXT WINAPI SetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT return ULongToHandle( prev ); }
-/********************************************************************** - * LogicalToPhysicalPointForPerMonitorDPI (USER32.@) - */ -BOOL WINAPI LogicalToPhysicalPointForPerMonitorDPI( HWND hwnd, POINT *pt ) -{ - RECT rect; - - if (!GetWindowRect( hwnd, &rect )) return FALSE; - if (pt->x < rect.left || pt->y < rect.top || pt->x > rect.right || pt->y > rect.bottom) return FALSE; - *pt = point_win_to_phys_dpi( hwnd, *pt ); - return TRUE; -} - /********************************************************************** * PhysicalToLogicalPointForPerMonitorDPI (USER32.@) */ diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 800dc4a9240..3a822aa380d 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -513,7 +513,7 @@ @ stdcall LockWindowUpdate(long) NtUserLockWindowUpdate @ stdcall LockWorkStation() @ stdcall LogicalToPhysicalPoint(long ptr) -@ stdcall LogicalToPhysicalPointForPerMonitorDPI(long ptr) +@ stdcall LogicalToPhysicalPointForPerMonitorDPI(long ptr) NtUserLogicalToPerMonitorDPIPhysicalPoint @ stdcall LookupIconIdFromDirectory(ptr long) @ stdcall LookupIconIdFromDirectoryEx(ptr long long long long) @ stub MBToWCSEx diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index 5f78d8c6ab9..7212f6df0b0 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -218,6 +218,7 @@ static void * const syscalls[] = NtUserIsClipboardFormatAvailable, NtUserKillTimer, NtUserLockWindowUpdate, + NtUserLogicalToPerMonitorDPIPhysicalPoint, NtUserMapVirtualKeyEx, NtUserMenuItemFromPoint, NtUserMessageCall, diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index be68a2cff32..defcaeb7f0e 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1720,6 +1720,14 @@ POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ) return pt; }
+/********************************************************************** + * point_win_to_phys_dpi + */ +static POINT point_win_to_phys_dpi( HWND hwnd, POINT pt ) +{ + return map_dpi_point( pt, get_dpi_for_window( hwnd ), get_win_monitor_dpi( hwnd ) ); +} + /********************************************************************** * point_phys_to_win_dpi */ @@ -2440,6 +2448,19 @@ BOOL WINAPI NtUserGetDpiForMonitor( HMONITOR monitor, UINT type, UINT *x, UINT * return TRUE; }
+/********************************************************************** + * LogicalToPhysicalPointForPerMonitorDPI (win32u.@) + */ +BOOL WINAPI NtUserLogicalToPerMonitorDPIPhysicalPoint( HWND hwnd, POINT *pt ) +{ + RECT rect; + + if (!get_window_rect( hwnd, &rect, get_thread_dpi() )) return FALSE; + if (pt->x < rect.left || pt->y < rect.top || pt->x > rect.right || pt->y > rect.bottom) return FALSE; + *pt = point_win_to_phys_dpi( hwnd, *pt ); + return TRUE; +} + /* retrieve the cached base keys for a given entry */ static BOOL get_base_keys( enum parameter_key index, HKEY *base_key, HKEY *volatile_key ) { diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 3054bed8347..d1339af9dcc 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -1067,7 +1067,7 @@ @ stub NtUserLockWindowStation @ stdcall -syscall NtUserLockWindowUpdate(long) @ stub NtUserLockWorkStation -@ stub NtUserLogicalToPerMonitorDPIPhysicalPoint +@ stdcall -syscall NtUserLogicalToPerMonitorDPIPhysicalPoint(long ptr) @ stub NtUserLogicalToPhysicalDpiPointForWindow @ stub NtUserLogicalToPhysicalPoint @ stub NtUserMNDragLeave diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 3c59dd00b3e..fb0c2c7de7e 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -204,6 +204,7 @@ SYSCALL_ENTRY( NtUserIsClipboardFormatAvailable ) \ SYSCALL_ENTRY( NtUserKillTimer ) \ SYSCALL_ENTRY( NtUserLockWindowUpdate ) \ + SYSCALL_ENTRY( NtUserLogicalToPerMonitorDPIPhysicalPoint ) \ SYSCALL_ENTRY( NtUserMapVirtualKeyEx ) \ SYSCALL_ENTRY( NtUserMenuItemFromPoint ) \ SYSCALL_ENTRY( NtUserMessageCall ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 38024f50548..ca8a40000dd 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -2665,6 +2665,14 @@ NTSTATUS WINAPI wow64_NtUserLockWindowUpdate( UINT *args ) return NtUserLockWindowUpdate( hwnd ); }
+NTSTATUS WINAPI wow64_NtUserLogicalToPerMonitorDPIPhysicalPoint( UINT *args ) +{ + HWND hwnd = get_handle( &args ); + POINT *pt = get_ptr( &args ); + + return NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, pt ); +} + NTSTATUS WINAPI wow64_NtUserMapVirtualKeyEx( UINT *args ) { UINT code = get_ulong( &args ); diff --git a/include/ntuser.h b/include/ntuser.h index 963b02dfd8c..f1f263af7b7 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -773,6 +773,7 @@ BOOL WINAPI NtUserInvalidateRect( HWND hwnd, const RECT *rect, BOOL erase ); BOOL WINAPI NtUserInvalidateRgn( HWND hwnd, HRGN hrgn, BOOL erase ); BOOL WINAPI NtUserKillTimer( HWND hwnd, UINT_PTR id ); BOOL WINAPI NtUserLockWindowUpdate( HWND hwnd ); +BOOL WINAPI NtUserLogicalToPerMonitorDPIPhysicalPoint( HWND hwnd, POINT *pt ); UINT WINAPI NtUserMapVirtualKeyEx( UINT code, UINT type, HKL layout ); INT WINAPI NtUserMenuItemFromPoint( HWND hwnd, HMENU handle, int x, int y ); LRESULT WINAPI NtUserMessageCall( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam,