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 );
+ ¶ms->rect, params->lparam );
#else
- return params->proc( params->monitor, params->hdc, &monrect, data->lparam );
+ return params->proc( params->monitor, params->hdc, ¶ms->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