sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit d19810eba8959f052d91fd6609cef6adf36b3951
parent f6d22f8e6886edfeca3ecbb695b02079e81ce360
Author: Aleksei Bavshin <alebastr89@gmail.com>
Date:   Tue, 26 Dec 2023 22:26:02 -0800

xdg-activation: distinguish activation and urgency requests

Check if the app that requested a token has provided a valid input
serial and a focused surface. Downgrade activation request to urgency
otherwise.

This is mostly in line with what other Wayland compositors decided to
do, and offers a better security than the original logic.

Diffstat:
Minclude/sway/desktop/launcher.h | 1+
Minclude/sway/tree/view.h | 5+++++
Msway/desktop/launcher.c | 2++
Msway/tree/view.c | 6++++++
Msway/xdg_activation_v1.c | 5++++-
5 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/include/sway/desktop/launcher.h b/include/sway/desktop/launcher.h @@ -14,6 +14,7 @@ struct launcher_ctx { struct wl_listener seat_destroy; bool activated; + bool had_focused_surface; struct sway_node *node; struct wl_listener node_destroy; diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h @@ -242,6 +242,11 @@ void view_set_activated(struct sway_view *view, bool activated); */ void view_request_activate(struct sway_view *view, struct sway_seat *seat); +/* + * Called when the view requests urgent state + */ +void view_request_urgent(struct sway_view *view); + /** * If possible, instructs the client to change their decoration mode. */ diff --git a/sway/desktop/launcher.c b/sway/desktop/launcher.c @@ -216,6 +216,8 @@ struct launcher_ctx *launcher_ctx_create(struct wlr_xdg_activation_token_v1 *tok ctx->fallback_name = strdup(fallback_name); ctx->token = token; ctx->node = node; + // Having surface set means that the focus check in wlroots has passed + ctx->had_focused_surface = token->surface != NULL; ctx->node_destroy.notify = ctx_handle_node_destroy; wl_signal_add(&ctx->node->events.destroy, &ctx->node_destroy); diff --git a/sway/tree/view.c b/sway/tree/view.c @@ -412,6 +412,12 @@ void view_request_activate(struct sway_view *view, struct sway_seat *seat) { transaction_commit_dirty(); } +void view_request_urgent(struct sway_view *view) { + if (config->focus_on_window_activation != FOWA_NONE) { + view_set_urgent(view, true); + } +} + void view_set_csd_from_server(struct sway_view *view, bool enabled) { sway_log(SWAY_DEBUG, "Telling view %p to set CSD to %i", view, enabled); if (view->xdg_decoration) { diff --git a/sway/xdg_activation_v1.c b/sway/xdg_activation_v1.c @@ -44,8 +44,11 @@ void xdg_activation_v1_handle_request_activate(struct wl_listener *listener, seat = ctx->token->seat ? ctx->token->seat->data : NULL; } - if (seat) { + if (seat && ctx->had_focused_surface) { view_request_activate(view, seat); + } else { + // The token is valid, but cannot be used to activate a window + view_request_urgent(view); } }