From eb0ad181e909c83fad8c1fd2a4a37271b6980ea2 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 24 Sep 2012 12:53:55 +0000 Subject: [PATCH 1/3] Use ACS characters for choose-tree arrows based on diff from Romain Francoise. --- cmd-choose-tree.c | 6 ++++-- screen-write.c | 8 ++++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c index f1533ac0..52f06dc8 100644 --- a/cmd-choose-tree.c +++ b/cmd-choose-tree.c @@ -149,8 +149,10 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_ctx *ctx) * without any padding. */ if (wflag && sflag) { - xasprintf(&final_win_template_middle, " |-> %s", win_template); - xasprintf(&final_win_template_last, " \\-> %s", win_template); + xasprintf(&final_win_template_middle, + " \001tq\001> %s", win_template); + xasprintf(&final_win_template_last, + " \001mq\001> %s", win_template); } else if (wflag) { final_win_template_middle = xstrdup(win_template); final_win_template_last = xstrdup(win_template); diff --git a/screen-write.c b/screen-write.c index ee038e7d..ce9411b6 100644 --- a/screen-write.c +++ b/screen-write.c @@ -210,8 +210,12 @@ screen_write_vnputs(struct screen_write_ctx *ctx, ssize_t maxlen, if (maxlen > 0 && size + 1 > (size_t) maxlen) break; - size++; - screen_write_putc(ctx, gc, *ptr); + if (*ptr == '\001') + gc->attr ^= GRID_ATTR_CHARSET; + else { + size++; + screen_write_putc(ctx, gc, *ptr); + } ptr++; } } From 42272dfbd5058724fc094eb3ea438ec6b7eb6cff Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 24 Sep 2012 13:05:10 +0000 Subject: [PATCH 2/3] Use pgrp of pty fd not pid of immediate child when recovering current working directory (like current process). From Marcel Partap. --- cmd.c | 2 +- format.c | 2 +- procname.c | 8 +++++--- tmux.h | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cmd.c b/cmd.c index 021c0332..3a341b4e 100644 --- a/cmd.c +++ b/cmd.c @@ -1298,7 +1298,7 @@ cmd_get_default_path(struct cmd_ctx *ctx, const char *cwd) if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL) root = ctx->cmdclient->cwd; else if (ctx->curclient != NULL && s->curw != NULL) - root = get_proc_cwd(s->curw->window->active->pid); + root = get_proc_cwd(s->curw->window->active->fd); else return (s->cwd); skip = 0; diff --git a/format.c b/format.c index bc638448..0eeb622d 100644 --- a/format.c +++ b/format.c @@ -391,7 +391,7 @@ format_window_pane(struct format_tree *ft, struct window_pane *wp) format_add(ft, "pane_start_command", "%s", wp->cmd); if (wp->cwd != NULL) format_add(ft, "pane_start_path", "%s", wp->cwd); - format_add(ft, "pane_current_path", "%s", get_proc_cwd(wp->pid)); + format_add(ft, "pane_current_path", "%s", get_proc_cwd(wp->fd)); format_add(ft, "pane_pid", "%ld", (long) wp->pid); format_add(ft, "pane_tty", "%s", wp->tty); } diff --git a/procname.c b/procname.c index 370fe342..1928b92e 100644 --- a/procname.c +++ b/procname.c @@ -36,7 +36,7 @@ struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); char *get_proc_name(int, char *); -char *get_proc_cwd(pid_t); +char *get_proc_cwd(int); struct kinfo_proc * cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2) @@ -133,12 +133,14 @@ error: } char* -get_proc_cwd(pid_t pid) +get_proc_cwd(int fd) { - int name[] = { CTL_KERN, KERN_PROC_CWD, (int)pid }; + int name[] = { CTL_KERN, KERN_PROC_CWD, 0 }; static char path[MAXPATHLEN]; size_t pathlen = sizeof path; + if ((name[2] = tcgetpgrp(fd)) == -1) + return (NULL); if (sysctl(name, 3, path, &pathlen, NULL, 0) != 0) return (NULL); return (path); diff --git a/tmux.h b/tmux.h index c208361b..90019bf2 100644 --- a/tmux.h +++ b/tmux.h @@ -2277,7 +2277,7 @@ u_int utf8_split2(u_int, u_char *); /* procname.c */ char *get_proc_name(int, char *); -char *get_proc_cwd(pid_t); +char *get_proc_cwd(int); /* log.c */ void log_open(int, const char *); From 84612a8196341839c5a18362b68047aa1b011a50 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 24 Sep 2012 13:39:10 +0000 Subject: [PATCH 3/3] Add control_write_buffer, from George Nachman. --- control.c | 9 +++++++++ tmux.h | 1 + 2 files changed, 10 insertions(+) diff --git a/control.c b/control.c index c0d9e812..cb6633ce 100644 --- a/control.c +++ b/control.c @@ -79,6 +79,15 @@ control_write(struct client *c, const char *fmt, ...) server_push_stdout(c); } +/* Write a buffer, adding a terminal newline. Empties buffer. */ +void +control_write_buffer(struct client *c, struct evbuffer *buffer) +{ + evbuffer_add_buffer(c->stdout_data, buffer); + evbuffer_add(c->stdout_data, "\n", 1); + server_push_stdout(c); +} + /* Control input callback. Read lines and fire commands. */ void control_callback(struct client *c, int closed, unused void *data) diff --git a/tmux.h b/tmux.h index 90019bf2..b1e1eeeb 100644 --- a/tmux.h +++ b/tmux.h @@ -2221,6 +2221,7 @@ void clear_signals(int); /* control.c */ void control_callback(struct client *, int, void*); void printflike2 control_write(struct client *, const char *, ...); +void control_write_buffer(struct client *, struct evbuffer *); /* control-notify.c */ void control_notify_window_layout_changed(struct window *);