summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd-set-option.c4
-rw-r--r--names.c32
-rw-r--r--server-window.c1
-rw-r--r--tmux.h3
-rw-r--r--window.c5
5 files changed, 35 insertions, 10 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 631a4d0e..56ca91e0 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -180,7 +180,9 @@ cmd_set_option_exec(struct cmd *self, struct cmd_q *cmdq)
if (strcmp(oe->name, "automatic-rename") == 0) {
RB_FOREACH(w, windows, &windows) {
if (options_get_number(&w->options, "automatic-rename"))
- w->active->flags |= PANE_CHANGED;
+ queue_window_name(w);
+ else if (event_initialized(&w->name_timer))
+ evtimer_del(&w->name_timer);
}
}
if (strcmp(oe->name, "status") == 0 ||
diff --git a/names.c b/names.c
index 00bc88a2..aa0673ea 100644
--- a/names.c
+++ b/names.c
@@ -25,16 +25,37 @@
#include "tmux.h"
+void window_name_callback(unused int, unused short, void *);
+
+void
+queue_window_name(struct window *w)
+{
+ struct timeval tv;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = NAME_INTERVAL * 1000L;
+
+ if (event_initialized(&w->name_timer))
+ evtimer_del(&w->name_timer);
+ evtimer_set(&w->name_timer, window_name_callback, w);
+ evtimer_add(&w->name_timer, &tv);
+}
+
void
-check_window_name(struct window *w)
+window_name_callback(unused int fd, unused short events, void *data)
{
- char *name;
+ struct window *w = data;
+ char *name;
if (w->active == NULL)
return;
- if (!options_get_number(&w->options, "automatic-rename"))
+ if (!options_get_number(&w->options, "automatic-rename")) {
+ if (event_initialized(&w->name_timer))
+ event_del(&w->name_timer);
return;
+ }
+ queue_window_name(w);
if (~w->active->flags & PANE_CHANGED)
return;
@@ -42,12 +63,9 @@ check_window_name(struct window *w)
name = format_window_name(w);
if (strcmp(name, w->name) != 0) {
- log_debug("@%u new name %s (was %s)", w->id, name, w->name);
window_set_name(w, name);
server_status_window(w);
- } else
- log_debug("@%u name not changed (still %s)", w->id, w->name);
-
+ }
free(name);
}
diff --git a/server-window.c b/server-window.c
index be1dde2a..c96c2602 100644
--- a/server-window.c
+++ b/server-window.c
@@ -49,7 +49,6 @@ server_window_loop(void)
server_status_session(s);
}
}
- check_window_name(w);
}
}
diff --git a/tmux.h b/tmux.h
index 395d3292..6ac0b578 100644
--- a/tmux.h
+++ b/tmux.h
@@ -870,6 +870,7 @@ RB_HEAD(window_pane_tree, window_pane);
struct window {
u_int id;
char *name;
+ struct event name_timer;
struct timeval silence_timer;
struct timeval activity_time;
@@ -2208,7 +2209,7 @@ void window_choose_collapse_all(struct window_pane *);
void window_choose_set_current(struct window_pane *, u_int);
/* names.c */
-void check_window_name(struct window *);
+void queue_window_name(struct window *);
char *default_window_name(struct window *);
char *format_window_name(struct window *);
char *parse_window_name(const char *);
diff --git a/window.c b/window.c
index bfd13b1c..77c7a633 100644
--- a/window.c
+++ b/window.c
@@ -299,6 +299,8 @@ window_create1(u_int sx, u_int sy)
fatal("gettimeofday failed");
options_init(&w->options, &global_w_options);
+ if (options_get_number(&w->options, "automatic-rename"))
+ queue_window_name(w);
w->references = 0;
@@ -347,6 +349,9 @@ window_destroy(struct window *w)
layout_free_cell(w->saved_layout_root);
free(w->old_layout);
+ if (event_initialized(&w->name_timer))
+ evtimer_del(&w->name_timer);
+
options_free(&w->options);
window_destroy_panes(w);