Module: wine Branch: master Commit: b877c78ec53b072c94211198ba08140b5b04489f URL: https://source.winehq.org/git/wine.git/?a=commit;h=b877c78ec53b072c94211198b...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 6 03:09:07 2021 +0100
win32u: Move NtUserGetDpiForMonitor implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/sysparams.c | 24 ------------------- dlls/user32/user32.spec | 2 +- dlls/win32u/syscall.c | 1 + dlls/win32u/sysparams.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 10 ++++++++ include/ntuser.h | 1 + 8 files changed, 76 insertions(+), 26 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 36375dabd42..11a2532411d 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -3328,30 +3328,6 @@ UINT WINAPI GetDpiForSystem(void) return system_dpi; }
-/*********************************************************************** - * GetDpiForMonitorInternal (USER32.@) - */ -BOOL WINAPI GetDpiForMonitorInternal( HMONITOR monitor, UINT type, UINT *x, UINT *y ) -{ - if (type > 2) - { - SetLastError( ERROR_BAD_ARGUMENTS ); - return FALSE; - } - if (!x || !y) - { - SetLastError( ERROR_INVALID_ADDRESS ); - return FALSE; - } - switch (GetAwarenessFromDpiAwarenessContext( GetThreadDpiAwarenessContext() )) - { - case DPI_AWARENESS_UNAWARE: *x = *y = USER_DEFAULT_SCREEN_DPI; break; - case DPI_AWARENESS_SYSTEM_AWARE: *x = *y = system_dpi; break; - default: *x = *y = get_monitor_dpi( monitor ); break; - } - return TRUE; -} - /********************************************************************** * GetThreadDpiAwarenessContext (USER32.@) */ diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec index 20d89c14a84..0f5e880263f 100644 --- a/dlls/user32/user32.spec +++ b/dlls/user32/user32.spec @@ -298,7 +298,7 @@ @ stdcall GetDlgItemTextA(long long ptr long) @ stdcall GetDlgItemTextW(long long ptr long) @ stdcall GetDoubleClickTime() -@ stdcall GetDpiForMonitorInternal(long long ptr ptr) +@ stdcall GetDpiForMonitorInternal(long long ptr ptr) NtUserGetDpiForMonitor @ stdcall GetDpiForSystem() @ stdcall GetDpiForWindow(long) @ stdcall GetFocus() diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index e85633b041c..2e8b2408f31 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -112,6 +112,7 @@ static void * const syscalls[] = NtUserGetClipboardSequenceNumber, NtUserGetClipboardViewer, NtUserGetCursor, + NtUserGetDpiForMonitor, NtUserGetKeyState, NtUserGetKeyboardLayout, NtUserGetKeyboardLayoutName, diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index edc37e7e80f..74ab94aa818 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1345,6 +1345,43 @@ RECT get_virtual_screen_rect(void) return rect; }
+/********************************************************************** + * get_monitor_dpi + */ +static UINT get_monitor_dpi( HMONITOR monitor ) +{ + /* FIXME: use the monitor DPI instead */ + return system_dpi; +} + +/********************************************************************** + * get_thread_dpi_awareness + */ +static DPI_AWARENESS get_thread_dpi_awareness(void) +{ + struct user_thread_info *info = get_user_thread_info(); + ULONG_PTR context = info->dpi_awareness; + + if (!context) context = NtUserGetProcessDpiAwarenessContext( NULL ); + + switch (context) + { + case 0x10: + case 0x11: + case 0x12: + case 0x80000010: + case 0x80000011: + case 0x80000012: + return context & 3; + case (ULONG_PTR)DPI_AWARENESS_CONTEXT_UNAWARE: + case (ULONG_PTR)DPI_AWARENESS_CONTEXT_SYSTEM_AWARE: + case (ULONG_PTR)DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE: + return ~context; + default: + return DPI_AWARENESS_INVALID; + } +} + /********************************************************************** * NtUserGetDisplayConfigBufferSizes (win32u.@) */ @@ -1764,6 +1801,30 @@ ULONG WINAPI NtUserGetSystemDpiForProcess( HANDLE process ) return system_dpi; }
+/*********************************************************************** + * NtUserGetDpiForMonitor (win32u.@) + */ +BOOL WINAPI NtUserGetDpiForMonitor( HMONITOR monitor, UINT type, UINT *x, UINT *y ) +{ + if (type > 2) + { + SetLastError( ERROR_BAD_ARGUMENTS ); + return FALSE; + } + if (!x || !y) + { + SetLastError( ERROR_INVALID_ADDRESS ); + return FALSE; + } + switch (get_thread_dpi_awareness()) + { + case DPI_AWARENESS_UNAWARE: *x = *y = USER_DEFAULT_SCREEN_DPI; break; + case DPI_AWARENESS_SYSTEM_AWARE: *x = *y = system_dpi; break; + default: *x = *y = get_monitor_dpi( monitor ); break; + } + 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 a95d6eca565..c073f14896b 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -924,7 +924,7 @@ @ stdcall NtUserGetDisplayConfigBufferSizes(long ptr ptr) @ stub NtUserGetDoubleClickTime @ stub NtUserGetDpiForCurrentProcess -@ stub NtUserGetDpiForMonitor +@ stdcall -syscall NtUserGetDpiForMonitor(long long ptr ptr) @ stub NtUserGetExtendedPointerDeviceProperty @ stub NtUserGetForegroundWindow @ stub NtUserGetGUIThreadInfo diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index 95a3df42805..bea1b00ebed 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -99,6 +99,7 @@ SYSCALL_ENTRY( NtUserGetClipboardSequenceNumber ) \ SYSCALL_ENTRY( NtUserGetClipboardViewer ) \ SYSCALL_ENTRY( NtUserGetCursor ) \ + SYSCALL_ENTRY( NtUserGetDpiForMonitor ) \ SYSCALL_ENTRY( NtUserGetKeyState ) \ SYSCALL_ENTRY( NtUserGetKeyboardLayout ) \ SYSCALL_ENTRY( NtUserGetKeyboardLayoutName ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 1026bc94843..eb739181812 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -315,3 +315,13 @@ NTSTATUS WINAPI wow64_NtUserGetSystemDpiForProcess( UINT *args )
return NtUserGetSystemDpiForProcess( process ); } + +NTSTATUS WINAPI wow64_NtUserGetDpiForMonitor( UINT *args ) +{ + HMONITOR monitor = get_handle( &args ); + UINT type = get_ulong( &args ); + UINT *x = get_ptr( &args ); + UINT *y = get_ptr( &args ); + + return NtUserGetDpiForMonitor( monitor, type, x, y ); +} diff --git a/include/ntuser.h b/include/ntuser.h index 2b747a856e8..5049926aa78 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -115,6 +115,7 @@ HWND WINAPI NtUserGetClipboardViewer(void); HCURSOR WINAPI NtUserGetCursor(void); LONG WINAPI NtUserGetDisplayConfigBufferSizes( UINT32 flags, UINT32 *num_path_info, UINT32 *num_mode_info ); +BOOL WINAPI NtUserGetDpiForMonitor( HMONITOR monitor, UINT type, UINT *x, UINT *y ); INT WINAPI NtUserGetKeyNameText( LONG lparam, WCHAR *buffer, INT size ); SHORT WINAPI NtUserGetKeyState( INT vkey ); HKL WINAPI NtUserGetKeyboardLayout( DWORD thread_id );