From 200c5cbc7913f3c9aca45792669c7ede2d087a47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 11 May 2022 21:17:52 +0200 Subject: [PATCH] wayland: throttle xdg activation token requests for window urgency MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When XDG activation support was added to URL mode, we introduced a regression, where it is possible to flood the Wayland socket with XDG activation token requests. Start foot with “foot -o bell.urgency=yes”, then run: while true; do echo -en ‘\a’; done Finally, switch keyboard focus to another window. Foot crashes. Throttle the token requests by limiting the number of outstanding urgency token requests to 1. Closes #1065 --- wayland.c | 18 +++++++++++++++--- wayland.h | 1 + 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/wayland.c b/wayland.c index 591fa4b7..b15cd491 100644 --- a/wayland.c +++ b/wayland.c @@ -1715,6 +1715,7 @@ activation_token_for_urgency_done(const char *token, void *data) struct wl_window *win = data; struct wayland *wayl = win->term->wl; + win->urgency_token_is_pending = false; xdg_activation_v1_activate(wayl->xdg_activation, token, win->surface); } #endif /* HAVE_XDG_ACTIVATION */ @@ -1723,11 +1724,22 @@ bool wayl_win_set_urgent(struct wl_window *win) { #if defined(HAVE_XDG_ACTIVATION) - return wayl_get_activation_token( + if (win->urgency_token_is_pending) { + /* We already have a pending token. Don’t request another one, + * to avoid flooding the Wayland socket */ + return true; + } + + bool success = wayl_get_activation_token( win->term->wl, NULL, 0, win, &activation_token_for_urgency_done, win); -#else - return false; + + if (success) { + win->urgency_token_is_pending = true; + return true; + } #endif + + return false; } bool diff --git a/wayland.h b/wayland.h index 8f59eb98..daa3e65d 100644 --- a/wayland.h +++ b/wayland.h @@ -319,6 +319,7 @@ struct wl_window { struct xdg_toplevel *xdg_toplevel; #if defined(HAVE_XDG_ACTIVATION) tll(struct xdg_activation_token_context *) xdg_tokens; + bool urgency_token_is_pending; #endif struct zxdg_toplevel_decoration_v1 *xdg_toplevel_decoration;