aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Crisci <tony@dubstepdish.com>2017-12-27 15:17:01 -0500
committerTony Crisci <tony@dubstepdish.com>2017-12-27 15:17:01 -0500
commitd941246d58b55b56179cfe159bec5b4bfb201d2e (patch)
tree8c6f787a1aa5d505a361f81aebb3e60c66b3ef8a
parentdaad22233765716d0b7ba5ba5dc7492f59e63097 (diff)
downloadsway-d941246d58b55b56179cfe159bec5b4bfb201d2e.tar.xz
match user bindsym
-rw-r--r--sway/input/keyboard.c69
1 files changed, 49 insertions, 20 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 68a95bac..326ee584 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -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);