diff options
-rw-r--r-- | include/sway/config.h | 2 | ||||
-rw-r--r-- | sway/commands/bind.c | 25 |
2 files changed, 15 insertions, 12 deletions
diff --git a/include/sway/config.h b/include/sway/config.h index 81e9c382..e75b0664 100644 --- a/include/sway/config.h +++ b/include/sway/config.h | |||
@@ -30,7 +30,7 @@ struct sway_binding { | |||
30 | bool release; | 30 | bool release; |
31 | bool locked; | 31 | bool locked; |
32 | bool bindcode; | 32 | bool bindcode; |
33 | list_t *keys; | 33 | list_t *keys; // sorted in ascending order |
34 | uint32_t modifiers; | 34 | uint32_t modifiers; |
35 | char *command; | 35 | char *command; |
36 | }; | 36 | }; |
diff --git a/sway/commands/bind.c b/sway/commands/bind.c index d0e3e22f..821f9cd1 100644 --- a/sway/commands/bind.c +++ b/sway/commands/bind.c | |||
@@ -32,7 +32,7 @@ void free_sway_binding(struct sway_binding *binding) { | |||
32 | * Note that keyboard layout is not considered, so the bindings might actually | 32 | * Note that keyboard layout is not considered, so the bindings might actually |
33 | * not be equivalent on some layouts. | 33 | * not be equivalent on some layouts. |
34 | */ | 34 | */ |
35 | bool binding_key_compare(struct sway_binding *binding_a, | 35 | static bool binding_key_compare(struct sway_binding *binding_a, |
36 | struct sway_binding *binding_b) { | 36 | struct sway_binding *binding_b) { |
37 | if (binding_a->release != binding_b->release) { | 37 | if (binding_a->release != binding_b->release) { |
38 | return false; | 38 | return false; |
@@ -50,18 +50,12 @@ bool binding_key_compare(struct sway_binding *binding_a, | |||
50 | return false; | 50 | return false; |
51 | } | 51 | } |
52 | 52 | ||
53 | // Keys are sorted | ||
53 | int keys_len = binding_a->keys->length; | 54 | int keys_len = binding_a->keys->length; |
54 | for (int i = 0; i < keys_len; ++i) { | 55 | for (int i = 0; i < keys_len; ++i) { |
55 | uint32_t key_a = *(uint32_t*)binding_a->keys->items[i]; | 56 | uint32_t key_a = *(uint32_t *)binding_a->keys->items[i]; |
56 | bool found = false; | 57 | uint32_t key_b = *(uint32_t *)binding_b->keys->items[i]; |
57 | for (int j = 0; j < keys_len; ++j) { | 58 | if (key_a != key_b) { |
58 | uint32_t key_b = *(uint32_t*)binding_b->keys->items[j]; | ||
59 | if (key_b == key_a) { | ||
60 | found = true; | ||
61 | break; | ||
62 | } | ||
63 | } | ||
64 | if (!found) { | ||
65 | return false; | 59 | return false; |
66 | } | 60 | } |
67 | } | 61 | } |
@@ -69,6 +63,12 @@ bool binding_key_compare(struct sway_binding *binding_a, | |||
69 | return true; | 63 | return true; |
70 | } | 64 | } |
71 | 65 | ||
66 | static int key_qsort_cmp(const void *keyp_a, const void *keyp_b) { | ||
67 | uint32_t key_a = **(uint32_t **)keyp_a; | ||
68 | uint32_t key_b = **(uint32_t **)keyp_b; | ||
69 | return (key_a < key_b) ? -1 : ((key_a > key_b) ? 1 : 0); | ||
70 | } | ||
71 | |||
72 | static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | 72 | static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, |
73 | bool bindcode) { | 73 | bool bindcode) { |
74 | const char *bindtype = bindcode ? "bindcode" : "bindsym"; | 74 | const char *bindtype = bindcode ? "bindcode" : "bindsym"; |
@@ -169,6 +169,9 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, | |||
169 | free_flat_list(split); | 169 | free_flat_list(split); |
170 | binding->order = binding_order++; | 170 | binding->order = binding_order++; |
171 | 171 | ||
172 | // sort ascending | ||
173 | list_qsort(binding->keys, key_qsort_cmp); | ||
174 | |||
172 | list_t *mode_bindings; | 175 | list_t *mode_bindings; |
173 | if (bindcode) { | 176 | if (bindcode) { |
174 | mode_bindings = config->current_mode->keycode_bindings; | 177 | mode_bindings = config->current_mode->keycode_bindings; |