In preparation for RAW monitor DPI for display mode virtualization.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 30 ++++++++++++++++++++---------- include/ntuser.h | 9 +++++++++ 2 files changed, 29 insertions(+), 10 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 60113f2608e..80fc30f4c15 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2151,11 +2151,16 @@ static void release_display_dc( HDC hdc ) }
/* display_lock must be held */ -static UINT monitor_get_dpi( struct monitor *monitor ) +static UINT monitor_get_dpi( struct monitor *monitor, MONITOR_DPI_TYPE type, UINT *dpi_x, UINT *dpi_y ) { + struct source *source = monitor->source; + float scale_x = 1.0, scale_y = 1.0; UINT dpi; - if (!monitor->source || !(dpi = monitor->source->dpi)) dpi = system_dpi; - return dpi; + + if (!source || !(dpi = source->dpi)) dpi = system_dpi; + *dpi_x = round( dpi * scale_x ); + *dpi_y = round( dpi * scale_y ); + return min( *dpi_x, *dpi_y ); }
/* display_lock must be held */ @@ -2164,6 +2169,7 @@ static RECT monitor_get_rect( struct monitor *monitor, UINT dpi ) DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; RECT rect = {0, 0, 1024, 768}; struct source *source; + UINT dpi_from, x, y;
/* services do not have any adapters, only a virtual monitor */ if (!(source = monitor->source)) return rect; @@ -2176,13 +2182,16 @@ static RECT monitor_get_rect( struct monitor *monitor, UINT dpi ) current_mode.dmPosition.x + current_mode.dmPelsWidth, current_mode.dmPosition.y + current_mode.dmPelsHeight );
- return map_dpi_rect( rect, monitor_get_dpi( monitor ), dpi ); + dpi_from = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); + return map_dpi_rect( rect, dpi_from, dpi ); }
static void monitor_get_info( struct monitor *monitor, MONITORINFO *info, UINT dpi ) { + UINT x, y; + info->rcMonitor = monitor_get_rect( monitor, dpi ); - info->rcWork = map_dpi_rect( monitor->rc_work, monitor_get_dpi( monitor ), dpi ); + info->rcWork = map_dpi_rect( monitor->rc_work, monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ), dpi ); info->dwFlags = is_monitor_primary( monitor ) ? MONITORINFOF_PRIMARY : 0;
if (info->cbSize >= sizeof(MONITORINFOEXW)) @@ -2269,13 +2278,13 @@ static struct monitor *get_monitor_from_handle( HMONITOR handle ) return NULL; }
-static UINT get_monitor_dpi( HMONITOR handle ) +static UINT get_monitor_dpi( HMONITOR handle, UINT type, UINT *x, UINT *y ) { struct monitor *monitor; UINT dpi = system_dpi;
if (!lock_display_devices()) return 0; - if ((monitor = get_monitor_from_handle( handle ))) dpi = monitor_get_dpi( monitor ); + if ((monitor = get_monitor_from_handle( handle ))) dpi = monitor_get_dpi( monitor, type, x, y ); unlock_display_devices();
return dpi; @@ -3832,10 +3841,11 @@ MONITORINFO monitor_info_from_rect( RECT rect, UINT dpi ) UINT monitor_dpi_from_rect( RECT rect, UINT dpi ) { struct monitor *monitor; - UINT ret = system_dpi; + UINT ret = system_dpi, x, y;
if (!lock_display_devices()) return 0; - if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi ))) ret = monitor_get_dpi( monitor ); + if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi ))) + ret = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); unlock_display_devices();
return ret; @@ -3903,7 +3913,7 @@ BOOL WINAPI NtUserGetDpiForMonitor( HMONITOR monitor, UINT type, UINT *x, UINT * { case DPI_AWARENESS_UNAWARE: *x = *y = USER_DEFAULT_SCREEN_DPI; break; case DPI_AWARENESS_SYSTEM_AWARE: *x = *y = system_dpi; break; - default: *x = *y = get_monitor_dpi( monitor ); break; + default: get_monitor_dpi( monitor, type, x, y ); break; } return TRUE; } diff --git a/include/ntuser.h b/include/ntuser.h index 5c834189f4b..a8db6d0c06b 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -34,6 +34,15 @@ # endif #endif
+/* avoid including shellscalingapi.h */ +typedef enum MONITOR_DPI_TYPE +{ + MDT_EFFECTIVE_DPI = 0, + MDT_ANGULAR_DPI = 1, + MDT_RAW_DPI = 2, + MDT_DEFAULT = MDT_EFFECTIVE_DPI, +} MONITOR_DPI_TYPE; + typedef NTSTATUS (WINAPI *ntuser_callback)( void *args, ULONG len ); NTSYSAPI NTSTATUS KeUserModeCallback( ULONG id, const void *args, ULONG len, void **ret_ptr, ULONG *ret_len );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 80fc30f4c15..286909ec32f 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2164,7 +2164,7 @@ static UINT monitor_get_dpi( struct monitor *monitor, MONITOR_DPI_TYPE type, UIN }
/* display_lock must be held */ -static RECT monitor_get_rect( struct monitor *monitor, UINT dpi ) +static RECT monitor_get_rect( struct monitor *monitor, UINT dpi, MONITOR_DPI_TYPE type ) { DEVMODEW current_mode = {.dmSize = sizeof(DEVMODEW)}; RECT rect = {0, 0, 1024, 768}; @@ -2182,7 +2182,7 @@ static RECT monitor_get_rect( struct monitor *monitor, UINT dpi ) current_mode.dmPosition.x + current_mode.dmPelsWidth, current_mode.dmPosition.y + current_mode.dmPelsHeight );
- dpi_from = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); + dpi_from = monitor_get_dpi( monitor, type, &x, &y ); return map_dpi_rect( rect, dpi_from, dpi ); }
@@ -2190,7 +2190,7 @@ static void monitor_get_info( struct monitor *monitor, MONITORINFO *info, UINT d { UINT x, y;
- info->rcMonitor = monitor_get_rect( monitor, dpi ); + info->rcMonitor = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); info->rcWork = map_dpi_rect( monitor->rc_work, monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ), dpi ); info->dwFlags = is_monitor_primary( monitor ) ? MONITORINFOF_PRIMARY : 0;
@@ -2221,7 +2221,7 @@ static struct monitor *get_monitor_from_rect( RECT rect, UINT flags, UINT dpi )
if (!is_monitor_active( monitor ) || monitor->is_clone) continue;
- monitor_rect = monitor_get_rect( monitor, dpi ); + monitor_rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); if (intersect_rect( &intersect, &monitor_rect, &rect )) { /* check for larger intersecting area */ @@ -2504,7 +2504,7 @@ RECT get_virtual_screen_rect( UINT dpi ) { RECT monitor_rect; if (!is_monitor_active( monitor ) || monitor->is_clone) continue; - monitor_rect = monitor_get_rect( monitor, dpi ); + monitor_rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); union_rect( &rect, &rect, &monitor_rect ); }
@@ -2526,7 +2526,7 @@ BOOL is_window_rect_full_screen( const RECT *rect, UINT dpi )
if (!is_monitor_active( monitor ) || monitor->is_clone) continue;
- monrect = monitor_get_rect( monitor, dpi ); + monrect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); if (rect->left <= monrect.left && rect->right >= monrect.right && rect->top <= monrect.top && rect->bottom >= monrect.bottom) { @@ -2565,7 +2565,7 @@ RECT get_display_rect( const WCHAR *display ) LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) { if (!monitor->source || monitor->source->id + 1 != index) continue; - rect = monitor_get_rect( monitor, dpi ); + rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); break; }
@@ -2583,7 +2583,7 @@ RECT get_primary_monitor_rect( UINT dpi ) LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) { if (!is_monitor_primary( monitor )) continue; - rect = monitor_get_rect( monitor, dpi ); + rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); break; }
@@ -3699,7 +3699,7 @@ static BOOL should_enumerate_monitor( struct monitor *monitor, const POINT *orig if (!is_monitor_active( monitor )) return FALSE; if (monitor->is_clone) return FALSE;
- *rect = monitor_get_rect( monitor, get_thread_dpi() ); + *rect = monitor_get_rect( monitor, get_thread_dpi(), MDT_DEFAULT ); OffsetRect( rect, -origin->x, -origin->y ); return intersect_rect( rect, rect, limit ); }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/defwnd.c | 4 +-- dlls/win32u/driver.c | 4 +-- dlls/win32u/input.c | 6 ++--- dlls/win32u/sysparams.c | 48 +++++++++++++++++++++--------------- dlls/win32u/win32u_private.h | 2 +- dlls/win32u/window.c | 2 +- dlls/winex11.drv/display.c | 4 +-- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/mouse.c | 4 +-- dlls/winex11.drv/window.c | 4 +-- dlls/winex11.drv/x11drv.h | 2 +- include/ntuser.h | 15 +++++------ 12 files changed, 53 insertions(+), 44 deletions(-)
diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 225f687b218..aaf91d5d8a5 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -722,7 +722,7 @@ static void sys_command_size_move( HWND hwnd, WPARAM wparam ) else { parent = 0; - mouse_rect = get_virtual_screen_rect( get_thread_dpi() ); + mouse_rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); }
if (on_left_border( hittest )) @@ -2982,7 +2982,7 @@ LRESULT desktop_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) { static RECT virtual_rect = {INT_MIN,INT_MIN,INT_MAX,INT_MAX};
- RECT new_rect = get_virtual_screen_rect( 0 ), old_rect = virtual_rect; + RECT new_rect = get_virtual_screen_rect( 0, MDT_DEFAULT ), old_rect = virtual_rect; UINT context, flags = 0;
if (EqualRect( &new_rect, &old_rect )) return TRUE; diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 02478b18a8a..d2c38ebf26e 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -253,14 +253,14 @@ static INT nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap ) case DESKTOPHORZRES: if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY) { - RECT rect = get_virtual_screen_rect( 0 ); + RECT rect = get_virtual_screen_rect( 0, MDT_DEFAULT ); return rect.right - rect.left; } return NtGdiGetDeviceCaps( dev->hdc, HORZRES ); case DESKTOPVERTRES: if (NtGdiGetDeviceCaps( dev->hdc, TECHNOLOGY ) == DT_RASDISPLAY) { - RECT rect = get_virtual_screen_rect( 0 ); + RECT rect = get_virtual_screen_rect( 0, MDT_DEFAULT ); return rect.bottom - rect.top; } return NtGdiGetDeviceCaps( dev->hdc, VERTRES ); diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 0d7b088f996..84f8aba1728 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -619,7 +619,7 @@ static void update_mouse_coords( INPUT *input ) RECT rc;
if (input->mi.dwFlags & MOUSEEVENTF_VIRTUALDESK) - rc = get_virtual_screen_rect( 0 ); + rc = get_virtual_screen_rect( 0, MDT_DEFAULT ); else rc = get_primary_monitor_rect( 0 );
@@ -2575,7 +2575,7 @@ BOOL clip_fullscreen_window( HWND hwnd, BOOL reset )
ctx = set_thread_dpi_awareness_context( NTUSER_DPI_PER_MONITOR_AWARE ); monitor_info = monitor_info_from_window( hwnd, MONITOR_DEFAULTTONEAREST ); - virtual_rect = get_virtual_screen_rect( 0 ); + virtual_rect = get_virtual_screen_rect( 0, MDT_DEFAULT ); set_thread_dpi_awareness_context( ctx );
if (!grab_fullscreen) @@ -2633,7 +2633,7 @@ BOOL get_clip_cursor( RECT *rect, UINT dpi ) BOOL process_wine_clipcursor( HWND hwnd, UINT flags, BOOL reset ) { struct user_thread_info *thread_info = get_user_thread_info(); - RECT rect, virtual_rect = get_virtual_screen_rect( 0 ); + RECT rect, virtual_rect = get_virtual_screen_rect( 0, MDT_DEFAULT ); BOOL was_clipping, empty = !!(flags & SET_CURSOR_NOCLIP);
TRACE( "hwnd %p, flags %#x, reset %u\n", hwnd, flags, reset ); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 286909ec32f..4c2c8fedd55 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2131,7 +2131,7 @@ HBITMAP get_display_bitmap(void) RECT virtual_rect; HBITMAP ret;
- virtual_rect = get_virtual_screen_rect( 0 ); + virtual_rect = get_virtual_screen_rect( 0, MDT_DEFAULT ); pthread_mutex_lock( &display_dc_lock ); if (!EqualRect( &old_virtual_rect, &virtual_rect )) { @@ -2278,6 +2278,23 @@ static struct monitor *get_monitor_from_handle( HMONITOR handle ) return NULL; }
+/* display_lock must be held */ +static RECT monitors_get_union_rect( UINT dpi, MONITOR_DPI_TYPE type ) +{ + struct monitor *monitor; + RECT rect = {0}; + + LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) + { + RECT monitor_rect; + if (!is_monitor_active( monitor ) || monitor->is_clone) continue; + monitor_rect = monitor_get_rect( monitor, dpi, type ); + union_rect( &rect, &rect, &monitor_rect ); + } + + return rect; +} + static UINT get_monitor_dpi( HMONITOR handle, UINT type, UINT *x, UINT *y ) { struct monitor *monitor; @@ -2493,21 +2510,12 @@ static int map_to_dpi( int val, UINT dpi ) return muldiv( val, dpi, USER_DEFAULT_SCREEN_DPI ); }
-RECT get_virtual_screen_rect( UINT dpi ) +RECT get_virtual_screen_rect( UINT dpi, MONITOR_DPI_TYPE type ) { - struct monitor *monitor; RECT rect = {0};
if (!lock_display_devices()) return rect; - - LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) - { - RECT monitor_rect; - if (!is_monitor_active( monitor ) || monitor->is_clone) continue; - monitor_rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); - union_rect( &rect, &rect, &monitor_rect ); - } - + rect = monitors_get_union_rect( dpi, type ); unlock_display_devices();
return rect; @@ -6201,16 +6209,16 @@ int get_system_metrics( int index ) rect = get_primary_monitor_rect( get_thread_dpi() ); return rect.bottom - rect.top; case SM_XVIRTUALSCREEN: - rect = get_virtual_screen_rect( get_thread_dpi() ); + rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); return rect.left; case SM_YVIRTUALSCREEN: - rect = get_virtual_screen_rect( get_thread_dpi() ); + rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); return rect.top; case SM_CXVIRTUALSCREEN: - rect = get_virtual_screen_rect( get_thread_dpi() ); + rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); return rect.right - rect.left; case SM_CYVIRTUALSCREEN: - rect = get_virtual_screen_rect( get_thread_dpi() ); + rect = get_virtual_screen_rect( get_thread_dpi(), MDT_DEFAULT ); return rect.bottom - rect.top; case SM_CMONITORS: if (!lock_display_devices()) return FALSE; @@ -6620,10 +6628,6 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) case NtUserCallOneParam_GetSystemMetrics: return get_system_metrics( arg );
- case NtUserCallOneParam_GetVirtualScreenRect: - *(RECT *)arg = get_virtual_screen_rect( 0 ); - return 1; - case NtUserCallOneParam_MessageBeep: return message_beep( arg );
@@ -6699,6 +6703,10 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code return adjust_window_rect( (RECT *)arg1, params->style, params->menu, params->ex_style, params->dpi ); }
+ case NtUserCallTwoParam_GetVirtualScreenRect: + *(RECT *)arg1 = get_virtual_screen_rect( 0, arg2 ); + return 1; + /* temporary exports */ case NtUserAllocWinProc: return (UINT_PTR)alloc_winproc( (WNDPROC)arg1, arg2 ); diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index bf88b130f67..bf8b3afccc0 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -179,7 +179,7 @@ extern int get_system_metrics( int index ); extern UINT get_thread_dpi(void); extern UINT set_thread_dpi_awareness_context( UINT context ); extern UINT get_thread_dpi_awareness_context(void); -extern RECT get_virtual_screen_rect( UINT dpi ); +extern RECT get_virtual_screen_rect( UINT dpi, MONITOR_DPI_TYPE type ); extern BOOL is_exiting_thread( DWORD tid ); extern BOOL is_window_rect_full_screen( const RECT *rect, UINT dpi ); extern POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index cb7b1f6e3a6..a7f66d299e5 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -1855,7 +1855,7 @@ static RECT get_visible_rect( HWND hwnd, BOOL shaped, UINT style, UINT ex_style,
static BOOL get_surface_rect( const RECT *visible_rect, RECT *surface_rect ) { - RECT virtual_rect = get_virtual_screen_rect( 0 ); + RECT virtual_rect = get_virtual_screen_rect( 0, MDT_DEFAULT );
*surface_rect = *visible_rect;
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index c3a40f300db..070ab3efe2f 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -284,7 +284,7 @@ done:
POINT virtual_screen_to_root(INT x, INT y) { - RECT virtual = NtUserGetVirtualScreenRect(); + RECT virtual = NtUserGetVirtualScreenRect( MDT_DEFAULT ); POINT pt;
pt.x = x - virtual.left; @@ -294,7 +294,7 @@ POINT virtual_screen_to_root(INT x, INT y)
POINT root_to_virtual_screen(INT x, INT y) { - RECT virtual = NtUserGetVirtualScreenRect(); + RECT virtual = NtUserGetVirtualScreenRect( MDT_DEFAULT ); POINT pt;
pt.x = x + virtual.left; diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 9f94a902620..fed34a394e7 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -104,7 +104,7 @@ static BOOL X11DRV_CreateDC( PHYSDEV *pdev, LPCWSTR device, LPCWSTR output, cons
physDev->depth = default_visual.depth; physDev->color_shifts = &X11DRV_PALETTE_default_shifts; - physDev->dc_rect = NtUserGetVirtualScreenRect(); + physDev->dc_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT ); OffsetRect( &physDev->dc_rect, -physDev->dc_rect.left, -physDev->dc_rect.top ); push_dc_driver( pdev, &physDev->dev, &x11drv_funcs.dc_funcs ); if (xrender_funcs && !xrender_funcs->pCreateDC( pdev, device, output, initData )) return FALSE; diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c index 5941eabd5d0..15557c3d917 100644 --- a/dlls/winex11.drv/mouse.c +++ b/dlls/winex11.drv/mouse.c @@ -1679,7 +1679,7 @@ static BOOL map_raw_event_coords( XIRawEvent *event, INPUT *input ) if (!xinput2_available) return FALSE; if (event->deviceid != thread_data->xinput2_pointer) return FALSE;
- virtual_rect = NtUserGetVirtualScreenRect(); + virtual_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT );
if (x->max <= x->min) x_scale = 1; else x_scale = (virtual_rect.right - virtual_rect.left) / (x->max - x->min); @@ -1749,7 +1749,7 @@ static BOOL X11DRV_RawMotion( XGenericEventCookie *xev )
static BOOL X11DRV_TouchEvent( HWND hwnd, XGenericEventCookie *xev ) { - RECT virtual = NtUserGetVirtualScreenRect(); + RECT virtual = NtUserGetVirtualScreenRect( MDT_DEFAULT ); INPUT input = {.type = INPUT_HARDWARE}; XIDeviceEvent *event = xev->data; int flags = 0; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index f18ab302e5e..b3747dda705 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1911,7 +1911,7 @@ void X11DRV_SetDesktopWindow( HWND hwnd )
if (!width && !height) /* not initialized yet */ { - RECT rect = NtUserGetVirtualScreenRect(); + RECT rect = NtUserGetVirtualScreenRect( MDT_DEFAULT );
SERVER_START_REQ( set_window_pos ) { @@ -2370,7 +2370,7 @@ void X11DRV_ReleaseDC( HWND hwnd, HDC hdc ) escape.code = X11DRV_SET_DRAWABLE; escape.drawable = root_window; escape.mode = IncludeInferiors; - escape.dc_rect = NtUserGetVirtualScreenRect(); + escape.dc_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT ); OffsetRect( &escape.dc_rect, -2 * escape.dc_rect.left, -2 * escape.dc_rect.top ); NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); } diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 02cba58f09f..d83b68a5590 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -824,7 +824,7 @@ extern void xim_set_focus( HWND hwnd, BOOL focus );
static inline BOOL is_window_rect_mapped( const RECT *rect ) { - RECT virtual_rect = NtUserGetVirtualScreenRect(); + RECT virtual_rect = NtUserGetVirtualScreenRect( MDT_DEFAULT ); return (rect->left < virtual_rect.right && rect->top < virtual_rect.bottom && max( rect->right, rect->left + 1 ) > virtual_rect.left && diff --git a/include/ntuser.h b/include/ntuser.h index a8db6d0c06b..fb6955ea0ec 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1024,13 +1024,6 @@ static inline INT NtUserGetSystemMetrics( INT index ) return NtUserCallOneParam( index, NtUserCallOneParam_GetSystemMetrics ); }
-static inline RECT NtUserGetVirtualScreenRect(void) -{ - RECT virtual; - NtUserCallOneParam( (UINT_PTR)&virtual, NtUserCallOneParam_GetVirtualScreenRect ); - return virtual; -} - static inline BOOL NtUserMessageBeep( UINT i ) { return NtUserCallOneParam( i, NtUserCallOneParam_MessageBeep ); @@ -1081,6 +1074,7 @@ enum NtUserCallTwoParam_SetIMECompositionWindowPos, NtUserCallTwoParam_UnhookWindowsHook, NtUserCallTwoParam_AdjustWindowRect, + NtUserCallTwoParam_GetVirtualScreenRect, /* temporary exports */ NtUserAllocWinProc, }; @@ -1155,6 +1149,13 @@ static inline BOOL NtUserAdjustWindowRect( RECT *rect, DWORD style, BOOL menu, D return NtUserCallTwoParam( (ULONG_PTR)rect, (ULONG_PTR)¶ms, NtUserCallTwoParam_AdjustWindowRect ); }
+static inline RECT NtUserGetVirtualScreenRect( MONITOR_DPI_TYPE type ) +{ + RECT virtual; + NtUserCallTwoParam( (UINT_PTR)&virtual, type, NtUserCallTwoParam_GetVirtualScreenRect ); + return virtual; +} + /* NtUserCallHwnd codes, not compatible with Windows */ enum {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/sysparams.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 4c2c8fedd55..153368d2a01 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2204,7 +2204,7 @@ static void monitor_get_info( struct monitor *monitor, MONITORINFO *info, UINT d }
/* display_lock must be held */ -static struct monitor *get_monitor_from_rect( RECT rect, UINT flags, UINT dpi ) +static struct monitor *get_monitor_from_rect( RECT rect, UINT flags, UINT dpi, MONITOR_DPI_TYPE type ) { struct monitor *monitor, *primary = NULL, *nearest = NULL, *found = NULL; UINT max_area = 0, min_distance = -1; @@ -2221,7 +2221,7 @@ static struct monitor *get_monitor_from_rect( RECT rect, UINT flags, UINT dpi )
if (!is_monitor_active( monitor ) || monitor->is_clone) continue;
- monitor_rect = monitor_get_rect( monitor, dpi, MDT_DEFAULT ); + monitor_rect = monitor_get_rect( monitor, dpi, type ); if (intersect_rect( &intersect, &monitor_rect, &rect )) { /* check for larger intersecting area */ @@ -3827,7 +3827,7 @@ static HMONITOR monitor_from_rect( const RECT *rect, UINT flags, UINT dpi ) r = map_dpi_rect( *rect, dpi, system_dpi );
if (!lock_display_devices()) return 0; - if ((monitor = get_monitor_from_rect( r, flags, system_dpi ))) ret = monitor->handle; + if ((monitor = get_monitor_from_rect( r, flags, system_dpi, MDT_DEFAULT ))) ret = monitor->handle; unlock_display_devices();
TRACE( "%s flags %x returning %p\n", wine_dbgstr_rect(rect), flags, ret ); @@ -3840,7 +3840,8 @@ MONITORINFO monitor_info_from_rect( RECT rect, UINT dpi ) struct monitor *monitor;
if (!lock_display_devices()) return info; - if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi ))) monitor_get_info( monitor, &info, dpi ); + if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi, MDT_DEFAULT ))) + monitor_get_info( monitor, &info, dpi ); unlock_display_devices();
return info; @@ -3852,7 +3853,7 @@ UINT monitor_dpi_from_rect( RECT rect, UINT dpi ) UINT ret = system_dpi, x, y;
if (!lock_display_devices()) return 0; - if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi ))) + if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi, MDT_DEFAULT ))) ret = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); unlock_display_devices();
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/window.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index a7f66d299e5..181c00547c9 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -1914,12 +1914,13 @@ static struct window_surface *get_window_surface( HWND hwnd, UINT swp_flags, BOO RECT dummy; HRGN shape;
- monitor_dpi = monitor_dpi_from_rect( rects->window, get_thread_dpi() ); - style = NtUserGetWindowLongW( hwnd, GWL_STYLE ); ex_style = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ); is_child = parent && parent != NtUserGetDesktopWindow();
+ if (is_child) monitor_dpi = get_win_monitor_dpi( parent ); + else monitor_dpi = monitor_dpi_from_rect( rects->window, get_thread_dpi() ); + if (get_window_region( hwnd, FALSE, &shape, &dummy )) shaped = FALSE; else if ((shaped = !!shape)) NtGdiDeleteObjectApp( shape );
@@ -1998,8 +1999,8 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru { struct window_rects monitor_rects; WND *win; - HWND surface_win = 0; - BOOL ret, is_fullscreen, is_layered, needs_update = FALSE; + HWND surface_win = 0, parent = NtUserGetAncestor( hwnd, GA_PARENT ); + BOOL ret, is_fullscreen, is_layered, is_child, needs_update = FALSE; struct window_rects old_rects; RECT extra_rects[3]; struct window_surface *old_surface; @@ -2007,6 +2008,10 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru
is_layered = new_surface && new_surface->alpha_mask; is_fullscreen = is_window_rect_full_screen( &new_rects->visible, get_thread_dpi() ); + is_child = parent && parent != NtUserGetDesktopWindow(); + + if (is_child) monitor_dpi = get_win_monitor_dpi( parent ); + else monitor_dpi = monitor_dpi_from_rect( new_rects->window, get_thread_dpi() );
get_window_rects( hwnd, COORDS_SCREEN, &old_rects, get_thread_dpi() ); if (IsRectEmpty( &valid_rects[0] ) || is_layered) valid_rects = NULL; @@ -2024,7 +2029,6 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru valid_rects = NULL; }
- monitor_dpi = monitor_dpi_from_rect( new_rects->window, get_thread_dpi() ); monitor_rects = map_dpi_window_rects( *new_rects, get_thread_dpi(), monitor_dpi );
SERVER_START_REQ( set_window_pos )
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/input.c | 14 ++++----- dlls/win32u/sysparams.c | 22 +++++++++----- dlls/win32u/win32u_private.h | 4 +-- dlls/win32u/window.c | 41 +++++++++++++++----------- dlls/wineandroid.drv/init.c | 2 +- dlls/wineandroid.drv/window.c | 4 +-- dlls/winemac.drv/window.c | 6 ++-- dlls/winewayland.drv/wayland_surface.c | 4 +-- dlls/winewayland.drv/window.c | 2 +- dlls/winex11.drv/event.c | 4 +-- dlls/winex11.drv/init.c | 2 +- dlls/winex11.drv/opengl.c | 4 +-- dlls/winex11.drv/vulkan.c | 4 +-- dlls/winex11.drv/window.c | 2 +- include/ntuser.h | 4 +-- 15 files changed, 65 insertions(+), 54 deletions(-)
diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 84f8aba1728..6328698f75f 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -709,9 +709,9 @@ BOOL WINAPI NtUserSetCursorPos( INT x, INT y ) RECT rect = {x, y, x, y}; BOOL ret; INT prev_x, prev_y, new_x, new_y; - UINT dpi; + UINT dpi, raw_dpi;
- dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); + dpi = monitor_dpi_from_rect( rect, get_thread_dpi(), &raw_dpi ); rect = map_dpi_rect( rect, get_thread_dpi(), dpi );
SERVER_START_REQ( set_cursor ) @@ -743,7 +743,7 @@ BOOL get_cursor_pos( POINT *pt ) DWORD last_change = 0; NTSTATUS status; RECT rect; - UINT dpi; + UINT dpi, raw_dpi;
if (!pt) return FALSE;
@@ -760,7 +760,7 @@ BOOL get_cursor_pos( POINT *pt ) if (!ret) return FALSE;
SetRect( &rect, pt->x, pt->y, pt->x, pt->y ); - dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); + dpi = monitor_dpi_from_rect( rect, get_thread_dpi(), &raw_dpi ); rect = map_dpi_rect( rect, dpi, get_thread_dpi() ); *pt = *(POINT *)&rect.left; return ret; @@ -2623,7 +2623,7 @@ BOOL get_clip_cursor( RECT *rect, UINT dpi ) if (!status) { UINT ctx = set_thread_dpi_awareness_context( NTUSER_DPI_PER_MONITOR_AWARE ); - UINT dpi_from = monitor_dpi_from_rect( *rect, get_thread_dpi() ); + UINT raw_dpi, dpi_from = monitor_dpi_from_rect( *rect, get_thread_dpi(), &raw_dpi ); *rect = map_dpi_rect( *rect, dpi_from, dpi ); set_thread_dpi_awareness_context( ctx ); } @@ -2671,7 +2671,7 @@ BOOL process_wine_clipcursor( HWND hwnd, UINT flags, BOOL reset ) */ BOOL WINAPI NtUserClipCursor( const RECT *rect ) { - UINT dpi_from = get_thread_dpi(), dpi_to; + UINT dpi_from = get_thread_dpi(), dpi_to, raw_dpi; BOOL ret; RECT new_rect;
@@ -2680,7 +2680,7 @@ BOOL WINAPI NtUserClipCursor( const RECT *rect ) if (rect) { if (rect->left > rect->right || rect->top > rect->bottom) return FALSE; - dpi_to = monitor_dpi_from_rect( *rect, dpi_from ); + dpi_to = monitor_dpi_from_rect( *rect, dpi_from, &raw_dpi ); new_rect = map_dpi_rect( *rect, dpi_from, dpi_to ); rect = &new_rect; } diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 153368d2a01..cdc5515f1a9 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2310,9 +2310,10 @@ static UINT get_monitor_dpi( HMONITOR handle, UINT type, UINT *x, UINT *y ) /********************************************************************** * get_win_monitor_dpi */ -UINT get_win_monitor_dpi( HWND hwnd ) +UINT get_win_monitor_dpi( HWND hwnd, UINT *raw_dpi ) { /* FIXME: use the monitor DPI instead */ + *raw_dpi = system_dpi; return system_dpi; }
@@ -2466,7 +2467,8 @@ POINT map_dpi_point( POINT pt, UINT dpi_from, UINT dpi_to ) */ static POINT point_win_to_phys_dpi( HWND hwnd, POINT pt ) { - return map_dpi_point( pt, get_dpi_for_window( hwnd ), get_win_monitor_dpi( hwnd ) ); + UINT raw_dpi, dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); + return map_dpi_point( pt, get_dpi_for_window( hwnd ), dpi ); }
/********************************************************************** @@ -2474,7 +2476,8 @@ static POINT point_win_to_phys_dpi( HWND hwnd, POINT pt ) */ POINT point_phys_to_win_dpi( HWND hwnd, POINT pt ) { - return map_dpi_point( pt, get_win_monitor_dpi( hwnd ), get_dpi_for_window( hwnd )); + UINT raw_dpi, dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); + return map_dpi_point( pt, dpi, get_dpi_for_window( hwnd ) ); }
/********************************************************************** @@ -2482,8 +2485,8 @@ POINT point_phys_to_win_dpi( HWND hwnd, POINT pt ) */ POINT point_thread_to_win_dpi( HWND hwnd, POINT pt ) { - UINT dpi = get_thread_dpi(); - if (!dpi) dpi = get_win_monitor_dpi( hwnd ); + UINT dpi = get_thread_dpi(), raw_dpi; + if (!dpi) dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); return map_dpi_point( pt, dpi, get_dpi_for_window( hwnd )); }
@@ -2492,8 +2495,8 @@ POINT point_thread_to_win_dpi( HWND hwnd, POINT pt ) */ RECT rect_thread_to_win_dpi( HWND hwnd, RECT rect ) { - UINT dpi = get_thread_dpi(); - if (!dpi) dpi = get_win_monitor_dpi( hwnd ); + UINT dpi = get_thread_dpi(), raw_dpi; + if (!dpi) dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); return map_dpi_rect( rect, dpi, get_dpi_for_window( hwnd ) ); }
@@ -3847,14 +3850,17 @@ MONITORINFO monitor_info_from_rect( RECT rect, UINT dpi ) return info; }
-UINT monitor_dpi_from_rect( RECT rect, UINT dpi ) +UINT monitor_dpi_from_rect( RECT rect, UINT dpi, UINT *raw_dpi ) { struct monitor *monitor; UINT ret = system_dpi, x, y;
if (!lock_display_devices()) return 0; if ((monitor = get_monitor_from_rect( rect, MONITOR_DEFAULTTONEAREST, dpi, MDT_DEFAULT ))) + { + *raw_dpi = monitor_get_dpi( monitor, MDT_RAW_DPI, &x, &y ); ret = monitor_get_dpi( monitor, MDT_DEFAULT, &x, &y ); + } unlock_display_devices();
return ret; diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index bf8b3afccc0..310498f5993 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -168,7 +168,7 @@ extern LONG get_char_dimensions( HDC hdc, TEXTMETRICW *metric, int *height ); extern HBITMAP get_display_bitmap(void); extern INT get_display_depth( UNICODE_STRING *name ); extern RECT get_display_rect( const WCHAR *display ); -extern UINT get_win_monitor_dpi( HWND hwnd ); +extern UINT get_win_monitor_dpi( HWND hwnd, UINT *raw_dpi ); extern RECT get_primary_monitor_rect( UINT dpi ); extern DWORD get_process_layout(void); extern COLORREF get_sys_color( int index ); @@ -193,7 +193,7 @@ extern RECT rect_thread_to_win_dpi( HWND hwnd, RECT rect ); extern HMONITOR monitor_from_window( HWND hwnd, UINT flags, UINT dpi ); extern MONITORINFO monitor_info_from_rect( RECT rect, UINT dpi ); extern MONITORINFO monitor_info_from_window( HWND hwnd, UINT flags ); -extern UINT monitor_dpi_from_rect( RECT rect, UINT dpi ); +extern UINT monitor_dpi_from_rect( RECT rect, UINT dpi, UINT *raw_dpi ); extern BOOL update_display_cache( BOOL force ); extern void user_lock(void); extern void user_unlock(void); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 181c00547c9..dda35b962c2 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -894,7 +894,7 @@ UINT get_window_dpi_awareness_context( HWND hwnd ) UINT get_dpi_for_window( HWND hwnd ) { WND *win; - UINT context = 0; + UINT raw_dpi, context = 0;
if (!(win = get_win_ptr( hwnd ))) { @@ -904,7 +904,7 @@ UINT get_dpi_for_window( HWND hwnd ) if (win == WND_DESKTOP) { RECT rect = {0}; - return monitor_dpi_from_rect( rect, get_thread_dpi() ); + return monitor_dpi_from_rect( rect, get_thread_dpi(), &raw_dpi ); } if (win != WND_OTHER_PROCESS) { @@ -921,7 +921,7 @@ UINT get_dpi_for_window( HWND hwnd ) SERVER_END_REQ; }
- if (NTUSER_DPI_CONTEXT_IS_MONITOR_AWARE( context )) return get_win_monitor_dpi( hwnd ); + if (NTUSER_DPI_CONTEXT_IS_MONITOR_AWARE( context )) return get_win_monitor_dpi( hwnd, &raw_dpi ); return NTUSER_DPI_CONTEXT_GET_DPI( context ); }
@@ -1910,7 +1910,7 @@ static struct window_surface *get_window_surface( HWND hwnd, UINT swp_flags, BOO HWND parent = NtUserGetAncestor( hwnd, GA_PARENT ); struct window_surface *new_surface; struct window_rects monitor_rects; - UINT monitor_dpi, style, ex_style; + UINT raw_dpi, monitor_dpi, style, ex_style; RECT dummy; HRGN shape;
@@ -1918,8 +1918,8 @@ static struct window_surface *get_window_surface( HWND hwnd, UINT swp_flags, BOO ex_style = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ); is_child = parent && parent != NtUserGetDesktopWindow();
- if (is_child) monitor_dpi = get_win_monitor_dpi( parent ); - else monitor_dpi = monitor_dpi_from_rect( rects->window, get_thread_dpi() ); + if (is_child) monitor_dpi = get_win_monitor_dpi( parent, &raw_dpi ); + else monitor_dpi = monitor_dpi_from_rect( rects->window, get_thread_dpi(), &raw_dpi );
if (get_window_region( hwnd, FALSE, &shape, &dummy )) shaped = FALSE; else if ((shaped = !!shape)) NtGdiDeleteObjectApp( shape ); @@ -2004,14 +2004,14 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags, stru struct window_rects old_rects; RECT extra_rects[3]; struct window_surface *old_surface; - UINT monitor_dpi; + UINT raw_dpi, monitor_dpi;
is_layered = new_surface && new_surface->alpha_mask; is_fullscreen = is_window_rect_full_screen( &new_rects->visible, get_thread_dpi() ); is_child = parent && parent != NtUserGetDesktopWindow();
- if (is_child) monitor_dpi = get_win_monitor_dpi( parent ); - else monitor_dpi = monitor_dpi_from_rect( new_rects->window, get_thread_dpi() ); + if (is_child) monitor_dpi = get_win_monitor_dpi( parent, &raw_dpi ); + else monitor_dpi = monitor_dpi_from_rect( new_rects->window, get_thread_dpi(), &raw_dpi );
get_window_rects( hwnd, COORDS_SCREEN, &old_rects, get_thread_dpi() ); if (IsRectEmpty( &valid_rects[0] ) || is_layered) valid_rects = NULL; @@ -2284,11 +2284,13 @@ int WINAPI NtUserSetWindowRgn( HWND hwnd, HRGN hrgn, BOOL redraw ) { UINT swp_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE; + UINT raw_dpi, dpi; HRGN monitor_hrgn;
if (!redraw) swp_flags |= SWP_NOREDRAW;
- monitor_hrgn = map_dpi_region( hrgn, get_thread_dpi(), get_win_monitor_dpi( hwnd ) ); + dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); + monitor_hrgn = map_dpi_region( hrgn, get_thread_dpi(), dpi ); user_driver->pSetWindowRgn( hwnd, monitor_hrgn, redraw ); if (monitor_hrgn) NtGdiDeleteObjectApp( monitor_hrgn );
@@ -2516,10 +2518,10 @@ HWND window_from_point( HWND hwnd, POINT pt, INT *hittest ) int i, res; HWND ret, *list; POINT win_pt; - int dpi; + UINT dpi, raw_dpi;
if (!hwnd) hwnd = get_desktop_window(); - if (!(dpi = get_thread_dpi())) dpi = get_win_monitor_dpi( hwnd ); + if (!(dpi = get_thread_dpi())) dpi = get_win_monitor_dpi( hwnd, &raw_dpi );
*hittest = HTNOWHERE;
@@ -3049,7 +3051,7 @@ static BOOL get_windows_offset( HWND hwnd_from, HWND hwnd_to, UINT dpi, BOOL *mi if (win == WND_OTHER_PROCESS) goto other_process; if (win != WND_DESKTOP) { - UINT dpi_from = dpi ? dpi : get_win_monitor_dpi( hwnd_from ); + UINT raw_dpi, dpi_from = dpi ? dpi : get_win_monitor_dpi( hwnd_from, &raw_dpi ); if (win->dwExStyle & WS_EX_LAYOUTRTL) { mirror_from = TRUE; @@ -3086,7 +3088,7 @@ static BOOL get_windows_offset( HWND hwnd_from, HWND hwnd_to, UINT dpi, BOOL *mi if (win == WND_OTHER_PROCESS) goto other_process; if (win != WND_DESKTOP) { - UINT dpi_to = dpi ? dpi : get_win_monitor_dpi( hwnd_to ); + UINT raw_dpi, dpi_to = dpi ? dpi : get_win_monitor_dpi( hwnd_to, &raw_dpi ); POINT pt = { 0, 0 }; if (win->dwExStyle & WS_EX_LAYOUTRTL) { @@ -3273,9 +3275,9 @@ static void dump_winpos_flags( UINT flags ) static void map_dpi_winpos( WINDOWPOS *winpos ) { RECT rect = {winpos->x, winpos->y, winpos->x + winpos->cx, winpos->y + winpos->cy}; - UINT dpi_from = get_thread_dpi(), dpi_to = get_dpi_for_window( winpos->hwnd ); + UINT raw_dpi, dpi_from = get_thread_dpi(), dpi_to = get_dpi_for_window( winpos->hwnd );
- if (!dpi_from) dpi_from = get_win_monitor_dpi( winpos->hwnd ); + if (!dpi_from) dpi_from = get_win_monitor_dpi( winpos->hwnd, &raw_dpi ); rect = map_dpi_rect( rect, dpi_from, dpi_to ); winpos->x = rect.left; winpos->y = rect.top; @@ -5366,7 +5368,7 @@ static void map_dpi_create_struct( CREATESTRUCTW *cs, UINT dpi_to )
if (!dpi_from || !dpi_to) { - UINT mon_dpi = monitor_dpi_from_rect( rect, get_thread_dpi() ); + UINT raw_dpi, mon_dpi = monitor_dpi_from_rect( rect, get_thread_dpi(), &raw_dpi ); if (!dpi_from) dpi_from = mon_dpi; else dpi_to = mon_dpi; } @@ -5919,7 +5921,10 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) }
case NtUserCallHwndParam_GetWinMonitorDpi: - return get_win_monitor_dpi( hwnd ); + { + UINT raw_dpi, dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); + return param == MDT_EFFECTIVE_DPI ? dpi : raw_dpi; + }
/* temporary exports */ case NtUserSetWindowStyle: diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 75e1d5bc8e2..5e99d1d95e6 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -78,7 +78,7 @@ void init_monitors( int width, int height ) monitor_rc_work = virtual_screen_rect;
if (!hwnd || !NtUserIsWindowVisible( hwnd )) return; - if (!NtUserGetWindowRect( hwnd, &rect, NtUserGetWinMonitorDpi( hwnd ) )) return; + if (!NtUserGetWindowRect( hwnd, &rect, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) )) return; if (rect.top) monitor_rc_work.bottom = rect.top; else monitor_rc_work.top = rect.bottom; TRACE( "found tray %p %s work area %s\n", hwnd, diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index eb2a2819e6f..3e4e9f1697d 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -98,7 +98,7 @@ static struct android_win_data *alloc_win_data( HWND hwnd ) { data->hwnd = hwnd; data->window = create_ioctl_window( hwnd, FALSE, - (float)NtUserGetWinMonitorDpi( hwnd ) / NtUserGetDpiForWindow( hwnd )); + (float)NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) / NtUserGetDpiForWindow( hwnd )); pthread_mutex_lock( &win_data_mutex ); win_data_context[context_idx(hwnd)] = data; } @@ -1101,7 +1101,7 @@ void ANDROID_SetParent( HWND hwnd, HWND parent, HWND old_parent ) TRACE( "win %p parent %p -> %p\n", hwnd, old_parent, parent );
data->parent = (parent == NtUserGetDesktopWindow()) ? 0 : parent; - ioctl_set_window_parent( hwnd, parent, (float)NtUserGetWinMonitorDpi( hwnd ) / NtUserGetDpiForWindow( hwnd )); + ioctl_set_window_parent( hwnd, parent, (float)NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) / NtUserGetDpiForWindow( hwnd )); release_win_data( data ); }
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index bccb0caff16..b071385ecd1 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -355,7 +355,7 @@ static void sync_window_min_max_info(HWND hwnd) { LONG style = NtUserGetWindowLongW(hwnd, GWL_STYLE); LONG exstyle = NtUserGetWindowLongW(hwnd, GWL_EXSTYLE); - UINT dpi = NtUserGetWinMonitorDpi(hwnd); + UINT dpi = NtUserGetWinMonitorDpi(hwnd, MDT_DEFAULT); RECT win_rect, primary_monitor_rect; MINMAXINFO minmax; LONG adjustedStyle; @@ -1134,7 +1134,7 @@ static HMONITOR monitor_from_point(POINT pt, UINT flags) */ static LRESULT move_window(HWND hwnd, WPARAM wparam) { - UINT dpi = NtUserGetWinMonitorDpi(hwnd); + UINT dpi = NtUserGetWinMonitorDpi(hwnd, MDT_DEFAULT); MSG msg; RECT origRect, movedRect, desktopRect; int hittest = (int)(wparam & 0x0f); @@ -1161,7 +1161,7 @@ static LRESULT move_window(HWND hwnd, WPARAM wparam) else captionHeight = 0;
- NtUserGetWindowRect(hwnd, &origRect, NtUserGetWinMonitorDpi(hwnd)); + NtUserGetWindowRect(hwnd, &origRect, NtUserGetWinMonitorDpi(hwnd, MDT_DEFAULT)); movedRect = origRect;
if (!hittest) diff --git a/dlls/winewayland.drv/wayland_surface.c b/dlls/winewayland.drv/wayland_surface.c index ab8f8ac4989..b7ef362df5c 100644 --- a/dlls/winewayland.drv/wayland_surface.c +++ b/dlls/winewayland.drv/wayland_surface.c @@ -970,8 +970,8 @@ void wayland_client_surface_attach(struct wayland_client_surface *client, HWND t client->toplevel = toplevel; }
- NtUserGetClientRect(client->hwnd, &client_rect, NtUserGetWinMonitorDpi(client->hwnd)); - NtUserMapWindowPoints(client->hwnd, toplevel, (POINT *)&client_rect, 2, NtUserGetWinMonitorDpi(client->hwnd)); + NtUserGetClientRect(client->hwnd, &client_rect, NtUserGetWinMonitorDpi(client->hwnd, MDT_DEFAULT)); + NtUserMapWindowPoints(client->hwnd, toplevel, (POINT *)&client_rect, 2, NtUserGetWinMonitorDpi(client->hwnd, MDT_DEFAULT));
wayland_surface_reconfigure_client(surface, client, &client_rect); /* Commit to apply subsurface positioning. */ diff --git a/dlls/winewayland.drv/window.c b/dlls/winewayland.drv/window.c index 04642ca28c7..a5de1318141 100644 --- a/dlls/winewayland.drv/window.c +++ b/dlls/winewayland.drv/window.c @@ -193,7 +193,7 @@ static void wayland_win_data_get_config(struct wayland_win_data *data, }
conf->state = window_state; - conf->scale = NtUserGetWinMonitorDpi(data->hwnd) / 96.0; + conf->scale = NtUserGetWinMonitorDpi(data->hwnd, MDT_DEFAULT) / 96.0; conf->visible = (style & WS_VISIBLE) == WS_VISIBLE; conf->managed = data->managed; } diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index c8fc76f5048..048375e5adb 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -917,7 +917,7 @@ static BOOL X11DRV_Expose( HWND hwnd, XEvent *xev )
release_win_data( data );
- NtUserExposeWindowSurface( hwnd, flags, &rect, NtUserGetWinMonitorDpi( hwnd ) ); + NtUserExposeWindowSurface( hwnd, flags, &rect, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) ); return TRUE; }
@@ -1391,7 +1391,7 @@ void X11DRV_SetFocus( HWND hwnd )
static HWND find_drop_window( HWND hQueryWnd, LPPOINT lpPt ) { - UINT dpi = NtUserGetWinMonitorDpi( hQueryWnd ); + UINT dpi = NtUserGetWinMonitorDpi( hQueryWnd, MDT_DEFAULT ); RECT tempRect;
if (!NtUserIsWindowEnabled(hQueryWnd)) return 0; diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index fed34a394e7..a8900f9c165 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -196,7 +196,7 @@ static HFONT X11DRV_SelectFont( PHYSDEV dev, HFONT hfont, UINT *aa_flags )
BOOL needs_offscreen_rendering( HWND hwnd, BOOL known_child ) { - if (NtUserGetDpiForWindow( hwnd ) != NtUserGetWinMonitorDpi( hwnd )) return TRUE; /* needs DPI scaling */ + if (NtUserGetDpiForWindow( hwnd ) != NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT )) return TRUE; /* needs DPI scaling */ if (NtUserGetAncestor( hwnd, GA_PARENT ) != NtUserGetDesktopWindow()) return TRUE; /* child window, needs compositing */ if (NtUserGetWindowRelative( hwnd, GW_CHILD )) return TRUE; /* window has children, needs compositing */ if (known_child) return TRUE; /* window is/have children, needs compositing */ diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index f7623121b32..d82fd01233d 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -1898,8 +1898,8 @@ static void present_gl_drawable( HWND hwnd, HDC hdc, struct gl_drawable *gl, BOO
if (flush) XFlush( gdi_display );
- NtUserGetClientRect( hwnd, &rect_dst, NtUserGetWinMonitorDpi( hwnd ) ); - NtUserMapWindowPoints( hwnd, toplevel, (POINT *)&rect_dst, 2, NtUserGetWinMonitorDpi( hwnd ) ); + NtUserGetClientRect( hwnd, &rect_dst, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) ); + NtUserMapWindowPoints( hwnd, toplevel, (POINT *)&rect_dst, 2, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) );
if ((data = get_win_data( toplevel ))) { diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index f300ddffe58..8705b470740 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -221,8 +221,8 @@ static void X11DRV_vulkan_surface_presented( HWND hwnd, void *private, VkResult window = X11DRV_get_whole_window( toplevel ); region = get_dc_monitor_region( hwnd, hdc );
- NtUserGetClientRect( hwnd, &rect_dst, NtUserGetWinMonitorDpi( hwnd ) ); - NtUserMapWindowPoints( hwnd, toplevel, (POINT *)&rect_dst, 2, NtUserGetWinMonitorDpi( hwnd ) ); + NtUserGetClientRect( hwnd, &rect_dst, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) ); + NtUserMapWindowPoints( hwnd, toplevel, (POINT *)&rect_dst, 2, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) );
if ((data = get_win_data( toplevel ))) { diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index b3747dda705..2fcebbe3dbe 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1601,7 +1601,7 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual, Colormap colo HWND parent = NtUserGetAncestor( hwnd, GA_PARENT ); if (parent == NtUserGetDesktopWindow() || NtUserGetAncestor( parent, GA_PARENT )) return 0; if (!(data = alloc_win_data( thread_init_display(), hwnd ))) return 0; - NtUserGetClientRect( hwnd, &data->rects.client, NtUserGetWinMonitorDpi( hwnd ) ); + NtUserGetClientRect( hwnd, &data->rects.client, NtUserGetWinMonitorDpi( hwnd, MDT_DEFAULT ) ); data->rects.window = data->rects.visible = data->rects.client; }
diff --git a/include/ntuser.h b/include/ntuser.h index fb6955ea0ec..558dfacea20 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1544,9 +1544,9 @@ static inline BOOL NtUserExposeWindowSurface( HWND hwnd, UINT flags, const RECT return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_ExposeWindowSurface ); }
-static inline UINT NtUserGetWinMonitorDpi( HWND hwnd ) +static inline UINT NtUserGetWinMonitorDpi( HWND hwnd, MONITOR_DPI_TYPE type ) { - return NtUserCallHwndParam( hwnd, 0, NtUserCallHwndParam_GetWinMonitorDpi ); + return NtUserCallHwndParam( hwnd, type, NtUserCallHwndParam_GetWinMonitorDpi ); }
#endif /* _NTUSER_ */