From 819404c43b2dd390d821e8bb057c46dc389c459a Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Thu, 21 Jul 2022 02:47:20 +0200 Subject: [PATCH] xwayland: (Re)set seat when xwayland is ready For some reason wlroots will reset the seat assigned to xwayland to NULL whenever Xwayland terminates. This patch restores the seat whenever Xwayland is ready again. Fixes #166 Fixes #444 Thanks @droc12345 for figuring out the actual issue. --- include/labwc.h | 1 + src/server.c | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/include/labwc.h b/include/labwc.h index cae25f31..fd738c15 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -165,6 +165,7 @@ struct server { struct wl_listener xdg_toplevel_decoration; #if HAVE_XWAYLAND struct wlr_xwayland *xwayland; + struct wl_listener xwayland_ready; struct wl_listener new_xwayland_surface; #endif diff --git a/src/server.c b/src/server.c index 857d3e49..f2f68498 100644 --- a/src/server.c +++ b/src/server.c @@ -174,6 +174,16 @@ handle_drm_lease_request(struct wl_listener *listener, void *data) } } +#if HAVE_XWAYLAND +static void +handle_xwayland_ready(struct wl_listener *listener, void *data) +{ + struct server *server = + wl_container_of(listener, server, xwayland_ready); + wlr_xwayland_set_seat(server->xwayland, server->seat.seat); +} +#endif + void server_init(struct server *server) { @@ -403,6 +413,10 @@ server_init(struct server *server) wl_signal_add(&server->xwayland->events.new_surface, &server->new_xwayland_surface); + server->xwayland_ready.notify = handle_xwayland_ready; + wl_signal_add(&server->xwayland->events.ready, + &server->xwayland_ready); + if (setenv("DISPLAY", server->xwayland->display_name, true) < 0) { wlr_log_errno(WLR_ERROR, "unable to set DISPLAY for xwayland"); } else { @@ -457,10 +471,6 @@ server_start(struct server *server) } else { wlr_log(WLR_DEBUG, "WAYLAND_DISPLAY=%s", socket); } - -#if HAVE_XWAYLAND - wlr_xwayland_set_seat(server->xwayland, server->seat.seat); -#endif } void