]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add ToggleKeybinds action
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Fri, 3 Mar 2023 17:16:46 +0000 (18:16 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 4 Mar 2023 13:24:59 +0000 (13:24 +0000)
This can be used to better control Virtual Machines, VNC clients, nested
compositors or similar. All keybinds other than ToggleKeybinds itself are
disabled when first called, a 2nd call will restore handling of all keybinds.

Fixes #738
Fixes #810

docs/labwc-actions.5.scd
include/action.h
include/labwc.h
src/action.c
src/keyboard.c

index 98c246d14b86e60fa4764de3db3bb8e53f9cd042..72e81d6e6b905e21a5ffa44a5328b3683eeb7dd4 100644 (file)
@@ -74,6 +74,12 @@ Actions are used in menus and keyboard/mouse bindings.
 *<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
index 326f96d5e5babbd5d00923d67973f3267a7f3c2e..96697597a4d7975ad7b45aa626e67691f235b0be 100644 (file)
@@ -22,6 +22,8 @@ struct action *action_create(const char *action_name);
 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);
index d038963f7509901acb66c81440f9685930c2a5eb..378e1e2077f4955df7239c12c6cae9a2a55d11bb 100644 (file)
@@ -121,6 +121,9 @@ struct seat {
        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;
index 5c36e00b899e93a2d3b5f965821465479239efd9..61f6612f61a44d85165f9df1aac65b4477ea632b 100644 (file)
@@ -59,7 +59,8 @@ enum action_type {
        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[] = {
@@ -88,6 +89,7 @@ const char *action_names[] = {
        "GoToDesktop",
        "SendToDesktop",
        "SnapToRegion",
+       "ToggleKeybinds",
        NULL
 };
 
@@ -169,6 +171,18 @@ action_create(const char *action_name)
        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;
@@ -451,6 +465,11 @@ actions_run(struct view *activator, struct server *server,
                                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;
index 6a6dd2f7149ef3828f8342f721f1eaca40bf5f1a..a0edc0243fe3e83d686d295f872524de6fe45a0d 100644 (file)
@@ -86,6 +86,10 @@ handle_keybinding(struct server *server, uint32_t modifiers, xkb_keysym_t sym)
                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();