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 {