From bb235337d8ee746c5237b1c26e2fdb993b560bd7 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Sun, 3 Sep 2023 14:01:40 +0200 Subject: [PATCH] window-rules: add ignoreFocusRequest property This allows to reject focus requests from specific applications. --- docs/labwc-config.5.scd | 3 +++ include/window-rules.h | 1 + src/config/rcxml.c | 2 ++ src/window-rules.c | 4 ++++ src/xdg.c | 5 +++++ src/xwayland.c | 6 ++++++ 6 files changed, 21 insertions(+) diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index ca301883..eceebc97 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -482,6 +482,9 @@ situation. *skipWindowSwitcher* removes window from the Window Switcher (alt-tab on-screen-display) +** [yes|no|default] + *ignoreFocusRequest* prevent window to activate itself. + ## ENVIRONMENT VARIABLES *XCURSOR_THEME* and *XCURSOR_SIZE* are supported to set cursor theme diff --git a/include/window-rules.h b/include/window-rules.h index 69a56195..fae1daf7 100644 --- a/include/window-rules.h +++ b/include/window-rules.h @@ -29,6 +29,7 @@ struct window_rule { enum property server_decoration; enum property skip_taskbar; enum property skip_window_switcher; + enum property ignore_focus_request; struct wl_list link; /* struct rcxml.window_rules */ }; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 2c525c72..5b079cae 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -150,6 +150,8 @@ fill_window_rule(char *nodename, char *content) set_property(content, ¤t_window_rule->skip_taskbar); } else if (!strcasecmp(nodename, "skipWindowSwitcher")) { set_property(content, ¤t_window_rule->skip_window_switcher); + } else if (!strcasecmp(nodename, "ignoreFocusRequest")) { + set_property(content, ¤t_window_rule->ignore_focus_request); /* Actions */ } else if (!strcmp(nodename, "name.action")) { diff --git a/src/window-rules.c b/src/window-rules.c index de9da91d..2607199a 100644 --- a/src/window-rules.c +++ b/src/window-rules.c @@ -124,6 +124,10 @@ window_rules_get_property(struct view *view, const char *property) && !strcasecmp(property, "skipWindowSwitcher")) { return rule->skip_window_switcher; } + if (rule->ignore_focus_request + && !strcasecmp(property, "ignoreFocusRequest")) { + return rule->ignore_focus_request; + } } } return LAB_PROP_UNSPECIFIED; diff --git a/src/xdg.c b/src/xdg.c index 20b87b6a..9be6338b 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -590,6 +590,11 @@ xdg_activation_handle_request(struct wl_listener *listener, void *data) * for the seat / serial being correct and then allow the request. */ + if (window_rules_get_property(view, "ignoreFocusRequest") == LAB_PROP_TRUE) { + wlr_log(WLR_INFO, "Ignoring focus request due to window rule configuration"); + return; + } + /* * TODO: This is the exact same code as used in foreign.c. * Refactor it into a public helper function somewhere. diff --git a/src/xwayland.c b/src/xwayland.c index 4f9a84bd..b00119c6 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -285,6 +285,12 @@ handle_request_activate(struct wl_listener *listener, void *data) struct xwayland_view *xwayland_view = wl_container_of(listener, xwayland_view, request_activate); struct view *view = &xwayland_view->base; + + if (window_rules_get_property(view, "ignoreFocusRequest") == LAB_PROP_TRUE) { + wlr_log(WLR_INFO, "Ignoring focus request due to window rule configuration"); + return; + } + desktop_focus_and_activate_view(&view->server->seat, view); view_move_to_front(view); } -- 2.52.0