keybind: implement allowWhenLocked

fixes #2034

see bc258a3be2/sway/sway.5.scd (L409)
This commit is contained in:
Tobias Bengfort 2024-08-02 14:08:19 +02:00 committed by Consolatis
parent 6dd0d69889
commit 116382fd89
4 changed files with 21 additions and 16 deletions

View file

@ -499,7 +499,7 @@ extending outward from the snapped edge.
Stores the keyboard layout either globally or per window and restores Stores the keyboard layout either globally or per window and restores
it when switching back to the window. Default is global. it when switching back to the window. Default is global.
*<keyboard><keybind key="" layoutDependent="" onRelease="">* *<keyboard><keybind key="" layoutDependent="" onRelease="" allowWhenLocked="">*
Define a *key* binding in the format *modifier-key*, where supported Define a *key* binding in the format *modifier-key*, where supported
modifiers are: modifiers are:
- S (shift) - S (shift)
@ -541,6 +541,9 @@ extending outward from the snapped edge.
</keybind> </keybind>
``` ```
*allowWhenLocked* [yes|no]
Make this keybind work even if the screen is locked. Default is no.
*<keyboard><keybind key=""><action name="">* *<keyboard><keybind key=""><action name="">*
Keybind action. See labwc-actions(5). Keybind action. See labwc-actions(5).

View file

@ -18,6 +18,7 @@ struct keybind {
xkb_keycode_t keycodes[MAX_KEYCODES]; xkb_keycode_t keycodes[MAX_KEYCODES];
size_t keycodes_len; size_t keycodes_len;
int keycodes_layout; int keycodes_layout;
bool allow_when_locked;
struct wl_list actions; /* struct action.link */ struct wl_list actions; /* struct action.link */
struct wl_list link; /* struct rcxml.keybinds */ struct wl_list link; /* struct rcxml.keybinds */
bool on_release; bool on_release;

View file

@ -407,6 +407,8 @@ fill_keybind(char *nodename, char *content)
set_bool(content, &current_keybind->on_release); set_bool(content, &current_keybind->on_release);
} else if (!strcasecmp(nodename, "layoutDependent")) { } else if (!strcasecmp(nodename, "layoutDependent")) {
set_bool(content, &current_keybind->use_syms_only); set_bool(content, &current_keybind->use_syms_only);
} else if (!strcasecmp(nodename, "allowWhenLocked")) {
set_bool(content, &current_keybind->allow_when_locked);
} else if (!strcmp(nodename, "name.action")) { } else if (!strcmp(nodename, "name.action")) {
current_keybind_action = action_create(content); current_keybind_action = action_create(content);
if (current_keybind_action) { if (current_keybind_action) {

View file

@ -449,6 +449,7 @@ handle_compositor_keybindings(struct keyboard *keyboard,
struct server *server = seat->server; struct server *server = seat->server;
struct wlr_keyboard *wlr_keyboard = keyboard->wlr_keyboard; struct wlr_keyboard *wlr_keyboard = keyboard->wlr_keyboard;
struct keyinfo keyinfo = get_keyinfo(wlr_keyboard, event->keycode); struct keyinfo keyinfo = get_keyinfo(wlr_keyboard, event->keycode);
bool locked = seat->server->session_lock_manager->locked;
key_state_set_pressed(event->keycode, key_state_set_pressed(event->keycode,
event->state == WL_KEYBOARD_KEY_STATE_PRESSED, event->state == WL_KEYBOARD_KEY_STATE_PRESSED,
@ -457,7 +458,7 @@ handle_compositor_keybindings(struct keyboard *keyboard,
if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) { if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
if (cur_keybind && cur_keybind->on_release) { if (cur_keybind && cur_keybind->on_release) {
key_state_bound_key_remove(event->keycode); key_state_bound_key_remove(event->keycode);
if (seat->server->session_lock_manager->locked) { if (locked && !cur_keybind->allow_when_locked) {
cur_keybind = NULL; cur_keybind = NULL;
return true; return true;
} }
@ -479,27 +480,25 @@ handle_compositor_keybindings(struct keyboard *keyboard,
* It's important to do this after key_state_set_pressed() to ensure * It's important to do this after key_state_set_pressed() to ensure
* _all_ key press/releases are registered * _all_ key press/releases are registered
*/ */
if (seat->server->session_lock_manager->locked) { if (!locked) {
return false; if (server->input_mode == LAB_INPUT_STATE_MENU) {
} key_state_store_pressed_key_as_bound(event->keycode);
handle_menu_keys(server, &keyinfo.translated);
return true;
}
if (server->input_mode == LAB_INPUT_STATE_MENU) { if (server->osd_state.cycle_view) {
key_state_store_pressed_key_as_bound(event->keycode); key_state_store_pressed_key_as_bound(event->keycode);
handle_menu_keys(server, &keyinfo.translated); handle_cycle_view_key(server, &keyinfo);
return true; return true;
} }
if (server->osd_state.cycle_view) {
key_state_store_pressed_key_as_bound(event->keycode);
handle_cycle_view_key(server, &keyinfo);
return true;
} }
/* /*
* Handle compositor keybinds * Handle compositor keybinds
*/ */
cur_keybind = match_keybinding(server, &keyinfo, keyboard->is_virtual); cur_keybind = match_keybinding(server, &keyinfo, keyboard->is_virtual);
if (cur_keybind) { if (cur_keybind && (!locked || cur_keybind->allow_when_locked)) {
/* /*
* Update key-state before action_run() because the action * Update key-state before action_run() because the action
* might lead to seat_focus() in which case we pass the * might lead to seat_focus() in which case we pass the