Skip to content

Commit

Permalink
Copy mode needs to keep the original grid intact so it can copy from it
Browse files Browse the repository at this point in the history
if needed, so it disables reading from the pane. This can be problem
with some programs. So make tmux automatically exit all modes after 180
seconds of inactivity and if there is pending output.
  • Loading branch information
nicm committed Jun 15, 2016
1 parent 068b8b0 commit bee3e3e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
3 changes: 3 additions & 0 deletions tmux.h
Expand Up @@ -823,6 +823,7 @@ struct window_mode {
void (*key)(struct window_pane *, struct client *, struct session *,
key_code, struct mouse_event *);
};
#define WINDOW_MODE_TIMEOUT 180

/* Structures for choose mode. */
struct window_choose_data {
Expand Down Expand Up @@ -905,6 +906,8 @@ struct window_pane {

const struct window_mode *mode;
void *modedata;
struct event modetimer;
time_t modelast;

TAILQ_ENTRY(window_pane) entry;
RB_ENTRY(window_pane) tree_entry;
Expand Down
27 changes: 27 additions & 0 deletions window.c
Expand Up @@ -17,6 +17,7 @@
*/

#include <sys/types.h>
#include <sys/ioctl.h>

#include <errno.h>
#include <fcntl.h>
Expand Down Expand Up @@ -1046,15 +1047,38 @@ window_pane_alternate_off(struct window_pane *wp, struct grid_cell *gc,
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);
Expand All @@ -1069,6 +1093,8 @@ window_pane_reset_mode(struct window_pane *wp)
if (wp->mode == NULL)
return;

evtimer_del(&wp->modetimer);

wp->mode->free(wp);
wp->mode = NULL;

Expand All @@ -1088,6 +1114,7 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
return;

if (wp->mode != NULL) {
wp->modelast = time(NULL);
if (wp->mode->key != NULL)
wp->mode->key(wp, c, s, key, m);
return;
Expand Down

0 comments on commit bee3e3e

Please sign in to comment.