From: Alexandros Frantzis alexandros.frantzis@collabora.com
Add a user driver function to provide information about the virtual display devices and their mappings to host display devices. --- dlls/win32u/driver.c | 11 +++++++++++ dlls/win32u/sysparams.c | 38 ++++++++++++++++++++++++++++++++++++++ include/wine/gdi_driver.h | 7 +++++++ 3 files changed, 56 insertions(+)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index 7fcdbc4c383..33e82b7bf5e 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -813,6 +813,10 @@ static BOOL nulldrv_UpdateDisplayDevices( const struct gdi_device_manager *manag return FALSE; }
+static void nulldrv_NotifyVirtualDevices( const struct gdi_virtual *virtual ) +{ +} + static BOOL nulldrv_CreateDesktop( const WCHAR *name, UINT width, UINT height ) { return TRUE; @@ -1218,6 +1222,11 @@ static BOOL loaderdrv_UpdateDisplayDevices( const struct gdi_device_manager *man return load_driver()->pUpdateDisplayDevices( manager, force, param ); }
+static void loaderdrv_NotifyVirtualDevices( const struct gdi_virtual *virtual ) +{ + load_driver()->pNotifyVirtualDevices( virtual ); +} + static BOOL loaderdrv_CreateDesktop( const WCHAR *name, UINT width, UINT height ) { return load_driver()->pCreateDesktop( name, width, height ); @@ -1303,6 +1312,7 @@ static const struct user_driver_funcs lazy_load_driver = loaderdrv_GetCurrentDisplaySettings, loaderdrv_GetDisplayDepth, loaderdrv_UpdateDisplayDevices, + loaderdrv_NotifyVirtualDevices, /* windowing functions */ loaderdrv_CreateDesktop, loaderdrv_CreateWindow, @@ -1390,6 +1400,7 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version SET_USER_FUNC(GetCurrentDisplaySettings); SET_USER_FUNC(GetDisplayDepth); SET_USER_FUNC(UpdateDisplayDevices); + SET_USER_FUNC(NotifyVirtualDevices); SET_USER_FUNC(CreateDesktop); SET_USER_FUNC(CreateWindow); SET_USER_FUNC(DesktopWindowProc); diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index c66371f1b23..ca3e4c941c6 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2147,6 +2147,32 @@ static BOOL desktop_update_display_devices( BOOL force, struct device_manager_ct return TRUE; }
+static struct gdi_virtual *get_virtual_settings( void ) +{ + struct gdi_virtual *virtual, *settings; + struct adapter *adapter; + + /* allocate an extra entry for easier iteration */ + if (!(settings = calloc( list_count( &adapters ) + 1, sizeof(*settings) ))) return NULL; + virtual = settings; + + LIST_FOR_EACH_ENTRY( adapter, &adapters, struct adapter, entry ) + { + virtual->mode.dmSize = sizeof(DEVMODEW); + if (!adapter_get_current_settings( adapter, &virtual->mode )) + { + free( settings ); + return NULL; + } + + lstrcpyW( virtual->mode.dmDeviceName, adapter->dev.device_name ); + memcpy( virtual->virtual_id, adapter->virtual_id, sizeof(virtual->virtual_id) ); + ++virtual; + } + + return settings; +} + BOOL update_display_cache( BOOL force ) { static const WCHAR wine_service_station_name[] = @@ -2155,6 +2181,7 @@ BOOL update_display_cache( BOOL force ) struct device_manager_ctx ctx = {0}; BOOL was_virtual_desktop, ret; WCHAR name[MAX_PATH]; + BOOL force_desktop_update = FALSE;
/* services do not have any adapters, only a virtual monitor */ if (NtUserGetObjectInformation( winstation, UOI_NAME, name, sizeof(name), NULL ) @@ -2174,6 +2201,7 @@ BOOL update_display_cache( BOOL force ) if (ret && is_virtual_desktop()) { reset_display_manager_ctx( &ctx ); + force_desktop_update = force || !was_virtual_desktop; ret = desktop_update_display_devices( force || !was_virtual_desktop, &ctx ); }
@@ -2197,6 +2225,16 @@ BOOL update_display_cache( BOOL force ) return update_display_cache( TRUE ); }
+ if (force_desktop_update) + { + struct gdi_virtual *settings; + pthread_mutex_lock( &display_lock ); + settings = get_virtual_settings(); + if (settings) user_driver->pNotifyVirtualDevices( settings ); + pthread_mutex_unlock( &display_lock ); + free(settings); + } + return TRUE; }
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index bd6c1699f13..8aee5c65643 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -278,6 +278,12 @@ struct gdi_device_manager void (*add_mode)( const DEVMODEW *mode, BOOL current, void *param ); };
+struct gdi_virtual +{ + DEVMODEW mode; + WCHAR virtual_id[128]; +}; + #define WINE_DM_UNSUPPORTED 0x80000000
struct tagUPDATELAYEREDWINDOWINFO; @@ -322,6 +328,7 @@ struct user_driver_funcs BOOL (*pGetCurrentDisplaySettings)(LPCWSTR,BOOL,LPDEVMODEW); INT (*pGetDisplayDepth)(LPCWSTR,BOOL); BOOL (*pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*); + void (*pNotifyVirtualDevices)(const struct gdi_virtual *); /* windowing functions */ BOOL (*pCreateDesktop)(const WCHAR *,UINT,UINT); BOOL (*pCreateWindow)(HWND);