diff --git a/format.c b/format.c index 92b1dd3a..96344f27 100644 --- a/format.c +++ b/format.c @@ -2419,20 +2419,10 @@ format_cb_pane_y(struct format_tree *ft) static void * format_cb_pane_z(struct format_tree *ft) { - struct window_pane *wp; - u_int n = 0; + u_int idx; - if (ft->wp != NULL) { - if (~ft->wp->flags & PANE_FLOATING) - return (xstrdup("0")); - TAILQ_FOREACH(wp, &ft->wp->window->z_index, zentry) { - if (wp->flags & PANE_FLOATING) - n++; - if (wp == ft->wp) - return (format_printf("%u", n)); - } - return (xstrdup("0")); - } + if (ft->wp != NULL && window_pane_zindex(ft->wp, &idx) == 0) + return (format_printf("%u", idx)); return (NULL); } diff --git a/sort.c b/sort.c index a9e5da5c..fda6a90b 100644 --- a/sort.c +++ b/sort.c @@ -74,6 +74,7 @@ sort_buffer_cmp(const void *a0, const void *b0) case SORT_INDEX: case SORT_MODIFIER: case SORT_ORDER: + case SORT_Z: case SORT_END: break; } @@ -120,6 +121,7 @@ sort_client_cmp(const void *a0, const void *b0) case SORT_INDEX: case SORT_MODIFIER: case SORT_ORDER: + case SORT_Z: case SORT_END: break; } @@ -172,6 +174,7 @@ sort_session_cmp(const void *a0, const void *b0) case SORT_MODIFIER: case SORT_ORDER: case SORT_SIZE: + case SORT_Z: case SORT_END: break; } @@ -211,6 +214,11 @@ sort_pane_cmp(const void *a0, const void *b0) case SORT_NAME: result = strcmp(a->screen->title, b->screen->title); break; + case SORT_Z: + window_pane_zindex(a, &ai); + window_pane_zindex(b, &bi); + result = ai - bi; + break; case SORT_MODIFIER: case SORT_ORDER: case SORT_END: @@ -269,6 +277,7 @@ sort_winlink_cmp(const void *a0, const void *b0) break; case SORT_MODIFIER: case SORT_ORDER: + case SORT_Z: case SORT_END: break; } @@ -304,6 +313,7 @@ sort_key_binding_cmp(const void *a0, const void *b0) case SORT_CREATION: case SORT_ORDER: case SORT_SIZE: + case SORT_Z: case SORT_END: break; } @@ -358,6 +368,8 @@ sort_order_from_string(const char* order) return (SORT_ORDER); if (strcasecmp(order, "size") == 0) return (SORT_SIZE); + if (strcasecmp(order, "z") == 0) + return (SORT_Z); } return (SORT_END); } @@ -379,6 +391,8 @@ sort_order_to_string(enum sort_order order) return "order"; if (order == SORT_SIZE) return "size"; + if (order == SORT_Z) + return "z"; return (NULL); } diff --git a/tmux.1 b/tmux.1 index aaf811dd..c8c7dd41 100644 --- a/tmux.1 +++ b/tmux.1 @@ -2862,9 +2862,10 @@ is not given, "switch\-client \-t \[aq]%%\[aq]" is used. specifies the initial sort order: one of .Ql index , .Ql name , -or .Ql activity -(time). +(time) +or +.Ql z . .Fl r reverses the sort order. .Fl f diff --git a/tmux.h b/tmux.h index fed51792..456c1666 100644 --- a/tmux.h +++ b/tmux.h @@ -2334,6 +2334,7 @@ enum sort_order { SORT_NAME, SORT_ORDER, SORT_SIZE, + SORT_Z, SORT_END, }; @@ -3391,6 +3392,7 @@ struct window_pane *window_pane_next_by_number(struct window *, struct window_pane *window_pane_previous_by_number(struct window *, struct window_pane *, u_int); int window_pane_index(struct window_pane *, u_int *); +int window_pane_zindex(struct window_pane *, u_int *); u_int window_count_panes(struct window *, int); void window_destroy_panes(struct window *); struct window_pane *window_pane_find_by_id_str(const char *); diff --git a/window-tree.c b/window-tree.c index 79404dd9..2f4dccd4 100644 --- a/window-tree.c +++ b/window-tree.c @@ -136,6 +136,7 @@ static enum sort_order window_tree_order_seq[] = { SORT_INDEX, SORT_NAME, SORT_ACTIVITY, + SORT_Z, SORT_END, }; diff --git a/window.c b/window.c index 5af4f823..4b4af783 100644 --- a/window.c +++ b/window.c @@ -880,8 +880,8 @@ window_pane_previous_by_number(struct window *w, struct window_pane *wp, int window_pane_index(struct window_pane *wp, u_int *i) { - struct window_pane *wq; struct window *w = wp->window; + struct window_pane *wq; *i = options_get_number(w->options, "pane-base-index"); TAILQ_FOREACH(wq, &w->panes, entry) { @@ -894,6 +894,26 @@ window_pane_index(struct window_pane *wp, u_int *i) return (-1); } +int +window_pane_zindex(struct window_pane *wp, u_int *i) +{ + struct window *w = wp->window; + struct window_pane *wq; + + *i = 0; + TAILQ_FOREACH(wq, &w->z_index, zentry) { + if (wq == wp) { + if (~wp->flags & PANE_FLOATING) + (*i)++; + return (0); + } + if (wq->flags & PANE_FLOATING) + (*i)++; + } + + return (-1); +} + u_int window_count_panes(struct window *w, int with_floating) {