*<action name="ToggleAlwaysOnTop">*
Toggle always-on-top of focused window.
+*<action name="ToggleKeybinds">*
+ Stop handling keybinds other than ToggleKeybinds itself.
+ This can be used to allow A-Tab and similar keybinds to be delivered
+ to Virtual Machines, VNC clients or nested compositors.
+ A second call will restore all original keybinds.
+
*<action name="GoToDesktop" to="value" />*
Switch to workspace. Supported values are "last", "left", "right" or the
full name of a workspace or its index (starting at 1) as configured in
void action_arg_add_str(struct action *action, char *key, const char *value);
void action_arg_from_xml_node(struct action *action, char *nodename, char *content);
+bool actions_contain_toggle_keybinds(struct wl_list *action_list);
+
void actions_run(struct view *activator, struct server *server,
struct wl_list *actions, uint32_t resize_edges);
void action_list_free(struct wl_list *action_list);
struct wlr_idle *wlr_idle;
struct wlr_idle_inhibit_manager_v1 *wlr_idle_inhibit_manager;
+ /* In support for ToggleKeybinds */
+ bool inhibit_keybinds;
+
/* Used to hide the workspace OSD after switching workspaces */
struct wl_event_source *workspace_osd_timer;
bool workspace_osd_shown_by_modifier;
ACTION_TYPE_RESIZE,
ACTION_TYPE_GO_TO_DESKTOP,
ACTION_TYPE_SEND_TO_DESKTOP,
- ACTION_TYPE_SNAP_TO_REGION
+ ACTION_TYPE_SNAP_TO_REGION,
+ ACTION_TYPE_TOGGLE_KEYBINDS,
};
const char *action_names[] = {
"GoToDesktop",
"SendToDesktop",
"SnapToRegion",
+ "ToggleKeybinds",
NULL
};
return action;
}
+bool
+actions_contain_toggle_keybinds(struct wl_list *action_list)
+{
+ struct action *action;
+ wl_list_for_each(action, action_list, link) {
+ if (action->type == ACTION_TYPE_TOGGLE_KEYBINDS) {
+ return true;
+ }
+ }
+ return false;
+}
+
void action_list_free(struct wl_list *action_list)
{
struct action_arg *arg, *arg_tmp;
wlr_log(WLR_ERROR, "Invalid SnapToRegion id: '%s'", region_name);
}
break;
+ case ACTION_TYPE_TOGGLE_KEYBINDS:
+ server->seat.inhibit_keybinds = !server->seat.inhibit_keybinds;
+ wlr_log(WLR_DEBUG, "%s keybinds",
+ server->seat.inhibit_keybinds ? "Disabled" : "Enabled");
+ break;
case ACTION_TYPE_INVALID:
wlr_log(WLR_ERROR, "Not executing unknown action");
break;
if (modifiers ^ keybind->modifiers) {
continue;
}
+ if (server->seat.inhibit_keybinds
+ && !actions_contain_toggle_keybinds(&keybind->actions)) {
+ continue;
+ }
for (size_t i = 0; i < keybind->keysyms_len; i++) {
if (xkb_keysym_to_lower(sym) == keybind->keysyms[i]) {
key_state_store_pressed_keys_as_bound();