This is loosely based on a previous patch by Thomas to use line-drawing
characters to show the tree in the new choose-tree command, but this time
we only use them if the client has UTF-8, which should be a safe enough
heuristic. If it doesn't, the tree is rendered as ASCII, with a slightly
cleaned up appearance compared to the current one.

Screenshots:
https://orebokech.com/tmp/tmux-choose-tree-acs.png   (ACS)
https://orebokech.com/tmp/tmux-choose-tree-ascii.png (ASCII)

Comments welcome,

diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c
index b33bf34..450304d 100644
--- a/cmd-choose-tree.c
+++ b/cmd-choose-tree.c
@@ -76,11 +76,14 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_ctx *ctx)
        struct args                     *args = self->args;
        struct winlink                  *wl, *wm;
        struct session                  *s, *s2;
+       struct tty                      *tty;
        struct window_choose_data       *wcd = NULL;
        const char                      *ses_template, *win_template;
-       char                            *final_win_action, *final_win_template;
+       char                            *final_win_action, *cur_win_template;
+       char                            *final_win_template_middle;
+       char                            *final_win_template_last;
        const char                      *ses_action, *win_action;
-       u_int                            cur_win, idx_ses, win_ses;
+       u_int                            cur_win, idx_ses, win_ses, win_max;
        u_int                            wflag, sflag;
 
        ses_template = win_template = NULL;
@@ -92,6 +95,7 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_ctx *ctx)
        }
 
        s = ctx->curclient->session;
+       tty = &ctx->curclient->tty;
 
        if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL)
                return (CMD_RETURN_ERROR);
@@ -148,12 +152,25 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_ctx 
*ctx)
         * window template, otherwise just render the windows as a flat list
         * without any padding.
         */
-       if (wflag && sflag)
-               xasprintf(&final_win_template, "    --> %s", win_template);
-       else if (wflag)
-               final_win_template = xstrdup(win_template);
-       else
-               final_win_template = NULL;
+       if (wflag && sflag) {
+               if (tty->flags & TTY_UTF8) {
+                       xasprintf(&final_win_template_middle, "%s%s %s",
+                               tty_acs_get(tty, 't'), tty_acs_get(tty, 'q'),
+                               win_template);
+                       xasprintf(&final_win_template_last, "%s%s %s",
+                               tty_acs_get(tty, 'm'), tty_acs_get(tty, 'q'),
+                               win_template);
+               } else {
+                       xasprintf(&final_win_template_middle, "|- %s",
+                               win_template);
+                       xasprintf(&final_win_template_last, "`- %s",
+                               win_template);
+               }
+       } else if (wflag) {
+               final_win_template_middle = xstrdup(win_template);
+               final_win_template_last = xstrdup(win_template);
+       } else
+               final_win_template_middle = final_win_template_last = NULL;
 
        idx_ses = cur_win = -1;
        RB_FOREACH(s2, sessions, &sessions) {
@@ -180,7 +197,9 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_ctx *ctx)
                        continue;
                }
 windows_only:
-               win_ses = -1;
+               win_ses = win_max = -1;
+               RB_FOREACH(wm, winlinks, &s2->windows)
+                       win_max++;
                RB_FOREACH(wm, winlinks, &s2->windows) {
                        win_ses++;
                        if (sflag && wflag)
@@ -201,8 +220,13 @@ windows_only:
                        xasprintf(&final_win_action, "%s ; %s", win_action,
                                wcd ? wcd->command : "");
 
+                       if (win_ses != win_max)
+                               cur_win_template = final_win_template_middle;
+                       else
+                               cur_win_template = final_win_template_last;
+
                        window_choose_add_window(wl->window->active,
-                               ctx, s2, wm, final_win_template,
+                               ctx, s2, wm, cur_win_template,
                                final_win_action, idx_ses);
 
                        free(final_win_action);
@@ -214,7 +238,8 @@ windows_only:
                if (wflag && !sflag)
                        break;
        }
-       free(final_win_template);
+       free(final_win_template_middle);
+       free(final_win_template_last);
 
        window_choose_ready(wl->window->active, cur_win,
                cmd_choose_tree_callback, cmd_choose_tree_free);


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to