Add a Z sort order in tree mode.

This commit is contained in:
nicm
2026-06-01 18:19:51 +00:00
parent cd6c01e42b
commit f6557d1ea2
6 changed files with 44 additions and 16 deletions

View File

@@ -2419,20 +2419,10 @@ format_cb_pane_y(struct format_tree *ft)
static void * static void *
format_cb_pane_z(struct format_tree *ft) format_cb_pane_z(struct format_tree *ft)
{ {
struct window_pane *wp; u_int idx;
u_int n = 0;
if (ft->wp != NULL) { if (ft->wp != NULL && window_pane_zindex(ft->wp, &idx) == 0)
if (~ft->wp->flags & PANE_FLOATING) return (format_printf("%u", idx));
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"));
}
return (NULL); return (NULL);
} }

14
sort.c
View File

@@ -74,6 +74,7 @@ sort_buffer_cmp(const void *a0, const void *b0)
case SORT_INDEX: case SORT_INDEX:
case SORT_MODIFIER: case SORT_MODIFIER:
case SORT_ORDER: case SORT_ORDER:
case SORT_Z:
case SORT_END: case SORT_END:
break; break;
} }
@@ -120,6 +121,7 @@ sort_client_cmp(const void *a0, const void *b0)
case SORT_INDEX: case SORT_INDEX:
case SORT_MODIFIER: case SORT_MODIFIER:
case SORT_ORDER: case SORT_ORDER:
case SORT_Z:
case SORT_END: case SORT_END:
break; break;
} }
@@ -172,6 +174,7 @@ sort_session_cmp(const void *a0, const void *b0)
case SORT_MODIFIER: case SORT_MODIFIER:
case SORT_ORDER: case SORT_ORDER:
case SORT_SIZE: case SORT_SIZE:
case SORT_Z:
case SORT_END: case SORT_END:
break; break;
} }
@@ -211,6 +214,11 @@ sort_pane_cmp(const void *a0, const void *b0)
case SORT_NAME: case SORT_NAME:
result = strcmp(a->screen->title, b->screen->title); result = strcmp(a->screen->title, b->screen->title);
break; break;
case SORT_Z:
window_pane_zindex(a, &ai);
window_pane_zindex(b, &bi);
result = ai - bi;
break;
case SORT_MODIFIER: case SORT_MODIFIER:
case SORT_ORDER: case SORT_ORDER:
case SORT_END: case SORT_END:
@@ -269,6 +277,7 @@ sort_winlink_cmp(const void *a0, const void *b0)
break; break;
case SORT_MODIFIER: case SORT_MODIFIER:
case SORT_ORDER: case SORT_ORDER:
case SORT_Z:
case SORT_END: case SORT_END:
break; break;
} }
@@ -304,6 +313,7 @@ sort_key_binding_cmp(const void *a0, const void *b0)
case SORT_CREATION: case SORT_CREATION:
case SORT_ORDER: case SORT_ORDER:
case SORT_SIZE: case SORT_SIZE:
case SORT_Z:
case SORT_END: case SORT_END:
break; break;
} }
@@ -358,6 +368,8 @@ sort_order_from_string(const char* order)
return (SORT_ORDER); return (SORT_ORDER);
if (strcasecmp(order, "size") == 0) if (strcasecmp(order, "size") == 0)
return (SORT_SIZE); return (SORT_SIZE);
if (strcasecmp(order, "z") == 0)
return (SORT_Z);
} }
return (SORT_END); return (SORT_END);
} }
@@ -379,6 +391,8 @@ sort_order_to_string(enum sort_order order)
return "order"; return "order";
if (order == SORT_SIZE) if (order == SORT_SIZE)
return "size"; return "size";
if (order == SORT_Z)
return "z";
return (NULL); return (NULL);
} }

5
tmux.1
View File

@@ -2862,9 +2862,10 @@ is not given, "switch\-client \-t \[aq]%%\[aq]" is used.
specifies the initial sort order: one of specifies the initial sort order: one of
.Ql index , .Ql index ,
.Ql name , .Ql name ,
or
.Ql activity .Ql activity
(time). (time)
or
.Ql z .
.Fl r .Fl r
reverses the sort order. reverses the sort order.
.Fl f .Fl f

2
tmux.h
View File

@@ -2334,6 +2334,7 @@ enum sort_order {
SORT_NAME, SORT_NAME,
SORT_ORDER, SORT_ORDER,
SORT_SIZE, SORT_SIZE,
SORT_Z,
SORT_END, 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 *window_pane_previous_by_number(struct window *,
struct window_pane *, u_int); struct window_pane *, u_int);
int window_pane_index(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); u_int window_count_panes(struct window *, int);
void window_destroy_panes(struct window *); void window_destroy_panes(struct window *);
struct window_pane *window_pane_find_by_id_str(const char *); struct window_pane *window_pane_find_by_id_str(const char *);

View File

@@ -136,6 +136,7 @@ static enum sort_order window_tree_order_seq[] = {
SORT_INDEX, SORT_INDEX,
SORT_NAME, SORT_NAME,
SORT_ACTIVITY, SORT_ACTIVITY,
SORT_Z,
SORT_END, SORT_END,
}; };

View File

@@ -880,8 +880,8 @@ window_pane_previous_by_number(struct window *w, struct window_pane *wp,
int int
window_pane_index(struct window_pane *wp, u_int *i) window_pane_index(struct window_pane *wp, u_int *i)
{ {
struct window_pane *wq;
struct window *w = wp->window; struct window *w = wp->window;
struct window_pane *wq;
*i = options_get_number(w->options, "pane-base-index"); *i = options_get_number(w->options, "pane-base-index");
TAILQ_FOREACH(wq, &w->panes, entry) { TAILQ_FOREACH(wq, &w->panes, entry) {
@@ -894,6 +894,26 @@ window_pane_index(struct window_pane *wp, u_int *i)
return (-1); 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 u_int
window_count_panes(struct window *w, int with_floating) window_count_panes(struct window *w, int with_floating)
{ {