Jacek Caban : win32u: Introduce UpdateDisplayDevice user driver entry point.
Alexandre Julliard
julliard at winehq.org
Tue Nov 30 16:18:50 CST 2021
Module: wine
Branch: master
Commit: f8817ce2d588b37414de503bae5f58d39a7070b7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f8817ce2d588b37414de503bae5f58d39a7070b7
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Nov 30 13:24:28 2021 +0100
win32u: Introduce UpdateDisplayDevice user driver entry point.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/driver.c | 1 +
dlls/win32u/driver.c | 13 ++++++++
dlls/win32u/sysparams.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++-
include/wine/gdi_driver.h | 39 +++++++++++++++++++++++-
4 files changed, 126 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index a1a64f42b6f..9ff676aca22 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -347,6 +347,7 @@ static struct user_driver_funcs lazy_load_driver =
loaderdrv_EnumDisplayMonitors,
loaderdrv_EnumDisplaySettingsEx,
loaderdrv_GetMonitorInfo,
+ NULL,
/* windowing functions */
loaderdrv_CreateDesktopWindow,
loaderdrv_CreateWindow,
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c
index 9f682fa8eea..93c2ff1da4c 100644
--- a/dlls/win32u/driver.c
+++ b/dlls/win32u/driver.c
@@ -832,6 +832,11 @@ static BOOL CDECL nulldrv_GetMonitorInfo( HMONITOR handle, MONITORINFO *info )
return FALSE;
}
+static void CDECL nulldrv_UpdateDisplayDevices( const struct gdi_device_manager *manager,
+ BOOL force, void *param )
+{
+}
+
static BOOL CDECL nulldrv_CreateDesktopWindow( HWND hwnd )
{
return TRUE;
@@ -1044,6 +1049,12 @@ static void CDECL loaderdrv_UpdateClipboard(void)
load_driver()->pUpdateClipboard();
}
+static void CDECL loaderdrv_UpdateDisplayDevices( const struct gdi_device_manager *manager,
+ BOOL force, void *param )
+{
+ load_driver()->pUpdateDisplayDevices( manager, force, param );
+}
+
static const struct user_driver_funcs lazy_load_driver =
{
.pActivateKeyboardLayout = loaderdrv_ActivateKeyboardLayout,
@@ -1053,6 +1064,7 @@ static const struct user_driver_funcs lazy_load_driver =
.pToUnicodeEx = loaderdrv_ToUnicodeEx,
.pUnregisterHotKey = loaderdrv_UnregisterHotKey,
.pVkKeyScanEx = loaderdrv_VkKeyScanEx,
+ .pUpdateDisplayDevices = loaderdrv_UpdateDisplayDevices,
.pUpdateClipboard = loaderdrv_UpdateClipboard,
.pScrollDC = nulldrv_ScrollDC,
};
@@ -1093,6 +1105,7 @@ void CDECL __wine_set_display_driver( struct user_driver_funcs *driver, UINT ver
SET_USER_FUNC(EnumDisplayMonitors);
SET_USER_FUNC(EnumDisplaySettingsEx);
SET_USER_FUNC(GetMonitorInfo);
+ SET_USER_FUNC(UpdateDisplayDevices);
SET_USER_FUNC(CreateDesktopWindow);
SET_USER_FUNC(CreateWindow);
SET_USER_FUNC(DestroyWindow);
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c
index 1074a2ad797..871c2a50e43 100644
--- a/dlls/win32u/sysparams.c
+++ b/dlls/win32u/sysparams.c
@@ -336,7 +336,40 @@ static BOOL read_monitor_settings( struct adapter *adapter, DWORD index, struct
return TRUE;
}
-static BOOL update_display_cache(void)
+struct device_manager_ctx
+{
+ unsigned int gpu_count;
+};
+
+static void add_gpu( const struct gdi_gpu *gpu, void *param )
+{
+ struct device_manager_ctx *ctx = param;
+ FIXME( "\n" );
+ ctx->gpu_count++;
+}
+
+static void add_adapter( const struct gdi_adapter *adapter, void *param )
+{
+ FIXME( "\n" );
+}
+
+static void add_monitor( const struct gdi_monitor *monitor, void *param )
+{
+ FIXME( "\n" );
+}
+
+static const struct gdi_device_manager device_manager =
+{
+ add_gpu,
+ add_adapter,
+ add_monitor,
+};
+
+static void release_display_manager_ctx( struct device_manager_ctx *ctx )
+{
+}
+
+static BOOL update_display_cache_from_registry(void)
{
DWORD adapter_id, monitor_id, size;
KEY_FULL_INFORMATION key;
@@ -409,6 +442,46 @@ static BOOL update_display_cache(void)
return ret;
}
+static BOOL update_display_cache(void)
+{
+ struct device_manager_ctx ctx = { 0 };
+
+ user_driver->pUpdateDisplayDevices( &device_manager, FALSE, &ctx );
+ release_display_manager_ctx( &ctx );
+
+ if (update_display_cache_from_registry()) return TRUE;
+ if (ctx.gpu_count)
+ {
+ ERR( "driver reported devices, but we failed to read them\n" );
+ return FALSE;
+ }
+
+ user_driver->pUpdateDisplayDevices( &device_manager, TRUE, &ctx );
+ if (!ctx.gpu_count)
+ {
+ static const struct gdi_monitor default_monitor =
+ {
+ .rc_work.right = 1024,
+ .rc_work.bottom = 768,
+ .rc_monitor.right = 1024,
+ .rc_monitor.bottom = 768,
+ .state_flags = DISPLAY_DEVICE_ACTIVE | DISPLAY_DEVICE_ATTACHED,
+ };
+
+ TRACE( "adding default fake monitor\n ");
+ add_monitor( &default_monitor, &ctx );
+ }
+ release_display_manager_ctx( &ctx );
+
+ if (!update_display_cache_from_registry())
+ {
+ ERR( "failed to read display config\n" );
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static BOOL lock_display_devices(void)
{
if (!update_display_cache()) return FALSE;
diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h
index 994b082d5b4..b8e088282e5 100644
--- a/include/wine/gdi_driver.h
+++ b/include/wine/gdi_driver.h
@@ -167,7 +167,7 @@ struct gdi_dc_funcs
};
/* increment this when you change the DC function table */
-#define WINE_GDI_DRIVER_VERSION 70
+#define WINE_GDI_DRIVER_VERSION 71
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */
#define GDI_PRIORITY_FONT_DRV 100 /* any font driver */
@@ -229,6 +229,42 @@ static inline ULONG window_surface_release( struct window_surface *surface )
return ret;
}
+/* display manager interface, used to initialize display device registry data */
+
+struct gdi_gpu
+{
+ ULONG_PTR id;
+ WCHAR name[128]; /* name */
+ UINT vendor_id; /* PCI ID */
+ UINT device_id;
+ UINT subsys_id;
+ UINT revision_id;
+ GUID vulkan_uuid; /* Vulkan device UUID */
+};
+
+struct gdi_adapter
+{
+ ULONG_PTR id;
+ DWORD state_flags;
+};
+
+struct gdi_monitor
+{
+ WCHAR name[128]; /* name */
+ RECT rc_monitor; /* RcMonitor in MONITORINFO struct */
+ RECT rc_work; /* RcWork in MONITORINFO struct */
+ DWORD state_flags; /* StateFlags in DISPLAY_DEVICE struct */
+ unsigned char *edid; /* Extended Device Identification Data */
+ UINT edid_len;
+};
+
+struct gdi_device_manager
+{
+ void (*add_gpu)( const struct gdi_gpu *gpu, void *param );
+ void (*add_adapter)( const struct gdi_adapter *adapter, void *param );
+ void (*add_monitor)( const struct gdi_monitor *monitor, void *param );
+};
+
struct tagUPDATELAYEREDWINDOWINFO;
struct user_driver_funcs
@@ -258,6 +294,7 @@ struct user_driver_funcs
BOOL (CDECL *pEnumDisplayMonitors)(HDC,LPRECT,MONITORENUMPROC,LPARAM);
BOOL (CDECL *pEnumDisplaySettingsEx)(LPCWSTR,DWORD,LPDEVMODEW,DWORD);
BOOL (CDECL *pGetMonitorInfo)(HMONITOR,MONITORINFO*);
+ void (CDECL *pUpdateDisplayDevices)(const struct gdi_device_manager *,BOOL,void*);
/* windowing functions */
BOOL (CDECL *pCreateDesktopWindow)(HWND);
BOOL (CDECL *pCreateWindow)(HWND);
More information about the wine-cvs
mailing list