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