Module: wine Branch: master Commit: d7ec8fb6a3ce6b70646c3dfa51be1fb68364a782 URL: https://gitlab.winehq.org/wine/wine/-/commit/d7ec8fb6a3ce6b70646c3dfa51be1fb...
Author: Alexandros Frantzis alexandros.frantzis@collabora.com Date: Fri Sep 22 14:00:03 2023 +0300
winewayland.drv: Fix removal of wl_seat globals.
Store and compare against the wl_seat global id (aka name) during global_remove, since the global id is distinct from the wl_proxy id which we were previously checking.
---
dlls/winewayland.drv/wayland.c | 5 +++-- dlls/winewayland.drv/waylanddrv.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/winewayland.drv/wayland.c b/dlls/winewayland.drv/wayland.c index 700eb41fee7..b8c69a105cb 100644 --- a/dlls/winewayland.drv/wayland.c +++ b/dlls/winewayland.drv/wayland.c @@ -134,6 +134,7 @@ static void registry_handle_global(void *data, struct wl_registry *registry, pthread_mutex_lock(&seat->mutex); seat->wl_seat = wl_registry_bind(registry, id, &wl_seat_interface, version < 5 ? version : 5); + seat->global_id = id; wl_seat_add_listener(seat->wl_seat, &seat_listener, NULL); pthread_mutex_unlock(&seat->mutex); } @@ -158,14 +159,14 @@ static void registry_handle_global_remove(void *data, struct wl_registry *regist }
seat = &process_wayland.seat; - if (seat->wl_seat && - wl_proxy_get_id((struct wl_proxy *)seat->wl_seat) == id) + if (seat->wl_seat && seat->global_id == id) { TRACE("removing seat\n"); if (process_wayland.pointer.wl_pointer) wayland_pointer_deinit(); pthread_mutex_lock(&seat->mutex); wl_seat_release(seat->wl_seat); seat->wl_seat = NULL; + seat->global_id = 0; pthread_mutex_unlock(&seat->mutex); } } diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 4c6eb170900..faff529940d 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -83,6 +83,7 @@ struct wayland_pointer struct wayland_seat { struct wl_seat *wl_seat; + uint32_t global_id; pthread_mutex_t mutex; };