From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57506 --- dlls/win32u/driver.c | 11 ++++++++++- dlls/win32u/ntgdi_private.h | 1 + dlls/win32u/sysparams.c | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index e2ef78f1818..22e48fa6782 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -1006,7 +1006,7 @@ static BOOL load_desktop_driver( HWND hwnd ) * Each entry point simply loads the real driver and chains to it. */
-static const struct user_driver_funcs *load_driver(void) +static void load_display_driver(void) { USEROBJECTFLAGS flags; HWINSTA winstation; @@ -1020,11 +1020,20 @@ static const struct user_driver_funcs *load_driver(void)
__wine_set_user_driver( &null_user_driver, WINE_GDI_DRIVER_VERSION ); } +}
+static const struct user_driver_funcs *load_driver(void) +{ + load_display_driver(); update_display_cache( FALSE ); return user_driver; }
+void init_display_driver(void) +{ + if (user_driver == &lazy_load_driver) load_display_driver(); +} + /********************************************************************** * get_display_driver */ diff --git a/dlls/win32u/ntgdi_private.h b/dlls/win32u/ntgdi_private.h index 679eea6538d..ce54a6591a0 100644 --- a/dlls/win32u/ntgdi_private.h +++ b/dlls/win32u/ntgdi_private.h @@ -227,6 +227,7 @@ extern const struct gdi_dc_funcs dib_driver; extern const struct gdi_dc_funcs path_driver; extern const struct gdi_dc_funcs font_driver; extern const struct gdi_dc_funcs *get_display_driver(void); +extern void init_display_driver(void);
/* font.c */
diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 230c3faa262..2ae72397bc5 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -2243,6 +2243,8 @@ static BOOL lock_display_devices( BOOL force ) WCHAR name[MAX_PATH]; BOOL ret = TRUE;
+ init_display_driver(); /* make sure to load the driver before anything else */ + /* services do not have any adapters, only a virtual monitor */ if (NtUserGetObjectInformation( winstation, UOI_NAME, name, sizeof(name), NULL ) && !wcscmp( name, wine_service_station_name )) @@ -2254,8 +2256,6 @@ static BOOL lock_display_devices( BOOL force ) return TRUE; }
- if (!force) get_display_driver(); /* make sure at least to load the user driver */ - pthread_mutex_lock( &display_lock );
if (!force && !update_display_cache_from_registry()) force = TRUE;