diff options
-rw-r--r-- | common/list.c | 10 | ||||
-rw-r--r-- | include/config.h | 2 | ||||
-rw-r--r-- | include/list.h | 5 | ||||
-rw-r--r-- | sway/commands.c | 12 | ||||
-rw-r--r-- | sway/config.c | 8 |
5 files changed, 21 insertions, 16 deletions
diff --git a/common/list.c b/common/list.c index d6f6f2ea..850c8569 100644 --- a/common/list.c +++ b/common/list.c | |||
@@ -50,14 +50,8 @@ void list_cat(list_t *list, list_t *source) { | |||
50 | } | 50 | } |
51 | } | 51 | } |
52 | 52 | ||
53 | // pass the pointer of the object we care about to the comparison function | 53 | void list_qsort(list_t* list, int compare(const void *left, const void *right)) { |
54 | static int list_cmp(const void *l, const void *r, void *_cmp) { | 54 | qsort(list->items, list->length, sizeof(void *), compare); |
55 | int (*cmp)(const void *, const void *) = _cmp; | ||
56 | return cmp(*(void**)l, *(void**)r); | ||
57 | } | ||
58 | |||
59 | void list_sort(list_t *list, int compare(const void *left, const void *right)) { | ||
60 | qsort_r(list->items, list->length, sizeof(void *), list_cmp, compare); | ||
61 | } | 55 | } |
62 | 56 | ||
63 | int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) { | 57 | int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) { |
diff --git a/include/config.h b/include/config.h index b97acb57..a915fbed 100644 --- a/include/config.h +++ b/include/config.h | |||
@@ -179,10 +179,12 @@ void free_output_config(struct output_config *oc); | |||
179 | int workspace_output_cmp_workspace(const void *a, const void *b); | 179 | int workspace_output_cmp_workspace(const void *a, const void *b); |
180 | 180 | ||
181 | int sway_binding_cmp(const void *a, const void *b); | 181 | int sway_binding_cmp(const void *a, const void *b); |
182 | int sway_binding_cmp_qsort(const void *a, const void *b); | ||
182 | int sway_binding_cmp_keys(const void *a, const void *b); | 183 | int sway_binding_cmp_keys(const void *a, const void *b); |
183 | void free_sway_binding(struct sway_binding *sb); | 184 | void free_sway_binding(struct sway_binding *sb); |
184 | 185 | ||
185 | int sway_mouse_binding_cmp(const void *a, const void *b); | 186 | int sway_mouse_binding_cmp(const void *a, const void *b); |
187 | int sway_mouse_binding_cmp_qsort(const void *a, const void *b); | ||
186 | int sway_mouse_binding_cmp_buttons(const void *a, const void *b); | 188 | int sway_mouse_binding_cmp_buttons(const void *a, const void *b); |
187 | void free_sway_mouse_binding(struct sway_mouse_binding *smb); | 189 | void free_sway_mouse_binding(struct sway_mouse_binding *smb); |
188 | 190 | ||
diff --git a/include/list.h b/include/list.h index 90d0ad36..d18d3f54 100644 --- a/include/list.h +++ b/include/list.h | |||
@@ -13,8 +13,9 @@ void list_add(list_t *list, void *item); | |||
13 | void list_insert(list_t *list, int index, void *item); | 13 | void list_insert(list_t *list, int index, void *item); |
14 | void list_del(list_t *list, int index); | 14 | void list_del(list_t *list, int index); |
15 | void list_cat(list_t *list, list_t *source); | 15 | void list_cat(list_t *list, list_t *source); |
16 | // See qsort | 16 | // See qsort. Remember to use *_qsort functions as compare functions, |
17 | void list_sort(list_t *list, int compare(const void *left, const void *right)); | 17 | // because they dereference the left and right arguments first! |
18 | void list_qsort(list_t *list, int compare(const void *left, const void *right)); | ||
18 | // Return index for first item in list that returns 0 for given compare | 19 | // Return index for first item in list that returns 0 for given compare |
19 | // function or -1 if none matches. | 20 | // function or -1 if none matches. |
20 | int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to); | 21 | int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to); |
diff --git a/sway/commands.c b/sway/commands.c index 3d882a7b..f6d9b947 100644 --- a/sway/commands.c +++ b/sway/commands.c | |||
@@ -219,7 +219,7 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) { | |||
219 | } | 219 | } |
220 | binding->order = binding_order++; | 220 | binding->order = binding_order++; |
221 | list_add(mode->bindings, binding); | 221 | list_add(mode->bindings, binding); |
222 | list_sort(mode->bindings, sway_binding_cmp); | 222 | list_qsort(mode->bindings, sway_binding_cmp_qsort); |
223 | 223 | ||
224 | sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command); | 224 | sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command); |
225 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 225 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
@@ -1255,9 +1255,9 @@ static struct cmd_results *cmd_scratchpad(int argc, char **argv) { | |||
1255 | } | 1255 | } |
1256 | 1256 | ||
1257 | // sort in order of longest->shortest | 1257 | // sort in order of longest->shortest |
1258 | static int compare_set(const void *_l, const void *_r) { | 1258 | static int compare_set_qsort(const void *_l, const void *_r) { |
1259 | struct sway_variable const *l = _l; | 1259 | struct sway_variable const *l = *(void **)_l; |
1260 | struct sway_variable const *r = _r; | 1260 | struct sway_variable const *r = *(void **)_r; |
1261 | return strlen(r->name) - strlen(l->name); | 1261 | return strlen(r->name) - strlen(l->name); |
1262 | } | 1262 | } |
1263 | 1263 | ||
@@ -1284,7 +1284,7 @@ static struct cmd_results *cmd_set(int argc, char **argv) { | |||
1284 | var = malloc(sizeof(struct sway_variable)); | 1284 | var = malloc(sizeof(struct sway_variable)); |
1285 | var->name = strdup(argv[0]); | 1285 | var->name = strdup(argv[0]); |
1286 | list_add(config->symbols, var); | 1286 | list_add(config->symbols, var); |
1287 | list_sort(config->symbols, compare_set); | 1287 | list_qsort(config->symbols, compare_set_qsort); |
1288 | } | 1288 | } |
1289 | var->value = join_args(argv + 1, argc - 1); | 1289 | var->value = join_args(argv + 1, argc - 1); |
1290 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 1290 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
@@ -1620,7 +1620,7 @@ static struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { | |||
1620 | list_del(bar->bindings, i); | 1620 | list_del(bar->bindings, i); |
1621 | } | 1621 | } |
1622 | list_add(bar->bindings, binding); | 1622 | list_add(bar->bindings, binding); |
1623 | list_sort(bar->bindings, sway_mouse_binding_cmp); | 1623 | list_qsort(bar->bindings, sway_mouse_binding_cmp_qsort); |
1624 | 1624 | ||
1625 | sway_log(L_DEBUG, "bindsym - Bound %s to command %s when clicking swaybar", argv[0], binding->command); | 1625 | sway_log(L_DEBUG, "bindsym - Bound %s to command %s when clicking swaybar", argv[0], binding->command); |
1626 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); | 1626 | return cmd_results_new(CMD_SUCCESS, NULL, NULL); |
diff --git a/sway/config.c b/sway/config.c index 4b1bf01a..e86eda53 100644 --- a/sway/config.c +++ b/sway/config.c | |||
@@ -642,6 +642,10 @@ int sway_binding_cmp(const void *a, const void *b) { | |||
642 | return lenient_strcmp(binda->command, bindb->command); | 642 | return lenient_strcmp(binda->command, bindb->command); |
643 | } | 643 | } |
644 | 644 | ||
645 | int sway_binding_cmp_qsort(const void *a, const void *b) { | ||
646 | return sway_binding_cmp(*(void **)a, *(void **)b); | ||
647 | } | ||
648 | |||
645 | void free_sway_binding(struct sway_binding *binding) { | 649 | void free_sway_binding(struct sway_binding *binding) { |
646 | if (binding->keys) { | 650 | if (binding->keys) { |
647 | for (int i = 0; i < binding->keys->length; i++) { | 651 | for (int i = 0; i < binding->keys->length; i++) { |
@@ -675,6 +679,10 @@ int sway_mouse_binding_cmp(const void *a, const void *b) { | |||
675 | return lenient_strcmp(binda->command, bindb->command); | 679 | return lenient_strcmp(binda->command, bindb->command); |
676 | } | 680 | } |
677 | 681 | ||
682 | int sway_mouse_binding_cmp_qsort(const void *a, const void *b) { | ||
683 | return sway_mouse_binding_cmp(*(void **)a, *(void **)b); | ||
684 | } | ||
685 | |||
678 | void free_sway_mouse_binding(struct sway_mouse_binding *binding) { | 686 | void free_sway_mouse_binding(struct sway_mouse_binding *binding) { |
679 | if (binding->command) { | 687 | if (binding->command) { |
680 | free(binding->command); | 688 | free(binding->command); |