=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.216 retrieving revision 1.217 diff -u -r1.216 -r1.217 --- src/usr.bin/tmux/window.c 2018/12/18 13:20:44 1.216 +++ src/usr.bin/tmux/window.c 2019/03/07 20:24:21 1.217 @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.216 2018/12/18 13:20:44 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.217 2019/03/07 20:24:21 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -811,7 +811,6 @@ wp->event = NULL; wp->mode = NULL; - wp->modeprefix = 1; wp->layout_cell = NULL; @@ -1054,8 +1053,8 @@ wp->sy = sy; screen_resize(&wp->base, sx, sy, wp->saved_grid == NULL); - if (wp->mode != NULL) - wp->mode->resize(wp, sx, sy); + if (wp->mode != NULL && wp->mode->mode->resize != NULL) + wp->mode->mode->resize(wp->mode, sx, sy); wp->flags |= PANE_RESIZE; } @@ -1222,13 +1221,17 @@ if (wp->mode != NULL) return (1); - wp->mode = mode; + wp->mode = xcalloc(1, sizeof *wp->mode); + wp->mode->wp = wp; + wp->mode->mode = mode; + wp->mode->prefix = 1; + wp->modelast = time(NULL); evtimer_set(&wp->modetimer, window_pane_mode_timer, wp); evtimer_add(&wp->modetimer, &tv); - if ((s = wp->mode->init(wp, fs, args)) != NULL) + if ((s = wp->mode->mode->init(wp->mode, fs, args)) != NULL) wp->screen = s; wp->flags |= (PANE_REDRAW|PANE_CHANGED); @@ -1245,9 +1248,9 @@ evtimer_del(&wp->modetimer); - wp->mode->free(wp); + wp->mode->mode->free(wp->mode); + free(wp->mode); wp->mode = NULL; - wp->modeprefix = 1; wp->screen = &wp->base; wp->flags |= (PANE_REDRAW|PANE_CHANGED); @@ -1260,15 +1263,16 @@ window_pane_key(struct window_pane *wp, struct client *c, struct session *s, struct winlink *wl, key_code key, struct mouse_event *m) { - struct window_pane *wp2; + struct window_mode_entry *wme = wp->mode; + struct window_pane *wp2; if (KEYC_IS_MOUSE(key) && m == NULL) return; - if (wp->mode != NULL) { + if (wme != NULL) { wp->modelast = time(NULL); - if (wp->mode->key != NULL) - wp->mode->key(wp, c, s, wl, (key & ~KEYC_XTERM), m); + if (wme->mode->key != NULL) + wme->mode->key(wme, c, s, wl, (key & ~KEYC_XTERM), m); return; }