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