=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.161 retrieving revision 1.162 diff -c -r1.161 -r1.162 *** src/usr.bin/tmux/window.c 2016/06/06 07:24:31 1.161 --- src/usr.bin/tmux/window.c 2016/06/15 09:13:46 1.162 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.161 2016/06/06 07:24:31 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.162 2016/06/15 09:13:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 17,22 **** --- 17,23 ---- */ #include + #include #include #include *************** *** 1046,1060 **** --- 1047,1084 ---- wp->flags |= PANE_REDRAW; } + static void + window_pane_mode_timer(__unused int fd, __unused short events, void *arg) + { + struct window_pane *wp = arg; + struct timeval tv = { .tv_sec = 10 }; + int n = 0; + + evtimer_del(&wp->modetimer); + evtimer_add(&wp->modetimer, &tv); + + log_debug("%%%u in mode: last=%ld", wp->id, (long)wp->modelast); + + if (wp->modelast < time(NULL) - WINDOW_MODE_TIMEOUT) { + if (ioctl(wp->fd, FIONREAD, &n) == -1 || n > 0) + window_pane_reset_mode(wp); + } + } + int window_pane_set_mode(struct window_pane *wp, const struct window_mode *mode) { struct screen *s; + struct timeval tv = { .tv_sec = 10 }; if (wp->mode != NULL) return (1); wp->mode = mode; + wp->modelast = time(NULL); + evtimer_set(&wp->modetimer, window_pane_mode_timer, wp); + evtimer_add(&wp->modetimer, &tv); + if ((s = wp->mode->init(wp)) != NULL) wp->screen = s; wp->flags |= (PANE_REDRAW|PANE_CHANGED); *************** *** 1069,1074 **** --- 1093,1100 ---- if (wp->mode == NULL) return; + evtimer_del(&wp->modetimer); + wp->mode->free(wp); wp->mode = NULL; *************** *** 1088,1093 **** --- 1114,1120 ---- return; if (wp->mode != NULL) { + wp->modelast = time(NULL); if (wp->mode->key != NULL) wp->mode->key(wp, c, s, key, m); return;