Try to show a better preview of sessions and windows in tree mode.
authornicm <nicm@openbsd.org>
Fri, 30 Jun 2017 22:24:08 +0000 (22:24 +0000)
committernicm <nicm@openbsd.org>
Fri, 30 Jun 2017 22:24:08 +0000 (22:24 +0000)
usr.bin/tmux/screen-write.c
usr.bin/tmux/tmux.h
usr.bin/tmux/window-client.c
usr.bin/tmux/window-tree.c

index 4206f34..083406a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-write.c,v 1.128 2017/06/12 10:57:35 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.129 2017/06/30 22:24:08 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -387,9 +387,9 @@ screen_write_copy(struct screen_write_ctx *ctx, struct screen *src, u_int px,
        }
 }
 
-/* Draw a line on screen. */
+/* Draw a horizontal line on screen. */
 void
-screen_write_line(struct screen_write_ctx *ctx, u_int nx, int left, int right)
+screen_write_hline(struct screen_write_ctx *ctx, u_int nx, int left, int right)
 {
        struct screen           *s = ctx->s;
        struct grid_cell         gc;
@@ -409,6 +409,31 @@ screen_write_line(struct screen_write_ctx *ctx, u_int nx, int left, int right)
        screen_write_cursormove(ctx, cx, cy);
 }
 
+/* Draw a horizontal line on screen. */
+void
+screen_write_vline(struct screen_write_ctx *ctx, u_int ny, int top, int bottom) 
+{
+       struct screen           *s = ctx->s;
+       struct grid_cell         gc;
+       u_int                    cx, cy, i;
+
+       cx = s->cx;
+       cy = s->cy;
+
+       memcpy(&gc, &grid_default_cell, sizeof gc);
+       gc.attr |= GRID_ATTR_CHARSET;
+
+       screen_write_putc(ctx, &gc, top ? 'w' : 'x');
+       for (i = 1; i < ny - 1; i++) {
+               screen_write_cursormove(ctx, cx, cy + i);
+               screen_write_putc(ctx, &gc, 'x');
+       }
+       screen_write_cursormove(ctx, cx, cy + ny);
+       screen_write_putc(ctx, &gc, bottom ? 'v' : 'x');
+
+       screen_write_cursormove(ctx, cx, cy);
+}
+
 /* Draw a box on screen. */
 void
 screen_write_box(struct screen_write_ctx *ctx, u_int nx, u_int ny)
index 848b312..37fa4e9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.788 2017/06/28 11:36:39 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.789 2017/06/30 22:24:08 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2019,7 +2019,8 @@ void       screen_write_putc(struct screen_write_ctx *, const struct grid_cell *,
             u_char);
 void    screen_write_copy(struct screen_write_ctx *, struct screen *, u_int,
             u_int, u_int, u_int, bitstr_t *, const struct grid_cell *);
-void    screen_write_line(struct screen_write_ctx *, u_int, int, int);
+void    screen_write_hline(struct screen_write_ctx *, u_int, int, int);
+void    screen_write_vline(struct screen_write_ctx *, u_int, int, int);
 void    screen_write_box(struct screen_write_ctx *, u_int, u_int);
 void    screen_write_preview(struct screen_write_ctx *, struct screen *, u_int,
             u_int);
index 25d2f38..6ff66c4 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window-client.c,v 1.6 2017/06/09 16:01:39 nicm Exp $ */
+/* $OpenBSD: window-client.c,v 1.7 2017/06/30 22:24:08 nicm Exp $ */
 
 /*
  * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -230,7 +230,7 @@ window_client_draw(__unused void *modedata, void *itemdata, u_int sx, u_int sy)
        screen_write_preview(&ctx, &wp->base, sx, sy - 3);
 
        screen_write_cursormove(&ctx, 0, sy - 2);
-       screen_write_line(&ctx, sx, 0, 0);
+       screen_write_hline(&ctx, sx, 0, 0);
 
        screen_write_cursormove(&ctx, 0, sy - 1);
        if (c->old_status != NULL)
index 3f1f6d1..b94147d 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window-tree.c,v 1.5 2017/06/09 16:01:39 nicm Exp $ */
+/* $OpenBSD: window-tree.c,v 1.6 2017/06/30 22:24:08 nicm Exp $ */
 
 /*
  * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -408,6 +408,140 @@ window_tree_build(void *modedata, u_int sort_type, uint64_t *tag,
        }
 }
 
+static void
+window_tree_draw_session(struct session *s, struct screen_write_ctx *ctx,
+    u_int sx, u_int sy)
+{
+       struct options          *oo = s->options;
+       struct winlink          *wl;
+       struct window           *w;
+       u_int                    i, n, each, width, left;
+       struct grid_cell         gc;
+       int                      colour, active_colour;
+       char                    *label;
+       size_t                   len;
+
+       if (sx < 6)
+               return;
+       n = winlink_count(&s->windows);
+
+       memcpy(&gc, &grid_default_cell, sizeof gc);
+       colour = options_get_number(oo, "display-panes-colour");
+       active_colour = options_get_number(oo, "display-panes-active-colour");
+
+       each = sx / n;
+       if (each < 24) {
+               n = (sx - 6) / 24;
+               each = (sx - 6) / n;
+               left = sx - (n * each);
+
+               screen_write_cursormove(ctx, sx - left, 0);
+               screen_write_vline(ctx, sy, 0, 0);
+               screen_write_cursormove(ctx, sx - left + left / 2, sy / 2);
+               screen_write_puts(ctx, &grid_default_cell, "...");
+
+               if (sx == left)
+                       return;
+               left = 0;
+       } else
+               left = sx - (n * each);
+
+       wl = RB_MIN(winlinks, &s->windows);
+       for (i = 0; i < n; i++) {
+               if (wl == s->curw)
+                       gc.fg = active_colour;
+               else
+                       gc.fg = colour;
+               if (i == n - 1)
+                       width = each + left;
+               else
+                       width = each - 1;
+               w = wl->window;
+
+               screen_write_cursormove(ctx, i * each, 0);
+               screen_write_preview(ctx, &w->active->base, width, sy);
+
+               xasprintf(&label, " %u:%s ", wl->idx, w->name);
+               if (strlen(label) > width)
+                       xasprintf(&label, " %u ", wl->idx);
+               len = strlen(label) / 2;
+               screen_write_cursormove(ctx, i * each + each / 2 - len, sy / 2);
+               screen_write_puts(ctx, &gc, "%s", label);
+               free(label);
+
+               if (i != n - 1) {
+                       screen_write_cursormove(ctx, i * each + width, 0);
+                       screen_write_vline(ctx, sy, 0, 0);
+               }
+               wl = RB_NEXT(winlinks, &s->windows, wl);
+       }
+}
+
+static void
+window_tree_draw_window(struct session *s, struct window *w,
+    struct screen_write_ctx *ctx, u_int sx, u_int sy)
+{
+       struct options          *oo = s->options;
+       struct window_pane      *wp;
+       u_int                    i, n, each, width, left;
+       struct grid_cell         gc;
+       int                      colour, active_colour;
+       char                    *label;
+       size_t                   len;
+
+       if (sx < 6)
+               return;
+       n = window_count_panes(w);
+
+       memcpy(&gc, &grid_default_cell, sizeof gc);
+       colour = options_get_number(oo, "display-panes-colour");
+       active_colour = options_get_number(oo, "display-panes-active-colour");
+
+       each = sx / n;
+       if (each < 24) {
+               n = (sx - 6) / 24;
+               each = (sx - 6) / n;
+               left = sx - (n * each);
+
+               screen_write_cursormove(ctx, sx - left, 0);
+               screen_write_vline(ctx, sy, 0, 0);
+               screen_write_cursormove(ctx, sx - left + left / 2, sy / 2);
+               screen_write_puts(ctx, &grid_default_cell, "...");
+
+               if (sx == left)
+                       return;
+               left = 0;
+       } else
+               left = sx - (n * each);
+
+       wp = TAILQ_FIRST(&w->panes);
+       for (i = 0; i < n; i++) {
+               if (wp == w->active)
+                       gc.fg = active_colour;
+               else
+                       gc.fg = colour;
+               if (i == n - 1)
+                       width = each + left;
+               else
+                       width = each - 1;
+
+               screen_write_cursormove(ctx, i * each, 0);
+               screen_write_preview(ctx, &wp->base, width, sy);
+
+               xasprintf(&label, " %u ", i);
+               len = strlen(label) / 2;
+               screen_write_cursormove(ctx, i * each + each / 2 - len, sy / 2);
+               screen_write_puts(ctx, &gc, "%s", label);
+               free(label);
+
+               if (i != n - 1) {
+                       screen_write_cursormove(ctx, i * each + width, 0);
+                       screen_write_vline(ctx, sy, 0, 0);
+               }
+               wp = TAILQ_NEXT(wp, entry);
+       }
+}
+
 static struct screen *
 window_tree_draw(__unused void *modedata, void *itemdata, u_int sx, u_int sy)
 {
@@ -423,10 +557,21 @@ window_tree_draw(__unused void *modedata, void *itemdata, u_int sx, u_int sy)
                return (NULL);
 
        screen_init(&s, sx, sy, 0);
-
        screen_write_start(&ctx, NULL, &s);
 
-       screen_write_preview(&ctx, &wp->base, sx, sy);
+       switch (item->type) {
+       case WINDOW_TREE_NONE:
+               return (0);
+       case WINDOW_TREE_SESSION:
+               window_tree_draw_session(sp, &ctx, sx, sy);
+               break;
+       case WINDOW_TREE_WINDOW:
+               window_tree_draw_window(sp, wlp->window, &ctx, sx, sy);
+               break;
+       case WINDOW_TREE_PANE:
+               screen_write_preview(&ctx, &wp->base, sx, sy);
+               break;
+       }
 
        screen_write_stop(&ctx);
        return (&s);