From: Aida JonikienÄ— aidas957@gmail.com
This fixes segfaults and explorer.exe being stuck when this driver fails to load. --- dlls/winewayland.drv/wayland.c | 28 ++++++++++++++++++++++--- dlls/winewayland.drv/waylanddrv_main.c | 29 +------------------------- 2 files changed, 26 insertions(+), 31 deletions(-)
diff --git a/dlls/winewayland.drv/wayland.c b/dlls/winewayland.drv/wayland.c index 35dbcb5f0ef..e2f02e38ca5 100644 --- a/dlls/winewayland.drv/wayland.c +++ b/dlls/winewayland.drv/wayland.c @@ -32,6 +32,25 @@
WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv);
+static const struct user_driver_funcs waylanddrv_funcs = +{ + .pClipCursor = WAYLAND_ClipCursor, + .pDesktopWindowProc = WAYLAND_DesktopWindowProc, + .pDestroyWindow = WAYLAND_DestroyWindow, + .pKbdLayerDescriptor = WAYLAND_KbdLayerDescriptor, + .pReleaseKbdTables = WAYLAND_ReleaseKbdTables, + .pSetCursor = WAYLAND_SetCursor, + .pSetWindowText = WAYLAND_SetWindowText, + .pSysCommand = WAYLAND_SysCommand, + .pUpdateDisplayDevices = WAYLAND_UpdateDisplayDevices, + .pWindowMessage = WAYLAND_WindowMessage, + .pWindowPosChanged = WAYLAND_WindowPosChanged, + .pWindowPosChanging = WAYLAND_WindowPosChanging, + .pCreateWindowSurface = WAYLAND_CreateWindowSurface, + .pVulkanInit = WAYLAND_VulkanInit, + .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, +}; + struct wayland process_wayland = { .seat.mutex = PTHREAD_MUTEX_INITIALIZER, @@ -244,8 +263,7 @@ BOOL wayland_process_init(void) wl_registry_add_listener(process_wayland.wl_registry, ®istry_listener, NULL);
/* We need two roundtrips. One to get and bind globals, one to handle all - * initial events produced from registering the globals. */ - wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue); + * initial events produced from registering the globals (which is ran later). */ wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue);
/* Check for required protocol globals. */ @@ -285,7 +303,11 @@ BOOL wayland_process_init(void) return FALSE; }
- process_wayland.initialized = TRUE; + __wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION); + + /* The second roundtrip is delayed to avoid display device initialization. */ + wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue);
+ process_wayland.initialized = TRUE; return TRUE; } diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index 47c1299dd01..369086fda2c 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -33,25 +33,6 @@
char *process_name = NULL;
-static const struct user_driver_funcs waylanddrv_funcs = -{ - .pClipCursor = WAYLAND_ClipCursor, - .pDesktopWindowProc = WAYLAND_DesktopWindowProc, - .pDestroyWindow = WAYLAND_DestroyWindow, - .pKbdLayerDescriptor = WAYLAND_KbdLayerDescriptor, - .pReleaseKbdTables = WAYLAND_ReleaseKbdTables, - .pSetCursor = WAYLAND_SetCursor, - .pSetWindowText = WAYLAND_SetWindowText, - .pSysCommand = WAYLAND_SysCommand, - .pUpdateDisplayDevices = WAYLAND_UpdateDisplayDevices, - .pWindowMessage = WAYLAND_WindowMessage, - .pWindowPosChanged = WAYLAND_WindowPosChanged, - .pWindowPosChanging = WAYLAND_WindowPosChanging, - .pCreateWindowSurface = WAYLAND_CreateWindowSurface, - .pVulkanInit = WAYLAND_VulkanInit, - .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, -}; - static void wayland_init_process_name(void) { WCHAR *p, *appname; @@ -82,19 +63,11 @@ static void wayland_init_process_name(void)
static NTSTATUS waylanddrv_unix_init(void *arg) { - /* Set the user driver functions now so that they are available during - * our initialization. We clear them on error. */ - __wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION); - wayland_init_process_name();
- if (!wayland_process_init()) goto err; + if (!wayland_process_init()) return STATUS_UNSUCCESSFUL;
return 0; - -err: - __wine_set_user_driver(NULL, WINE_GDI_DRIVER_VERSION); - return STATUS_UNSUCCESSFUL; }
static NTSTATUS waylanddrv_unix_read_events(void *arg)