aboutsummaryrefslogtreecommitdiff
path: root/sway/handlers.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2015-08-11 09:50:23 -0400
committerDrew DeVault <sir@cmpwn.com>2015-08-11 09:50:23 -0400
commit803a4739b61ef71204d58bb5464b9a2ebd57cf36 (patch)
tree8531788e7a188a620f53e5633f2280ae332fd0d4 /sway/handlers.c
parent96d7ff1e19c1e6af47f21764ed613c5ebe53a557 (diff)
parenta22ba1762194e6592a4d7d5e97ba1b3cb3b1e582 (diff)
Merge pull request #16 from taiyu-len/multikey_handling
Multikey handling
Diffstat (limited to 'sway/handlers.c')
-rw-r--r--sway/handlers.c50
1 files changed, 39 insertions, 11 deletions
diff --git a/sway/handlers.c b/sway/handlers.c
index d2d8c5a0..979eb3c8 100644
--- a/sway/handlers.c
+++ b/sway/handlers.c
@@ -55,38 +55,66 @@ void handle_view_geometry_request(wlc_handle view, const struct wlc_geometry* ge
// deny that shit
}
+
bool handle_key(wlc_handle view, uint32_t time, const struct wlc_modifiers
*modifiers, uint32_t key, uint32_t sym, enum wlc_key_state state) {
- // TODO: handle keybindings with more than 1 non-modifier key involved
- // Note: reminder to check conflicts with mod+q+a versus mod+q
-
+ enum { QSIZE = 32 };
+ static uint8_t head = 0;
+ static uint32_t array[QSIZE];
bool cmd_success = true;
- struct sway_mode *mode = config->current_mode;
+ struct sway_mode *mode = config->current_mode;
// Lowercase if necessary
sym = tolower(sym);
+ //Find key, if it has been pressed
+ int mid = 0;
+ while (mid < head && array[mid] != sym) {
+ ++mid;
+ }
+ if (state == WLC_KEY_STATE_PRESSED && mid == head && head + 1 < QSIZE) {
+ array[head++] = sym;
+ } else if (state == WLC_KEY_STATE_RELEASED && mid < head) {
+ memmove(array + mid, array + mid + 1, sizeof*array * (--head - mid));
+ }
+ sway_log(L_INFO,"%d", head);
+ // TODO: reminder to check conflicts with mod+q+a versus mod+q
int i;
for (i = 0; i < mode->bindings->length; ++i) {
struct sway_binding *binding = mode->bindings->items[i];
if ((modifiers->mods & binding->modifiers) == binding->modifiers) {
- bool match = true;
+ bool match;
int j;
for (j = 0; j < binding->keys->length; ++j) {
- xkb_keysym_t *k = binding->keys->items[j];
- if (sym != *k) {
- match = false;
+ match = false;
+ xkb_keysym_t *key = binding->keys->items[j];
+ uint8_t k;
+ for (k = 0; k < head; ++k) {
+ if (array[k] == *key) {
+ match = true;
+ break;
+ }
+ }
+ if (match == false) {
break;
}
}
if (match) {
- // TODO: --released
+ //Remove matched keys from array
+ int j;
+ for (j = 0; j < binding->keys->length; ++j) {
+ uint8_t k;
+ for (k = 0; k < head; ++k) {
+ memmove(array + k, array + k + 1, sizeof*array * (--head - k));
+ break;
+ }
+ }
if (state == WLC_KEY_STATE_PRESSED) {
cmd_success = !handle_command(config, binding->command);
- } else {
- cmd_success = true;
+ } else if (state == WLC_KEY_STATE_RELEASED) {
+ // TODO: --released
}
}
}