diff options
author | nicm <nicm> | 2019-08-16 11:49:12 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-08-16 11:49:12 +0000 |
commit | 37583f0a69d22668bdd47e0b30b61d8dac74bdf6 (patch) | |
tree | 6f2230c68121094ff70e15407120b0b55ae92f80 /window-client.c | |
parent | 5644d37876faf69ecf9f34cbd52e6cdfab83cf79 (diff) | |
download | rtmux-37583f0a69d22668bdd47e0b30b61d8dac74bdf6.tar.gz rtmux-37583f0a69d22668bdd47e0b30b61d8dac74bdf6.tar.bz2 rtmux-37583f0a69d22668bdd47e0b30b61d8dac74bdf6.zip |
Add a flag to reverse sort in the various choose modes, from Benjamin
Poirier in GitHub issue 1875.
Diffstat (limited to 'window-client.c')
-rw-r--r-- | window-client.c | 106 |
1 files changed, 40 insertions, 66 deletions
diff --git a/window-client.c b/window-client.c index d85414ea..2ca9c012 100644 --- a/window-client.c +++ b/window-client.c @@ -75,6 +75,7 @@ static const char *window_client_sort_list[] = { "creation", "activity" }; +static struct mode_tree_sort_criteria *window_client_sort; struct window_client_itemdata { struct client *c; @@ -110,60 +111,48 @@ window_client_free_item(struct window_client_itemdata *item) } static int -window_client_cmp_name(const void *a0, const void *b0) +window_client_cmp(const void *a0, const void *b0) { - const struct window_client_itemdata *const *a = a0; - const struct window_client_itemdata *const *b = b0; - - return (strcmp((*a)->c->name, (*b)->c->name)); -} - -static int -window_client_cmp_size(const void *a0, const void *b0) -{ - const struct window_client_itemdata *const *a = a0; - const struct window_client_itemdata *const *b = b0; - - if ((*a)->c->tty.sx < (*b)->c->tty.sx) - return (-1); - if ((*a)->c->tty.sx > (*b)->c->tty.sx) - return (1); - if ((*a)->c->tty.sy < (*b)->c->tty.sy) - return (-1); - if ((*a)->c->tty.sy > (*b)->c->tty.sy) - return (1); - return (strcmp((*a)->c->name, (*b)->c->name)); -} + const struct window_client_itemdata *const *a = a0; + const struct window_client_itemdata *const *b = b0; + const struct window_client_itemdata *itema = *a; + const struct window_client_itemdata *itemb = *b; + struct client *ca = itema->c; + struct client *cb = itemb->c; + int result = 0; + + switch (window_client_sort->field) { + case WINDOW_CLIENT_BY_SIZE: + result = ca->tty.sx - cb->tty.sx; + if (result == 0) + result = ca->tty.sy - cb->tty.sy; + break; + case WINDOW_CLIENT_BY_CREATION_TIME: + if (timercmp(&ca->creation_time, &cb->creation_time, >)) + result = -1; + else if (timercmp(&ca->creation_time, &cb->creation_time, <)) + result = 1; + break; + case WINDOW_CLIENT_BY_ACTIVITY_TIME: + if (timercmp(&ca->activity_time, &cb->activity_time, >)) + result = -1; + else if (timercmp(&ca->activity_time, &cb->activity_time, <)) + result = 1; + break; + } -static int -window_client_cmp_creation_time(const void *a0, const void *b0) -{ - const struct window_client_itemdata *const *a = a0; - const struct window_client_itemdata *const *b = b0; - - if (timercmp(&(*a)->c->creation_time, &(*b)->c->creation_time, >)) - return (-1); - if (timercmp(&(*a)->c->creation_time, &(*b)->c->creation_time, <)) - return (1); - return (strcmp((*a)->c->name, (*b)->c->name)); -} + /* Use WINDOW_CLIENT_BY_NAME as default order and tie breaker. */ + if (result == 0) + result = strcmp(ca->name, cb->name); -static int -window_client_cmp_activity_time(const void *a0, const void *b0) -{ - const struct window_client_itemdata *const *a = a0; - const struct window_client_itemdata *const *b = b0; - - if (timercmp(&(*a)->c->activity_time, &(*b)->c->activity_time, >)) - return (-1); - if (timercmp(&(*a)->c->activity_time, &(*b)->c->activity_time, <)) - return (1); - return (strcmp((*a)->c->name, (*b)->c->name)); + if (window_client_sort->reversed) + result = -result; + return (result); } static void -window_client_build(void *modedata, u_int sort_type, __unused uint64_t *tag, - const char *filter) +window_client_build(void *modedata, struct mode_tree_sort_criteria *sort_crit, + __unused uint64_t *tag, const char *filter) { struct window_client_modedata *data = modedata; struct window_client_itemdata *item; @@ -187,24 +176,9 @@ window_client_build(void *modedata, u_int sort_type, __unused uint64_t *tag, c->references++; } - switch (sort_type) { - case WINDOW_CLIENT_BY_NAME: - qsort(data->item_list, data->item_size, sizeof *data->item_list, - window_client_cmp_name); - break; - case WINDOW_CLIENT_BY_SIZE: - qsort(data->item_list, data->item_size, sizeof *data->item_list, - window_client_cmp_size); - break; - case WINDOW_CLIENT_BY_CREATION_TIME: - qsort(data->item_list, data->item_size, sizeof *data->item_list, - window_client_cmp_creation_time); - break; - case WINDOW_CLIENT_BY_ACTIVITY_TIME: - qsort(data->item_list, data->item_size, sizeof *data->item_list, - window_client_cmp_activity_time); - break; - } + window_client_sort = sort_crit; + qsort(data->item_list, data->item_size, sizeof *data->item_list, + window_client_cmp); for (i = 0; i < data->item_size; i++) { item = data->item_list[i]; |