mirror of
https://github.com/swaywm/sway.git
synced 2024-12-29 16:36:26 +01:00
match user bindsym
This commit is contained in:
parent
daad222337
commit
d941246d58
1 changed files with 49 additions and 20 deletions
|
@ -5,6 +5,27 @@
|
|||
#include "sway/input/input-manager.h"
|
||||
#include "log.h"
|
||||
|
||||
static size_t pressed_keysyms_length(xkb_keysym_t *pressed_keysyms) {
|
||||
size_t n = 0;
|
||||
for (size_t i = 0; i < SWAY_KEYBOARD_PRESSED_KEYSYMS_CAP; ++i) {
|
||||
if (pressed_keysyms[i] != XKB_KEY_NoSymbol) {
|
||||
++n;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static ssize_t pressed_keysyms_index(xkb_keysym_t *pressed_keysyms,
|
||||
xkb_keysym_t keysym) {
|
||||
for (size_t i = 0; i < SWAY_KEYBOARD_PRESSED_KEYSYMS_CAP; ++i) {
|
||||
if (pressed_keysyms[i] == keysym) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Execute a built-in, hardcoded compositor binding. These are triggered from a
|
||||
* single keysym.
|
||||
|
@ -39,11 +60,39 @@ static bool keyboard_execute_compositor_binding(xkb_keysym_t keysym) {
|
|||
static bool keyboard_execute_binding(struct sway_keyboard *keyboard,
|
||||
xkb_keysym_t *pressed_keysyms, uint32_t modifiers,
|
||||
const xkb_keysym_t *keysyms, size_t keysyms_len) {
|
||||
// compositor bindings
|
||||
for (size_t i = 0; i < keysyms_len; ++i) {
|
||||
if (keyboard_execute_compositor_binding(keysyms[i])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// configured bindings
|
||||
int n = pressed_keysyms_length(pressed_keysyms);
|
||||
list_t *keysym_bindings = config->current_mode->keysym_bindings;
|
||||
for (int i = 0; i < keysym_bindings->length; ++i) {
|
||||
struct sway_binding *binding = keysym_bindings->items[i];
|
||||
if (modifiers ^ binding->modifiers || n != binding->keys->length) {
|
||||
continue;
|
||||
}
|
||||
|
||||
bool match = true;
|
||||
for (int j = 0; j < binding->keys->length; ++j) {
|
||||
match =
|
||||
pressed_keysyms_index(pressed_keysyms,
|
||||
*(int*)binding->keys->items[j]) < 0;
|
||||
|
||||
if (!match) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (match) {
|
||||
sway_log(L_DEBUG, "TODO: executing binding command: %s", binding->command);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -92,26 +141,6 @@ static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
|
|||
keycode, layout_index, 0, keysyms);
|
||||
}
|
||||
|
||||
static ssize_t pressed_keysyms_index(xkb_keysym_t *pressed_keysyms,
|
||||
xkb_keysym_t keysym) {
|
||||
for (size_t i = 0; i < SWAY_KEYBOARD_PRESSED_KEYSYMS_CAP; ++i) {
|
||||
if (pressed_keysyms[i] == keysym) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static size_t pressed_keysyms_length(xkb_keysym_t *pressed_keysyms) {
|
||||
size_t n = 0;
|
||||
for (size_t i = 0; i < SWAY_KEYBOARD_PRESSED_KEYSYMS_CAP; ++i) {
|
||||
if (pressed_keysyms[i] != XKB_KEY_NoSymbol) {
|
||||
++n;
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static void pressed_keysyms_add(xkb_keysym_t *pressed_keysyms,
|
||||
xkb_keysym_t keysym) {
|
||||
ssize_t i = pressed_keysyms_index(pressed_keysyms, keysym);
|
||||
|
|
Loading…
Reference in a new issue