aboutsummaryrefslogtreecommitdiffstats
path: root/sway
diff options
context:
space:
mode:
authorLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-28 18:50:22 -0500
committerLibravatar Tony Crisci <tony@dubstepdish.com>2017-12-28 18:50:22 -0500
commit62b7ab3959468124086a1ba95361b3eed069b4a7 (patch)
tree5569e29c86c9a38d6ca33be14615879566c845c7 /sway
parentfix keyboard_execute_bindcode (diff)
downloadsway-62b7ab3959468124086a1ba95361b3eed069b4a7.tar.gz
sway-62b7ab3959468124086a1ba95361b3eed069b4a7.tar.zst
sway-62b7ab3959468124086a1ba95361b3eed069b4a7.zip
overwrite old bindings
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/bind.c83
-rw-r--r--sway/input/keyboard.c14
2 files changed, 85 insertions, 12 deletions
diff --git a/sway/commands/bind.c b/sway/commands/bind.c
index 62aa535a..99f54f46 100644
--- a/sway/commands/bind.c
+++ b/sway/commands/bind.c
@@ -28,6 +28,44 @@ void free_sway_binding(struct sway_binding *binding) {
28 free(binding); 28 free(binding);
29} 29}
30 30
31/**
32 * Returns true if the bindings have the same key and modifier combinations.
33 * Note that keyboard layout is not considered, so the bindings might actually
34 * not be equivalent on some layouts.
35 */
36bool binding_key_compare(struct sway_binding *binding_a,
37 struct sway_binding *binding_b) {
38 if (binding_a->bindcode != binding_b->bindcode) {
39 return false;
40 }
41
42 if (binding_a->modifiers ^ binding_b->modifiers) {
43 return false;
44 }
45
46 if (binding_a->keys->length != binding_b->keys->length) {
47 return false;
48 }
49
50 int keys_len = binding_a->keys->length;
51 for (int i = 0; i < keys_len; ++i) {
52 uint32_t key_a = *(uint32_t*)binding_a->keys->items[i];
53 bool found = false;
54 for (int j = 0; j < keys_len; ++j) {
55 uint32_t key_b = *(uint32_t*)binding_b->keys->items[j];
56 if (key_b == key_a) {
57 found = true;
58 break;
59 }
60 }
61 if (!found) {
62 return false;
63 }
64 }
65
66 return true;
67}
68
31struct cmd_results *cmd_bindsym(int argc, char **argv) { 69struct cmd_results *cmd_bindsym(int argc, char **argv) {
32 struct cmd_results *error = NULL; 70 struct cmd_results *error = NULL;
33 if ((error = checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1))) { 71 if ((error = checkarg(argc, "bindsym", EXPECTED_MORE_THAN, 1))) {
@@ -95,11 +133,26 @@ struct cmd_results *cmd_bindsym(int argc, char **argv) {
95 list_add(binding->keys, key); 133 list_add(binding->keys, key);
96 } 134 }
97 free_flat_list(split); 135 free_flat_list(split);
98
99 struct sway_mode *mode = config->current_mode;
100 // TODO overwrite the binding if it already exists
101 binding->order = binding_order++; 136 binding->order = binding_order++;
102 list_add(mode->keysym_bindings, binding); 137
138 list_t *mode_bindings = config->current_mode->keysym_bindings;
139
140 // overwrite the binding if it already exists
141 bool overwritten = false;
142 for (int i = 0; i < mode_bindings->length; ++i) {
143 struct sway_binding *config_binding = mode_bindings->items[i];
144 if (binding_key_compare(binding, config_binding)) {
145 sway_log(L_DEBUG, "overwriting old binding with command '%s'",
146 config_binding->command);
147 free_sway_binding(config_binding);
148 mode_bindings->items[i] = binding;
149 overwritten = true;
150 }
151 }
152
153 if (!overwritten) {
154 list_add(mode_bindings, binding);
155 }
103 156
104 sway_log(L_DEBUG, "bindsym - Bound %s to command %s", 157 sway_log(L_DEBUG, "bindsym - Bound %s to command %s",
105 argv[0], binding->command); 158 argv[0], binding->command);
@@ -162,10 +215,26 @@ struct cmd_results *cmd_bindcode(int argc, char **argv) {
162 } 215 }
163 free_flat_list(split); 216 free_flat_list(split);
164 217
165 struct sway_mode *mode = config->current_mode;
166 // TODO overwrite binding if it already exists
167 binding->order = binding_order++; 218 binding->order = binding_order++;
168 list_add(mode->keycode_bindings, binding); 219
220 list_t *mode_bindings = config->current_mode->keycode_bindings;
221
222 // overwrite the binding if it already exists
223 bool overwritten = false;
224 for (int i = 0; i < mode_bindings->length; ++i) {
225 struct sway_binding *config_binding = mode_bindings->items[i];
226 if (binding_key_compare(binding, config_binding)) {
227 sway_log(L_DEBUG, "overwriting old binding with command '%s'",
228 config_binding->command);
229 free_sway_binding(config_binding);
230 mode_bindings->items[i] = binding;
231 overwritten = true;
232 }
233 }
234
235 if (!overwritten) {
236 list_add(mode_bindings, binding);
237 }
169 238
170 sway_log(L_DEBUG, "bindcode - Bound %s to command %s", 239 sway_log(L_DEBUG, "bindcode - Bound %s to command %s",
171 argv[0], binding->command); 240 argv[0], binding->command);
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index eacb6ceb..6272dcce 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -67,7 +67,9 @@ static bool keyboard_execute_bindsym(struct sway_keyboard *keyboard,
67 list_t *keysym_bindings = config->current_mode->keysym_bindings; 67 list_t *keysym_bindings = config->current_mode->keysym_bindings;
68 for (int i = 0; i < keysym_bindings->length; ++i) { 68 for (int i = 0; i < keysym_bindings->length; ++i) {
69 struct sway_binding *binding = keysym_bindings->items[i]; 69 struct sway_binding *binding = keysym_bindings->items[i];
70 sway_log(L_DEBUG, "@@ checking binding: %s", binding->command);
70 if (modifiers ^ binding->modifiers || n != binding->keys->length) { 71 if (modifiers ^ binding->modifiers || n != binding->keys->length) {
72 sway_log(L_DEBUG, "@@ modifiers or key num dont match");
71 continue; 73 continue;
72 } 74 }
73 75
@@ -286,17 +288,18 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) {
286 288
287 xkb_keycode_t keycode = event->keycode + 8; 289 xkb_keycode_t keycode = event->keycode + 8;
288 bool handled = false; 290 bool handled = false;
289 const xkb_keysym_t *keysyms;
290 291
291 // handle keycodes 292 // handle keycodes
292 handled = keyboard_execute_bindcode(keyboard); 293 handled = keyboard_execute_bindcode(keyboard);
294 sway_log(L_DEBUG, "@@ handled by bindcode? %d", handled);
293 295
294 // handle translated keysyms 296 // handle translated keysyms
297 const xkb_keysym_t *translated_keysyms;
295 uint32_t translated_modifiers; 298 uint32_t translated_modifiers;
296 size_t translated_keysyms_len = 299 size_t translated_keysyms_len =
297 keyboard_keysyms_translated(keyboard, keycode, &keysyms, 300 keyboard_keysyms_translated(keyboard, keycode, &translated_keysyms,
298 &translated_modifiers); 301 &translated_modifiers);
299 pressed_keysyms_update(keyboard->pressed_keysyms_translated, keysyms, 302 pressed_keysyms_update(keyboard->pressed_keysyms_translated, translated_keysyms,
300 translated_keysyms_len, event->state); 303 translated_keysyms_len, event->state);
301 if (event->state == WLR_KEY_PRESSED && !handled) { 304 if (event->state == WLR_KEY_PRESSED && !handled) {
302 handled = keyboard_execute_bindsym(keyboard, 305 handled = keyboard_execute_bindsym(keyboard,
@@ -305,9 +308,10 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) {
305 } 308 }
306 309
307 // Handle raw keysyms 310 // Handle raw keysyms
311 const xkb_keysym_t *raw_keysyms;
308 uint32_t raw_modifiers; 312 uint32_t raw_modifiers;
309 size_t raw_keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &keysyms, &raw_modifiers); 313 size_t raw_keysyms_len = keyboard_keysyms_raw(keyboard, keycode, &raw_keysyms, &raw_modifiers);
310 pressed_keysyms_update(keyboard->pressed_keysyms_raw, keysyms, raw_keysyms_len, 314 pressed_keysyms_update(keyboard->pressed_keysyms_raw, raw_keysyms, raw_keysyms_len,
311 event->state); 315 event->state);
312 if (event->state == WLR_KEY_PRESSED && !handled) { 316 if (event->state == WLR_KEY_PRESSED && !handled) {
313 handled = keyboard_execute_bindsym(keyboard, 317 handled = keyboard_execute_bindsym(keyboard,