aboutsummaryrefslogtreecommitdiff
path: root/sway/desktop
diff options
context:
space:
mode:
authorRonan Pigott <ronan@rjp.ie>2024-02-07 16:13:25 -0700
committerRonan Pigott <ronan@rjp.ie>2024-02-17 00:54:30 -0700
commitf6d22f8e6886edfeca3ecbb695b02079e81ce360 (patch)
tree75cb3af1922edc274cd5d7a35d68810dbe86ffe4 /sway/desktop
parent541e6e260c2df0346b421cacfaf4ce5d204c49ba (diff)
launcher: track the seat in the launcher ctx
This is a more suitable place to track the requesting seat, since we are able to respond appropriately to destroy notifications.
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/launcher.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sway/desktop/launcher.c b/sway/desktop/launcher.c
index 00a7e38a..4a4255d7 100644
--- a/sway/desktop/launcher.c
+++ b/sway/desktop/launcher.c
@@ -67,6 +67,9 @@ void launcher_ctx_destroy(struct launcher_ctx *ctx) {
}
wl_list_remove(&ctx->node_destroy.link);
wl_list_remove(&ctx->token_destroy.link);
+ if (ctx->seat) {
+ wl_list_remove(&ctx->seat_destroy.link);
+ }
wl_list_remove(&ctx->link);
wlr_xdg_activation_token_v1_destroy(ctx->token);
free(ctx->fallback_name);
@@ -227,6 +230,12 @@ struct launcher_ctx *launcher_ctx_create(struct wlr_xdg_activation_token_v1 *tok
return ctx;
}
+static void launch_ctx_handle_seat_destroy(struct wl_listener *listener, void *data) {
+ struct launcher_ctx *ctx = wl_container_of(listener, ctx, seat_destroy);
+ ctx->seat = NULL;
+ wl_list_remove(&ctx->seat_destroy.link);
+}
+
// Creates a context with a new token for the internal launcher
struct launcher_ctx *launcher_ctx_create_internal(void) {
struct sway_seat *seat = input_manager_current_seat();
@@ -238,13 +247,15 @@ struct launcher_ctx *launcher_ctx_create_internal(void) {
struct wlr_xdg_activation_token_v1 *token =
wlr_xdg_activation_token_v1_create(server.xdg_activation_v1);
- token->seat = seat->wlr_seat;
struct launcher_ctx *ctx = launcher_ctx_create(token, &ws->node);
if (!ctx) {
wlr_xdg_activation_token_v1_destroy(token);
return NULL;
}
+ ctx->seat = seat;
+ ctx->seat_destroy.notify = launch_ctx_handle_seat_destroy;
+ wl_signal_add(&seat->wlr_seat->events.destroy, &ctx->seat_destroy);
return ctx;
}