match user bindsym

This commit is contained in:
Tony Crisci 2017-12-27 15:17:01 -05:00
parent daad222337
commit d941246d58

View file

@ -5,6 +5,27 @@
#include "sway/input/input-manager.h" #include "sway/input/input-manager.h"
#include "log.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 * Execute a built-in, hardcoded compositor binding. These are triggered from a
* single keysym. * 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, static bool keyboard_execute_binding(struct sway_keyboard *keyboard,
xkb_keysym_t *pressed_keysyms, uint32_t modifiers, xkb_keysym_t *pressed_keysyms, uint32_t modifiers,
const xkb_keysym_t *keysyms, size_t keysyms_len) { const xkb_keysym_t *keysyms, size_t keysyms_len) {
// compositor bindings
for (size_t i = 0; i < keysyms_len; ++i) { for (size_t i = 0; i < keysyms_len; ++i) {
if (keyboard_execute_compositor_binding(keysyms[i])) { if (keyboard_execute_compositor_binding(keysyms[i])) {
return true; 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; return false;
} }
@ -92,26 +141,6 @@ static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
keycode, layout_index, 0, keysyms); 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, static void pressed_keysyms_add(xkb_keysym_t *pressed_keysyms,
xkb_keysym_t keysym) { xkb_keysym_t keysym) {
ssize_t i = pressed_keysyms_index(pressed_keysyms, keysym); ssize_t i = pressed_keysyms_index(pressed_keysyms, keysym);