Module: wine Branch: master Commit: 7aab49d736449d9f8e72a588111df934bb822f23 URL: https://source.winehq.org/git/wine.git/?a=commit;h=7aab49d736449d9f8e72a5881...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 6 03:09:37 2021 +0100
win32u: Move DPI mapping from GetMonitorInfoW.
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 | 17 +---------------- dlls/win32u/sysparams.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 11a2532411d..56f1c444072 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -3543,22 +3543,7 @@ BOOL WINAPI GetMonitorInfoA( HMONITOR monitor, LPMONITORINFO info ) */ BOOL WINAPI GetMonitorInfoW( HMONITOR monitor, LPMONITORINFO info ) { - BOOL ret; - UINT dpi_from, dpi_to; - - ret = NtUserCallTwoParam( HandleToUlong(monitor), (ULONG_PTR)info, NtUserGetMonitorInfo ); - if (ret) - { - if ((dpi_to = get_thread_dpi())) - { - dpi_from = get_monitor_dpi( monitor ); - info->rcMonitor = map_dpi_rect( info->rcMonitor, dpi_from, dpi_to ); - info->rcWork = map_dpi_rect( info->rcWork, dpi_from, dpi_to ); - } - TRACE( "flags %04x, monitor %s, work %s\n", info->dwFlags, - wine_dbgstr_rect(&info->rcMonitor), wine_dbgstr_rect(&info->rcWork)); - } - return ret; + return NtUserCallTwoParam( HandleToUlong(monitor), (ULONG_PTR)info, NtUserGetMonitorInfo ); }
struct enum_mon_data diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 74ab94aa818..4ff6f81846a 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1382,6 +1382,34 @@ static DPI_AWARENESS get_thread_dpi_awareness(void) } }
+/********************************************************************** + * get_thread_dpi + */ +static UINT get_thread_dpi(void) +{ + switch (get_thread_dpi_awareness()) + { + case DPI_AWARENESS_UNAWARE: return USER_DEFAULT_SCREEN_DPI; + case DPI_AWARENESS_SYSTEM_AWARE: return system_dpi; + default: return 0; /* no scaling */ + } +} + +/********************************************************************** + * map_dpi_rect + */ +RECT map_dpi_rect( RECT rect, UINT dpi_from, UINT dpi_to ) +{ + if (dpi_from && dpi_to && dpi_from != dpi_to) + { + rect.left = muldiv( rect.left, dpi_to, dpi_from ); + rect.top = muldiv( rect.top, dpi_to, dpi_from ); + rect.right = muldiv( rect.right, dpi_to, dpi_from ); + rect.bottom = muldiv( rect.bottom, dpi_to, dpi_from ); + } + return rect; +} + /********************************************************************** * NtUserGetDisplayConfigBufferSizes (win32u.@) */ @@ -1756,6 +1784,7 @@ BOOL WINAPI NtUserEnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPROC proc static BOOL get_monitor_info( HMONITOR handle, MONITORINFO *info ) { struct monitor *monitor; + UINT dpi_from, dpi_to;
if (info->cbSize != sizeof(MONITORINFOEXW) && info->cbSize != sizeof(MONITORINFO)) return FALSE;
@@ -1778,6 +1807,15 @@ static BOOL get_monitor_info( HMONITOR handle, MONITORINFO *info ) asciiz_to_unicode( ((MONITORINFOEXW *)info)->szDevice, "WinDisc" ); } unlock_display_devices(); + + if ((dpi_to = get_thread_dpi())) + { + dpi_from = get_monitor_dpi( handle ); + info->rcMonitor = map_dpi_rect( info->rcMonitor, dpi_from, dpi_to ); + info->rcWork = map_dpi_rect( info->rcWork, dpi_from, dpi_to ); + } + TRACE( "flags %04x, monitor %s, work %s\n", info->dwFlags, + wine_dbgstr_rect(&info->rcMonitor), wine_dbgstr_rect(&info->rcWork)); return TRUE; }