From 88428cff3a0ef2e2013e990679dc746c58a99d12 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 17 Apr 2013 08:41:41 +0000 Subject: [PATCH 1/9] %zu format for size_t. --- job.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/job.c b/job.c index 291e000e..0ae03b31 100644 --- a/job.c +++ b/job.c @@ -144,8 +144,8 @@ job_write_callback(unused struct bufferevent *bufev, void *data) struct job *job = data; size_t len = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(job->event)); - log_debug("job write %p: %s, pid %ld, output left %lu", job, job->cmd, - (long) job->pid, (unsigned long) len); + log_debug("job write %p: %s, pid %ld, output left %zu", job, job->cmd, + (long) job->pid, len); if (len == 0) { shutdown(job->fd, SHUT_WR); From 55640a31b3fbe5fd9b3eb4537779e2ffac58f47d Mon Sep 17 00:00:00 2001 From: Theo Deraadt Date: Wed, 17 Apr 2013 14:52:31 +0000 Subject: [PATCH 2/9] (long long) and %lld for time_t output ok nicm --- format.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/format.c b/format.c index b357876e..9918cfe8 100644 --- a/format.c +++ b/format.c @@ -288,7 +288,7 @@ format_session(struct format_tree *ft, struct session *s) format_add(ft, "session_group", "%u", session_group_index(sg)); t = s->creation_time.tv_sec; - format_add(ft, "session_created", "%ld", (long) t); + format_add(ft, "session_created", "%lld", (long long) t); tim = ctime(&t); *strchr(tim, '\n') = '\0'; format_add(ft, "session_created_string", "%s", tim); @@ -314,13 +314,13 @@ format_client(struct format_tree *ft, struct client *c) format_add(ft, "client_termname", "%s", c->tty.termname); t = c->creation_time.tv_sec; - format_add(ft, "client_created", "%ld", (long) t); + format_add(ft, "client_created", "%lld", (long long) t); tim = ctime(&t); *strchr(tim, '\n') = '\0'; format_add(ft, "client_created_string", "%s", tim); t = c->activity_time.tv_sec; - format_add(ft, "client_activity", "%ld", (long) t); + format_add(ft, "client_activity", "%lld", (long long) t); tim = ctime(&t); *strchr(tim, '\n') = '\0'; format_add(ft, "client_activity_string", "%s", tim); From 5dda1abc32b7b1eb59901a5592569e21d88c6ad2 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 21 Apr 2013 21:32:00 +0000 Subject: [PATCH 3/9] Don't let server_client_check_focus use a dead bufferevent, from Romain Francoise. --- server-client.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server-client.c b/server-client.c index 6cacefa7..3b7b988a 100644 --- a/server-client.c +++ b/server-client.c @@ -514,8 +514,10 @@ server_client_loop(void) w->flags &= ~WINDOW_REDRAW; TAILQ_FOREACH(wp, &w->panes, entry) { - server_client_check_focus(wp); - server_client_check_resize(wp); + if (wp->fd != -1) { + server_client_check_focus(wp); + server_client_check_resize(wp); + } wp->flags &= ~PANE_REDRAW; } } @@ -527,7 +529,7 @@ server_client_check_resize(struct window_pane *wp) { struct winsize ws; - if (wp->fd == -1 || !(wp->flags & PANE_RESIZE)) + if (!(wp->flags & PANE_RESIZE)) return; memset(&ws, 0, sizeof ws); From d89b35e6826ecaccc4d2f421c8013f35ec5854a0 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 22 Apr 2013 08:42:19 +0000 Subject: [PATCH 4/9] Use lockf which is more portable than flock, from Dagobert Michelsen. --- client.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client.c b/client.c index 70e7f1ec..0c8657eb 100644 --- a/client.c +++ b/client.c @@ -78,8 +78,8 @@ client_get_lock(char *lockfile) if ((lockfd = open(lockfile, O_WRONLY|O_CREAT, 0600)) == -1) fatal("open failed"); - if (flock(lockfd, LOCK_EX|LOCK_NB) == -1 && errno == EWOULDBLOCK) { - while (flock(lockfd, LOCK_EX) == -1 && errno == EINTR) + if (lockf(lockfd, F_TLOCK, 0) == -1 && errno == EAGAIN) { + while (lockf(lockfd, F_LOCK, 0) == -1 && errno == EINTR) /* nothing */; close(lockfd); return (-1); From 46c7dbef0f7803dad39db355ee866ecab8db696c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 22 Apr 2013 13:35:18 +0000 Subject: [PATCH 5/9] Call recalculate_sizes() after killing window in case it is in a grouped session, from Daniel Ralston. --- server-fn.c | 1 + 1 file changed, 1 insertion(+) diff --git a/server-fn.c b/server-fn.c index c0b005e8..d92754e1 100644 --- a/server-fn.c +++ b/server-fn.c @@ -283,6 +283,7 @@ server_kill_window(struct window *w) if (options_get_number(&s->options, "renumber-windows")) session_renumber_windows(s); } + recalculate_sizes(); } int From 04f54ab38f9a5f32e6fb89b57380cc7150c08006 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 22 Apr 2013 16:34:53 +0000 Subject: [PATCH 6/9] Get session of -t window rather than client's window. --- cmd-choose-tree.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c index f22f17c2..db0333e7 100644 --- a/cmd-choose-tree.c +++ b/cmd-choose-tree.c @@ -89,10 +89,7 @@ cmd_choose_tree_exec(struct cmd *self, struct cmd_q *cmdq) return (CMD_RETURN_ERROR); } - if ((s = c->session) == NULL) - return (CMD_RETURN_ERROR); - - if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL) + if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL) return (CMD_RETURN_ERROR); if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0) From 3d2b7d5bce9532cedd647ace319afbf95ebe0e20 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 22 Apr 2013 22:17:29 +0000 Subject: [PATCH 7/9] When using choose-tree -u, start with the current window highlighted. From Thomas Adam. --- cmd-choose-tree.c | 5 ++++- tmux.h | 2 ++ window-choose.c | 14 +++++++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmd-choose-tree.c b/cmd-choose-tree.c index db0333e7..601d24f1 100644 --- a/cmd-choose-tree.c +++ b/cmd-choose-tree.c @@ -228,9 +228,12 @@ windows_only: free(final_win_template_last); window_choose_ready(wl->window->active, cur_win, NULL); + window_choose_collapse_all(wl->window->active); - if (args_has(args, 'u')) + if (args_has(args, 'u')) { window_choose_expand_all(wl->window->active); + window_choose_set_current(wl->window->active, cur_win); + } return (CMD_RETURN_NORMAL); } diff --git a/tmux.h b/tmux.h index 053b574e..8fb06223 100644 --- a/tmux.h +++ b/tmux.h @@ -2257,6 +2257,8 @@ struct window_choose_data *window_choose_add_item(struct window_pane *, struct client *, struct winlink *, const char *, const char *, u_int); void window_choose_expand_all(struct window_pane *); +void window_choose_collapse_all(struct window_pane *); +void window_choose_set_current(struct window_pane *, u_int); /* names.c */ void queue_window_name(struct window *); diff --git a/window-choose.c b/window-choose.c index 792224c1..38773605 100644 --- a/window-choose.c +++ b/window-choose.c @@ -44,7 +44,6 @@ void window_choose_scroll_down(struct window_pane *); void window_choose_collapse(struct window_pane *, struct session *); void window_choose_expand(struct window_pane *, struct session *, u_int); -void window_choose_collapse_all(struct window_pane *); enum window_choose_input_type { WINDOW_CHOOSE_NORMAL = -1, @@ -102,8 +101,7 @@ window_choose_add(struct window_pane *wp, struct window_choose_data *wcd) } void -window_choose_ready(struct window_pane *wp, u_int cur, - void (*callbackfn)(struct window_choose_data *)) +window_choose_set_current(struct window_pane *wp, u_int cur) { struct window_choose_mode_data *data = wp->modedata; struct screen *s = &data->screen; @@ -112,12 +110,22 @@ window_choose_ready(struct window_pane *wp, u_int cur, if (data->selected > screen_size_y(s) - 1) data->top = ARRAY_LENGTH(&data->list) - screen_size_y(s); + window_choose_redraw_screen(wp); +} + +void +window_choose_ready(struct window_pane *wp, u_int cur, + void (*callbackfn)(struct window_choose_data *)) +{ + struct window_choose_mode_data *data = wp->modedata; + data->callbackfn = callbackfn; if (data->callbackfn == NULL) data->callbackfn = window_choose_default_callback; ARRAY_CONCAT(&data->old_list, &data->list); + window_choose_set_current(wp, cur); window_choose_collapse_all(wp); } From 4f3c31a6b63f4489bfc672b510036fd8d9491595 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 24 Apr 2013 10:57:03 +0100 Subject: [PATCH 8/9] Use sysconfdir for the location of global tmux.conf (but default it to /etc), based on changes from Dagobert Michelsen. --- Makefile.am | 7 ++++--- configure.ac | 3 +++ server.c | 8 ++++---- tmux.1.in | 6 +++--- tmux.c | 2 +- tmux.h | 4 ---- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Makefile.am b/Makefile.am index c131940a..726582a5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,7 +15,7 @@ dist-hook: find $(distdir) -name .svn -type d|xargs rm -Rf # Preprocessor flags. -CPPFLAGS += @XOPEN_DEFINES@ +CPPFLAGS += @XOPEN_DEFINES@ -DTMUX_CONF="\"$(sysconfdir)/tmux.conf\"" # glibc as usual does things ass-backwards and hides useful things by default, # so everyone has to add this. @@ -240,9 +240,10 @@ endif # Build tmux.1 in the right format. tmux.1: tmux.1.in if test x@MANFORMAT@ = xmdoc; then \ - cp tmux.1.in tmux.1; \ + sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" tmux.1.in >tmux.1; \ else \ - $(AWK) -fmdoc2man.awk tmux.1; \ + sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" tmux.1.in| \ + $(AWK) -fmdoc2man.awk >tmux.1; \ fi # Update SF web site. diff --git a/configure.ac b/configure.ac index 80cf1266..590b9db0 100644 --- a/configure.ac +++ b/configure.ac @@ -18,6 +18,9 @@ AC_PROG_CC AM_PROG_CC_C_O AC_PROG_INSTALL +# Default tmux.conf goes in /etc not ${prefix}/etc. +test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc + # Check for various headers. Alternatives included from compat.h. AC_CHECK_HEADERS( [ \ diff --git a/server.c b/server.c index 4bfa9185..bd28d517 100644 --- a/server.c +++ b/server.c @@ -170,13 +170,13 @@ server_start(int lockfd, char *lockfile) cfg_references = 1; ARRAY_INIT(&cfg_causes); - if (access(SYSTEM_CFG, R_OK) == 0) { - if (load_cfg(SYSTEM_CFG, cfg_cmd_q, &cause) == -1) { - xasprintf(&cause, "%s: %s", SYSTEM_CFG, cause); + if (access(TMUX_CONF, R_OK) == 0) { + if (load_cfg(TMUX_CONF, cfg_cmd_q, &cause) == -1) { + xasprintf(&cause, "%s: %s", TMUX_CONF, cause); ARRAY_ADD(&cfg_causes, cause); } } else if (errno != ENOENT) { - xasprintf(&cause, "%s: %s", SYSTEM_CFG, strerror(errno)); + xasprintf(&cause, "%s: %s", TMUX_CONF, strerror(errno)); ARRAY_ADD(&cfg_causes, cause); } if (cfg_file != NULL) { diff --git a/tmux.1.in b/tmux.1.in index 98bf9574..7f783b86 100644 --- a/tmux.1.in +++ b/tmux.1.in @@ -122,7 +122,7 @@ Specify an alternative configuration file. By default, .Nm loads the system configuration file from -.Pa /etc/tmux.conf , +.Pa @SYSCONFDIR@/tmux.conf , if present, then looks for a user configuration file at .Pa ~/.tmux.conf . .Pp @@ -3705,12 +3705,12 @@ was renamed to .Ar name . .El .Sh FILES -.Bl -tag -width "/etc/tmux.confXXX" -compact +.Bl -tag -width "@SYSCONFDIR@/tmux.confXXX" -compact .It Pa ~/.tmux.conf Default .Nm configuration file. -.It Pa /etc/tmux.conf +.It Pa @SYSCONFDIR@/tmux.conf System-wide configuration file. .El .Sh EXAMPLES diff --git a/tmux.c b/tmux.c index 2916bbb5..606c574f 100644 --- a/tmux.c +++ b/tmux.c @@ -363,7 +363,7 @@ main(int argc, char **argv) if (pw != NULL) home = pw->pw_dir; } - xasprintf(&cfg_file, "%s/%s", home, DEFAULT_CFG); + xasprintf(&cfg_file, "%s/.tmux.conf", home); if (access(cfg_file, R_OK) != 0 && errno == ENOENT) { free(cfg_file); cfg_file = NULL; diff --git a/tmux.h b/tmux.h index f0b9edf0..fc5561b5 100644 --- a/tmux.h +++ b/tmux.h @@ -39,10 +39,6 @@ extern char *__progname; extern char **environ; -/* Default configuration files. */ -#define DEFAULT_CFG ".tmux.conf" -#define SYSTEM_CFG "/etc/tmux.conf" - /* Default prompt history length. */ #define PROMPT_HISTORY 100 From fce095665c62eb38826f42ae55a0fbe998f18be0 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 28 Apr 2013 15:37:02 +0100 Subject: [PATCH 9/9] Use $(srcdir) for generating tmux.1, reported by fasta_ on IRC. --- Makefile.am | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile.am b/Makefile.am index 726582a5..3eb3190f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -240,10 +240,11 @@ endif # Build tmux.1 in the right format. tmux.1: tmux.1.in if test x@MANFORMAT@ = xmdoc; then \ - sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" tmux.1.in >tmux.1; \ + sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1.in \ + >$(srcdir)/tmux.1; \ else \ - sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" tmux.1.in| \ - $(AWK) -fmdoc2man.awk >tmux.1; \ + sed -e "s|@SYSCONFDIR@|$(sysconfdir)|g" $(srcdir)/tmux.1.in| \ + $(AWK) -fmdoc2man.awk >$(srcdir)/tmux.1; \ fi # Update SF web site.