Jacek Caban : win32u: Move DPI mapping from EnumDisplayMonitors.

Alexandre Julliard julliard at winehq.org
Mon Dec 6 16:07:59 CST 2021


Module: wine
Branch: master
Commit: 3570b0913340047a246eb0ad9af68a29b631f106
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3570b0913340047a246eb0ad9af68a29b631f106

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Dec  6 03:10:01 2021 +0100

win32u: Move DPI mapping from EnumDisplayMonitors.

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 | 51 +++++++------------------------------------------
 dlls/user32/user32.spec |  2 +-
 dlls/win32u/sysparams.c | 29 +++++++++++++++++++++++++++-
 3 files changed, 36 insertions(+), 46 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 56f1c444072..bbeea5317b6 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -327,7 +327,7 @@ RECT get_virtual_screen_rect(void)
 {
     RECT rect = {0};
 
-    EnumDisplayMonitors( 0, NULL, get_virtual_screen_proc, (LPARAM)&rect );
+    NtUserEnumDisplayMonitors( 0, NULL, get_virtual_screen_proc, (LPARAM)&rect );
     return rect;
 }
 
@@ -348,7 +348,7 @@ RECT get_primary_monitor_rect(void)
 {
     RECT rect = {0};
 
-    EnumDisplayMonitors( 0, NULL, get_primary_monitor_proc, (LPARAM)&rect );
+    NtUserEnumDisplayMonitors( 0, NULL, get_primary_monitor_proc, (LPARAM)&rect );
     return rect;
 }
 
@@ -364,7 +364,7 @@ static INT get_monitor_count(void)
 {
     INT count = 0;
 
-    EnumDisplayMonitors( 0, NULL, get_monitor_count_proc, (LPARAM)&count );
+    NtUserEnumDisplayMonitors( 0, NULL, get_monitor_count_proc, (LPARAM)&count );
     return count;
 }
 
@@ -1747,7 +1747,7 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam,
         if (!spi_loaded[spi_idx])
         {
             work_area = get_primary_monitor_rect();
-            EnumDisplayMonitors( 0, NULL, enum_monitors, (LPARAM)&work_area );
+            NtUserEnumDisplayMonitors( 0, NULL, enum_monitors, (LPARAM)&work_area );
             spi_loaded[spi_idx] = TRUE;
         }
         *(RECT*)pvParam = work_area;
@@ -3469,7 +3469,7 @@ HMONITOR WINAPI MonitorFromRect( const RECT *rect, DWORD flags )
         info.rect.bottom = info.rect.top + 1;
     }
 
-    if (!EnumDisplayMonitors( 0, NULL, monitor_enum, (LPARAM)&info )) return 0;
+    if (!NtUserEnumDisplayMonitors( 0, NULL, monitor_enum, (LPARAM)&info )) return 0;
     if (!info.ret)
     {
         if (flags & MONITOR_DEFAULTTOPRIMARY) info.ret = info.primary;
@@ -3546,13 +3546,6 @@ BOOL WINAPI GetMonitorInfoW( HMONITOR monitor, LPMONITORINFO info )
     return NtUserCallTwoParam( HandleToUlong(monitor), (ULONG_PTR)info, NtUserGetMonitorInfo );
 }
 
-struct enum_mon_data
-{
-    LPARAM lparam;
-    POINT origin;
-    RECT limit;
-};
-
 #ifdef __i386__
 /* Some apps pass a non-stdcall callback to EnumDisplayMonitors,
  * so we need a small assembly wrapper to call it.
@@ -3580,44 +3573,14 @@ __ASM_GLOBAL_FUNC( enum_mon_callback_wrapper,
 
 BOOL WINAPI User32CallEnumDisplayMonitor( struct enum_display_monitor_params *params, ULONG size )
 {
-    struct enum_mon_data *data = (struct enum_mon_data *)params->lparam;
-    RECT monrect = map_dpi_rect( params->rect, get_monitor_dpi( params->monitor ), get_thread_dpi() );
-
-    /* FIXME: move DPI conversion and rect filtering to win32u */
-    OffsetRect( &monrect, -data->origin.x, -data->origin.y );
-    if (!IntersectRect( &monrect, &monrect, &data->limit )) return TRUE;
 #ifdef __i386__
     return enum_mon_callback_wrapper( params->proc, params->monitor, params->hdc,
-                                      &monrect, data->lparam );
+                                      &params->rect, params->lparam );
 #else
-    return params->proc( params->monitor, params->hdc, &monrect, data->lparam );
+    return params->proc( params->monitor, params->hdc, &params->rect, params->lparam );
 #endif
 }
 
-/***********************************************************************
- *		EnumDisplayMonitors (USER32.@)
- */
-BOOL WINAPI EnumDisplayMonitors( HDC hdc, LPRECT rect, MONITORENUMPROC proc, LPARAM lp )
-{
-    struct enum_mon_data data;
-
-    data.lparam = lp;
-
-    if (hdc)
-    {
-        if (!GetDCOrgEx( hdc, &data.origin )) return FALSE;
-        if (GetClipBox( hdc, &data.limit ) == ERROR) return FALSE;
-    }
-    else
-    {
-        data.origin.x = data.origin.y = 0;
-        data.limit.left = data.limit.top = INT_MIN;
-        data.limit.right = data.limit.bottom = INT_MAX;
-    }
-    if (rect && !IntersectRect( &data.limit, &data.limit, rect )) return TRUE;
-    return NtUserEnumDisplayMonitors( hdc, rect, proc, (LPARAM)&data );
-}
-
 /***********************************************************************
  *		EnumDisplayDevicesA (USER32.@)
  */
diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 0f5e880263f..d82c4949c68 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -223,7 +223,7 @@
 @ stub EnumDisplayDeviceModesW
 @ stdcall EnumDisplayDevicesA(str long ptr long)
 @ stdcall EnumDisplayDevicesW(wstr long ptr long)
-@ stdcall EnumDisplayMonitors(long ptr ptr long)
+@ stdcall EnumDisplayMonitors(long ptr ptr long) NtUserEnumDisplayMonitors
 @ stdcall EnumDisplaySettingsA(str long ptr)
 @ stdcall EnumDisplaySettingsExA(str long ptr long)
 @ stdcall EnumDisplaySettingsExW(wstr long ptr long)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 4ff6f81846a..8efe17aed3c 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -1741,8 +1741,27 @@ BOOL WINAPI NtUserEnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPROC proc
     struct enum_display_monitor_params params;
     struct monitor *monitor;
     unsigned int count = 0, i;
+    POINT origin;
+    RECT limit;
     BOOL ret = TRUE;
 
+    if (hdc)
+    {
+        DC *dc;
+        if (!(dc = get_dc_ptr( hdc ))) return FALSE;
+        origin.x = dc->attr->vis_rect.left;
+        origin.y = dc->attr->vis_rect.top;
+        release_dc_ptr( dc );
+        if (NtGdiGetAppClipBox( hdc, &limit ) == ERROR) return FALSE;
+    }
+    else
+    {
+        origin.x = origin.y = 0;
+        limit.left = limit.top = INT_MIN;
+        limit.right = limit.bottom = INT_MAX;
+    }
+    if (rect && !intersect_rect( &limit, &limit, rect )) return TRUE;
+
     if (!lock_display_devices()) return FALSE;
 
     count = list_count( &monitors );
@@ -1756,9 +1775,17 @@ BOOL WINAPI NtUserEnumDisplayMonitors( HDC hdc, RECT *rect, MONITORENUMPROC proc
     count = 0;
     LIST_FOR_EACH_ENTRY(monitor, &monitors, struct monitor, entry)
     {
+        RECT monrect;
+
         if (!(monitor->dev.state_flags & DISPLAY_DEVICE_ACTIVE)) continue;
+
+        monrect = map_dpi_rect( monitor->rc_monitor, get_monitor_dpi( monitor->handle ),
+                                get_thread_dpi() );
+        offset_rect( &monrect, -origin.x, -origin.y );
+        if (!intersect_rect( &monrect, &monrect, &limit )) continue;
+
         enum_info[count].handle = monitor->handle;
-        enum_info[count].rect = monitor->rc_monitor;
+        enum_info[count].rect = monrect;
         count++;
     }
 




More information about the wine-cvs mailing list