Jacek Caban : win32u: Move DPI mapping from GetMonitorInfoW.
Alexandre Julliard
julliard at winehq.org
Mon Dec 6 16:07:59 CST 2021
Module: wine
Branch: master
Commit: 7aab49d736449d9f8e72a588111df934bb822f23
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7aab49d736449d9f8e72a588111df934bb822f23
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Dec 6 03:09:37 2021 +0100
win32u: Move DPI mapping from GetMonitorInfoW.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
}
More information about the wine-cvs
mailing list