mirror of
https://github.com/swaywm/sway.git
synced 2024-11-22 07:51:28 +00:00
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.
(cherry picked from commit d19810eba8
)
This commit is contained in:
parent
d91779d647
commit
b4800fbc90
|
@ -14,6 +14,7 @@ struct launcher_ctx {
|
||||||
struct wl_listener seat_destroy;
|
struct wl_listener seat_destroy;
|
||||||
|
|
||||||
bool activated;
|
bool activated;
|
||||||
|
bool had_focused_surface;
|
||||||
|
|
||||||
struct sway_node *node;
|
struct sway_node *node;
|
||||||
struct wl_listener node_destroy;
|
struct wl_listener node_destroy;
|
||||||
|
|
|
@ -277,6 +277,11 @@ void view_set_activated(struct sway_view *view, bool activated);
|
||||||
*/
|
*/
|
||||||
void view_request_activate(struct sway_view *view, struct sway_seat *seat);
|
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.
|
* If possible, instructs the client to change their decoration mode.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -216,6 +216,8 @@ struct launcher_ctx *launcher_ctx_create(struct wlr_xdg_activation_token_v1 *tok
|
||||||
ctx->fallback_name = strdup(fallback_name);
|
ctx->fallback_name = strdup(fallback_name);
|
||||||
ctx->token = token;
|
ctx->token = token;
|
||||||
ctx->node = node;
|
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;
|
ctx->node_destroy.notify = ctx_handle_node_destroy;
|
||||||
wl_signal_add(&ctx->node->events.destroy, &ctx->node_destroy);
|
wl_signal_add(&ctx->node->events.destroy, &ctx->node_destroy);
|
||||||
|
|
|
@ -399,6 +399,12 @@ void view_request_activate(struct sway_view *view, struct sway_seat *seat) {
|
||||||
transaction_commit_dirty();
|
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) {
|
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);
|
sway_log(SWAY_DEBUG, "Telling view %p to set CSD to %i", view, enabled);
|
||||||
if (view->xdg_decoration) {
|
if (view->xdg_decoration) {
|
||||||
|
|
|
@ -43,8 +43,11 @@ void xdg_activation_v1_handle_request_activate(struct wl_listener *listener,
|
||||||
seat = ctx->token->seat ? ctx->token->seat->data : NULL;
|
seat = ctx->token->seat ? ctx->token->seat->data : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seat) {
|
if (seat && ctx->had_focused_surface) {
|
||||||
view_request_activate(view, seat);
|
view_request_activate(view, seat);
|
||||||
|
} else {
|
||||||
|
// The token is valid, but cannot be used to activate a window
|
||||||
|
view_request_urgent(view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue