=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/names.c,v retrieving revision 1.28 retrieving revision 1.29 diff -c -r1.28 -r1.29 *** src/usr.bin/tmux/names.c 2015/08/28 16:10:46 1.28 --- src/usr.bin/tmux/names.c 2015/08/29 00:29:15 1.29 *************** *** 1,4 **** ! /* $OpenBSD: names.c,v 1.28 2015/08/28 16:10:46 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: names.c,v 1.29 2015/08/29 00:29:15 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 25,71 **** #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 ! window_name_callback(unused int fd, unused short events, void *data) { ! struct window *w = data; char *name; if (w->active == NULL) return; ! 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; w->active->flags &= ~PANE_CHANGED; name = format_window_name(w); if (strcmp(name, w->name) != 0) { window_set_name(w, name); server_status_window(w); ! } free(name); } --- 25,100 ---- #include "tmux.h" ! void name_time_callback(int, short, void *); ! int name_time_expired(struct window *, struct timeval *); void ! name_time_callback(unused int fd, unused short events, void *arg) { ! struct window *w = arg; ! /* 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; ! ! 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 ! check_window_name(struct window *w) { ! struct timeval tv, next; char *name; + int left; if (w->active == NULL) return; ! if (!options_get_number(&w->options, "automatic-rename")) return; + + 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); }