Module: wine Branch: master Commit: 3570b0913340047a246eb0ad9af68a29b631f106 URL: https://source.winehq.org/git/wine.git/?a=commit;h=3570b0913340047a246eb0ad9...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Dec 6 03:10:01 2021 +0100
win32u: Move DPI mapping from EnumDisplayMonitors.
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 | 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++; }