summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar frsfnrrg <frsfnrrg@users.noreply.github.com>2018-06-12 10:37:47 -0400
committerLibravatar frsfnrrg <frsfnrrg@users.noreply.github.com>2018-06-12 11:26:24 -0400
commitb23cd827cf934ef7f631b7c448e7afa4147c1936 (patch)
treee08b25504f68e20d95c484b0b57ec2caedf27978
parentMerge pull request #2124 from emersion/drag-icons (diff)
downloadsway-b23cd827cf934ef7f631b7c448e7afa4147c1936.tar.gz
sway-b23cd827cf934ef7f631b7c448e7afa4147c1936.tar.zst
sway-b23cd827cf934ef7f631b7c448e7afa4147c1936.zip
Sort binding key lists
Sort the list comprising the set of keys for the binding in ascending order. (Keyboard shortcuts depend only on the set of simultaneously pressed keys, not their order, so this change should have no external effect.) This simplifies comparisons between bindings.
-rw-r--r--include/sway/config.h2
-rw-r--r--sway/commands/bind.c25
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 */
35bool binding_key_compare(struct sway_binding *binding_a, 35static 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
66static 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
72static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv, 72static 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;