aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd-set-option.c4
-rw-r--r--names.c65
-rw-r--r--server-window.c1
-rw-r--r--tmux.h11
-rw-r--r--window.c6
5 files changed, 58 insertions, 29 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 56ca91e0..631a4d0e 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -180,9 +180,7 @@ 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"))
- queue_window_name(w);
- else if (event_initialized(&w->name_timer))
- evtimer_del(&w->name_timer);
+ w->active->flags |= PANE_CHANGED;
}
}
if (strcmp(oe->name, "status") == 0 ||
diff --git a/names.c b/names.c
index aa0673ea..e880c577 100644
--- a/names.c
+++ b/names.c
@@ -25,47 +25,76 @@
#include "tmux.h"
-void window_name_callback(unused int, unused short, void *);
+void name_time_callback(int, short, void *);
+int name_time_expired(struct window *, struct timeval *);
void
-queue_window_name(struct window *w)
+name_time_callback(unused int fd, unused short events, void *arg)
{
- struct timeval tv;
+ struct window *w = arg;
- tv.tv_sec = 0;
- tv.tv_usec = NAME_INTERVAL * 1000L;
+ /* The event loop will call check_window_name for us on the way out. */
+ log_debug("@%u name timer expired", w->id);
+}
+
+int
+name_time_expired(struct window *w, struct timeval *tv)
+{
+ struct timeval offset;
- 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);
+ timersub(tv, &w->name_time, &offset);
+ if (offset.tv_sec != 0 || offset.tv_usec > NAME_INTERVAL)
+ return (0);
+ return (NAME_INTERVAL - offset.tv_usec);
}
void
-window_name_callback(unused int fd, unused short events, void *data)
+check_window_name(struct window *w)
{
- struct window *w = data;
+ struct timeval tv, next;
char *name;
+ int left;
if (w->active == NULL)
return;
- if (!options_get_number(&w->options, "automatic-rename")) {
- if (event_initialized(&w->name_timer))
- event_del(&w->name_timer);
+ if (!options_get_number(&w->options, "automatic-rename"))
return;
- }
- queue_window_name(w);
- if (~w->active->flags & PANE_CHANGED)
+ if (~w->active->flags & PANE_CHANGED) {
+ log_debug("@%u active pane not changed", w->id);
+ return;
+ }
+ log_debug("@%u active pane changed", w->id);
+
+ gettimeofday(&tv, NULL);
+ left = name_time_expired(w, &tv);
+ if (left != 0) {
+ if (!event_initialized(&w->name_event))
+ evtimer_set(&w->name_event, name_time_callback, w);
+ if (!evtimer_pending(&w->name_event, NULL)) {
+ log_debug("@%u name timer queued (%d left)", w->id, left);
+ timerclear(&next);
+ next.tv_usec = left;
+ event_add(&w->name_event, &next);
+ } else
+ log_debug("@%u name timer already queued (%d left)", w->id, left);
return;
+ }
+ memcpy(&w->name_time, &tv, sizeof w->name_time);
+ if (event_initialized(&w->name_event))
+ evtimer_del(&w->name_event);
+
w->active->flags &= ~PANE_CHANGED;
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 c96c2602..be1dde2a 100644
--- a/server-window.c
+++ b/server-window.c
@@ -49,6 +49,7 @@ server_window_loop(void)
server_status_session(s);
}
}
+ check_window_name(w);
}
}
diff --git a/tmux.h b/tmux.h
index 6ac0b578..5ae7225f 100644
--- a/tmux.h
+++ b/tmux.h
@@ -47,8 +47,8 @@ extern char **environ;
*/
#define PANE_MINIMUM 2
-/* Automatic name refresh interval, in milliseconds. */
-#define NAME_INTERVAL 500
+/* Automatic name refresh interval, in microseconds. Must be < 1 second. */
+#define NAME_INTERVAL 500000
/*
* UTF-8 data size. This must be big enough to hold combined characters as well
@@ -869,8 +869,11 @@ RB_HEAD(window_pane_tree, window_pane);
/* Window structure. */
struct window {
u_int id;
+
char *name;
- struct event name_timer;
+ struct event name_event;
+ struct timeval name_time;
+
struct timeval silence_timer;
struct timeval activity_time;
@@ -2209,7 +2212,7 @@ 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 *);
+void check_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 ff3ccfb8..f58d80ea 100644
--- a/window.c
+++ b/window.c
@@ -299,8 +299,6 @@ 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;
@@ -349,8 +347,8 @@ 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);
+ if (event_initialized(&w->name_event))
+ evtimer_del(&w->name_event);
options_free(&w->options);