Add overrideInhibition to keyboard.keybind

This commit is contained in:
Yannis Drougas 2025-04-09 08:26:59 +01:00
parent 8b32422b93
commit 7affc4d145
4 changed files with 15 additions and 3 deletions

View file

@ -760,7 +760,8 @@ References:
Stores the keyboard layout either globally or per window and restores
it when switching back to the window. Default is global.
*<keyboard><keybind key="" layoutDependent="" onRelease="" allowWhenLocked="">*
*<keyboard><keybind key="" layoutDependent="" onRelease="" allowWhenLocked=""
overrideInhibition="">*
Define a *key* binding in the format *modifier-key*, where supported
modifiers are:
- S (shift)
@ -808,6 +809,11 @@ References:
*allowWhenLocked* [yes|no]
Make this keybind work even if the screen is locked. Default is no.
*overrideInhibition* [yes|no]
Make this keybind work even if the view inhibits keybinds. Default is no.
This can be used to prevent W-Tab and similar keybinds from being
delivered to Virtual Machines, VNC clients or nested compositors.
*onRelease* [yes|no]
When yes, fires the keybind action when the key or key
combination is released, rather than first pressed. This is useful to

View file

@ -23,6 +23,7 @@ struct keybind {
struct wl_list actions; /* struct action.link */
struct wl_list link; /* struct rcxml.keybinds */
bool on_release;
bool override_inhibition;
};
/**

View file

@ -602,6 +602,7 @@ fill_keybind(xmlNode *node)
lab_xml_get_bool(node, "onRelease", &keybind->on_release);
lab_xml_get_bool(node, "layoutDependent", &keybind->use_syms_only);
lab_xml_get_bool(node, "allowWhenLocked", &keybind->allow_when_locked);
lab_xml_get_bool(node, "overrideInhibition", &keybind->override_inhibition);
append_parsed_actions(node, &keybind->actions);
}
@ -1706,6 +1707,8 @@ deduplicate_key_bindings(void)
wl_list_remove(&current->link);
keybind_destroy(current);
cleared++;
} else if (actions_contain_toggle_keybinds(&current->actions)) {
current->override_inhibition = true;
}
}
if (replaced) {

View file

@ -203,9 +203,11 @@ match_keybinding_for_sym(uint32_t modifiers,
if (modifiers ^ keybind->modifiers) {
continue;
}
if (!(keybind->override_inhibition)) {
if (view_inhibits_actions(server.active_view, &keybind->actions)) {
continue;
}
}
if (sym == XKB_KEY_NoSymbol) {
/* Use keycodes */
if (keybind_contains_keycode(keybind, xkb_keycode)) {