From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/driver.c | 11 +++++++++++ dlls/win32u/sysparams.c | 11 +++++++++++ dlls/winex11.drv/display.c | 13 +++++-------- dlls/winex11.drv/init.c | 1 + dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/xrandr.c | 2 +- include/wine/gdi_driver.h | 1 + 7 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index ee4a6534b50..d9c1f0d6f6d 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -769,6 +769,10 @@ static BOOL nulldrv_UpdateDisplayDevices( const struct gdi_device_manager *manag return FALSE; }
+static void nulldrv_VirtualScreenRectChanged( RECT *old_rect, RECT *new_rect ) +{ +} + static BOOL nulldrv_CreateDesktopWindow( HWND hwnd ) { return TRUE; @@ -1112,6 +1116,11 @@ static BOOL loaderdrv_UpdateDisplayDevices( const struct gdi_device_manager *man return load_driver()->pUpdateDisplayDevices( manager, force, param ); }
+static void loaderdrv_VirtualScreenRectChanged( RECT *old_rect, RECT *new_rect ) +{ + return load_driver()->pVirtualScreenRectChanged( old_rect, new_rect ); +} + static BOOL loaderdrv_CreateDesktopWindow( HWND hwnd ) { return load_driver()->pCreateDesktopWindow( hwnd ); @@ -1180,6 +1189,7 @@ static const struct user_driver_funcs lazy_load_driver = loaderdrv_ChangeDisplaySettings, loaderdrv_GetCurrentDisplaySettings, loaderdrv_UpdateDisplayDevices, + loaderdrv_VirtualScreenRectChanged, /* windowing functions */ loaderdrv_CreateDesktopWindow, loaderdrv_CreateWindow, @@ -1255,6 +1265,7 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version SET_USER_FUNC(ChangeDisplaySettings); SET_USER_FUNC(GetCurrentDisplaySettings); SET_USER_FUNC(UpdateDisplayDevices); + SET_USER_FUNC(VirtualScreenRectChanged); SET_USER_FUNC(CreateDesktopWindow); SET_USER_FUNC(CreateWindow); SET_USER_FUNC(DesktopWindowProc); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index efa17aec825..0d0d3648b38 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -1555,7 +1555,9 @@ static BOOL update_display_cache_from_registry(void) static BOOL update_display_cache( BOOL force ) { HWINSTA winstation = NtUserGetProcessWindowStation(); + RECT old_virtual_rect = {0}, new_virtual_rect = {0}; struct device_manager_ctx ctx = {0}; + struct monitor *monitor; USEROBJECTFLAGS flags;
/* services do not have any adapters, only a virtual monitor */ @@ -1569,6 +1571,9 @@ static BOOL update_display_cache( BOOL force ) return TRUE; }
+ LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) + union_rect( &old_virtual_rect, &old_virtual_rect, &monitor->rc_monitor ); + if (!user_driver->pUpdateDisplayDevices( &device_manager, force, &ctx ) && force) { static const DEVMODEW modes[] = @@ -1623,6 +1628,12 @@ static BOOL update_display_cache( BOOL force ) return update_display_cache( TRUE ); }
+ LIST_FOR_EACH_ENTRY( monitor, &monitors, struct monitor, entry ) + union_rect( &new_virtual_rect, &new_virtual_rect, &monitor->rc_monitor ); + + if (!IsRectEmpty( &old_virtual_rect ) && !EqualRect( &old_virtual_rect, &new_virtual_rect )) + user_driver->pVirtualScreenRectChanged( &old_virtual_rect, &new_virtual_rect ); + return TRUE; }
diff --git a/dlls/winex11.drv/display.c b/dlls/winex11.drv/display.c index 76defa7f0e8..b80ec825980 100644 --- a/dlls/winex11.drv/display.c +++ b/dlls/winex11.drv/display.c @@ -419,7 +419,7 @@ LONG X11DRV_ChangeDisplaySettings( LPDEVMODEW displays, HWND hwnd, DWORD flags, if (ret == DISP_CHANGE_SUCCESSFUL) ret = apply_display_settings( displays, ids, TRUE ); if (ret == DISP_CHANGE_SUCCESSFUL) - X11DRV_DisplayDevices_Update(); + X11DRV_DisplayDevices_Init(TRUE);
done: free( ids ); @@ -558,22 +558,19 @@ void X11DRV_DisplayDevices_RegisterEventHandlers(void) handler->register_event_handlers(); }
-void X11DRV_DisplayDevices_Update(void) +void X11DRV_VirtualScreenRectChanged( RECT *old_rect, RECT *new_rect ) { - RECT old_virtual_rect, new_virtual_rect; DWORD tid, pid; HWND foreground; UINT mask = 0, i; HWND *list;
- old_virtual_rect = NtUserGetVirtualScreenRect(); - X11DRV_DisplayDevices_Init(TRUE); - new_virtual_rect = NtUserGetVirtualScreenRect(); + TRACE( "old_rect %s, new_rect %s.\n", wine_dbgstr_rect(old_rect), wine_dbgstr_rect(new_rect) );
/* Calculate XReconfigureWMWindow() mask */ - if (old_virtual_rect.left != new_virtual_rect.left) + if (old_rect->left != new_rect->left) mask |= CWX; - if (old_virtual_rect.top != new_virtual_rect.top) + if (old_rect->top != new_rect->top) mask |= CWY;
X11DRV_resize_desktop(); diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 4ebe3a16367..6d7614a45da 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -406,6 +406,7 @@ static const struct user_driver_funcs x11drv_funcs = .pChangeDisplaySettings = X11DRV_ChangeDisplaySettings, .pGetCurrentDisplaySettings = X11DRV_GetCurrentDisplaySettings, .pUpdateDisplayDevices = X11DRV_UpdateDisplayDevices, + .pVirtualScreenRectChanged = X11DRV_VirtualScreenRectChanged, .pCreateDesktopWindow = X11DRV_CreateDesktopWindow, .pCreateWindow = X11DRV_CreateWindow, .pDesktopWindowProc = X11DRV_DesktopWindowProc, diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index d1a70da9998..5c17d15047b 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -215,6 +215,7 @@ extern BOOL X11DRV_GetCursorPos( LPPOINT pos ) DECLSPEC_HIDDEN; extern BOOL X11DRV_ClipCursor( LPCRECT clip ) DECLSPEC_HIDDEN; extern LONG X11DRV_ChangeDisplaySettings( LPDEVMODEW displays, HWND hwnd, DWORD flags, LPVOID lpvoid ) DECLSPEC_HIDDEN; extern BOOL X11DRV_GetCurrentDisplaySettings( LPCWSTR name, LPDEVMODEW devmode ) DECLSPEC_HIDDEN; +extern void X11DRV_VirtualScreenRectChanged( RECT *old_rect, RECT *new_rect ) DECLSPEC_HIDDEN; extern BOOL X11DRV_UpdateDisplayDevices( const struct gdi_device_manager *device_manager, BOOL force, void *param ) DECLSPEC_HIDDEN; extern BOOL X11DRV_CreateDesktopWindow( HWND hwnd ) DECLSPEC_HIDDEN; @@ -804,7 +805,6 @@ extern BOOL get_host_primary_gpu(struct gdi_gpu *gpu) DECLSPEC_HIDDEN; extern void X11DRV_DisplayDevices_SetHandler(const struct x11drv_display_device_handler *handler) DECLSPEC_HIDDEN; extern void X11DRV_DisplayDevices_Init(BOOL force) DECLSPEC_HIDDEN; extern void X11DRV_DisplayDevices_RegisterEventHandlers(void) DECLSPEC_HIDDEN; -extern void X11DRV_DisplayDevices_Update(void) DECLSPEC_HIDDEN; /* Display device handler used in virtual desktop mode */ extern struct x11drv_display_device_handler desktop_handler DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index a0ac2cb5ec1..3d1b6a917cf 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -1198,7 +1198,7 @@ static BOOL xrandr14_device_change_handler( HWND hwnd, XEvent *event ) xrandr14_invalidate_current_mode_cache(); if (hwnd == NtUserGetDesktopWindow() && NtUserGetWindowThread( hwnd, NULL ) == GetCurrentThreadId()) { - X11DRV_DisplayDevices_Update(); + X11DRV_DisplayDevices_Init(TRUE); init_registry_display_settings(); } return FALSE; diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index 596d27156af..27f5ce27d58 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -300,6 +300,7 @@ struct user_driver_funcs LONG (*pChangeDisplaySettings)(LPDEVMODEW,HWND,DWORD,LPVOID); BOOL (*pGetCurrentDisplaySettings)(LPCWSTR,LPDEVMODEW); BOOL (*pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*); + void (*pVirtualScreenRectChanged)(RECT*,RECT*); /* windowing functions */ BOOL (*pCreateDesktopWindow)(HWND); BOOL (*pCreateWindow)(HWND);