summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2015-08-28 16:10:46 +0000
committernicm <nicm>2015-08-28 16:10:46 +0000
commit55b8d7456155de4e5d44136a140a599e2a2a755b (patch)
tree5319be8f04742fad7581402f461ec10ae4246d4f
parente2100c5f5f9c71185e2a3c410ebdd37f52d701a7 (diff)
Revert previous; we do need a timer, until I have a better idea. We
can't do the name check every loop, because that is too expensive, and we can't make sure it only happens infrequently because we have no idea when the next change will happen.
-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);