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