=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.161 retrieving revision 1.162 diff -u -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 +1,4 @@ -/* $OpenBSD: window.c,v 1.161 2016/06/06 07:24:31 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.162 2016/06/15 09:13:46 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -17,6 +17,7 @@ */ #include +#include #include #include @@ -1046,15 +1047,38 @@ 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,6 +1093,8 @@ if (wp->mode == NULL) return; + evtimer_del(&wp->modetimer); + wp->mode->free(wp); wp->mode = NULL; @@ -1088,6 +1114,7 @@ return; if (wp->mode != NULL) { + wp->modelast = time(NULL); if (wp->mode->key != NULL) wp->mode->key(wp, c, s, key, m); return;