aboutsummaryrefslogtreecommitdiff
path: root/sway/xdg_activation_v1.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/xdg_activation_v1.c')
-rw-r--r--sway/xdg_activation_v1.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/sway/xdg_activation_v1.c b/sway/xdg_activation_v1.c
index 47270f73..72c7fa4c 100644
--- a/sway/xdg_activation_v1.c
+++ b/sway/xdg_activation_v1.c
@@ -18,11 +18,15 @@ void xdg_activation_v1_handle_request_activate(struct wl_listener *listener,
return;
}
+ struct launcher_ctx *ctx = event->token->data;
+ if (ctx == NULL) {
+ return;
+ }
+
if (!xdg_surface->surface->mapped) {
// This is a startup notification. If we are tracking it, the data
// field is a launcher_ctx.
- struct launcher_ctx *ctx = event->token->data;
- if (!ctx || ctx->activated) {
+ if (ctx->activated) {
// This ctx has already been activated and cannot be used again
// for a startup notification. It will be destroyed
return;
@@ -33,9 +37,16 @@ void xdg_activation_v1_handle_request_activate(struct wl_listener *listener,
return;
}
- struct wlr_seat *wlr_seat = event->token->seat;
- struct sway_seat *seat = wlr_seat ? wlr_seat->data : NULL;
- view_request_activate(view, seat);
+ // This is an activation request. If this context is internal we have ctx->seat.
+ struct sway_seat *seat = ctx->seat;
+ if (!seat) {
+ // Otherwise, use the seat indicated by the launcher client in set_serial
+ seat = ctx->token->seat ? ctx->token->seat->data : NULL;
+ }
+
+ if (seat) {
+ view_request_activate(view, seat);
+ }
}
void xdg_activation_v1_handle_new_token(struct wl_listener *listener, void *data) {