window-rules: add ignoreFocusRequest property

This allows to reject focus requests from specific applications.
This commit is contained in:
Consolatis 2023-09-03 14:01:40 +02:00
parent 272222e3c9
commit bb235337d8
6 changed files with 21 additions and 0 deletions

View file

@ -482,6 +482,9 @@ situation.
*skipWindowSwitcher* removes window from the Window Switcher (alt-tab
on-screen-display)
*<windowRules><windowRule ignoreFocusRequest="">* [yes|no|default]
*ignoreFocusRequest* prevent window to activate itself.
## ENVIRONMENT VARIABLES
*XCURSOR_THEME* and *XCURSOR_SIZE* are supported to set cursor theme

View file

@ -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 */
};

View file

@ -150,6 +150,8 @@ fill_window_rule(char *nodename, char *content)
set_property(content, &current_window_rule->skip_taskbar);
} else if (!strcasecmp(nodename, "skipWindowSwitcher")) {
set_property(content, &current_window_rule->skip_window_switcher);
} else if (!strcasecmp(nodename, "ignoreFocusRequest")) {
set_property(content, &current_window_rule->ignore_focus_request);
/* Actions */
} else if (!strcmp(nodename, "name.action")) {

View file

@ -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;

View file

@ -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.

View file

@ -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);
}