diff options
author | Thomas Adam <thomas@xteddy.org> | 2016-09-28 10:01:11 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2016-09-28 10:01:11 +0100 |
commit | 27591570c4a6d1142e0403e209106326a45b859e (patch) | |
tree | 13965ccc6fd62b1bfca736c8a3ff00664319df4a | |
parent | 30f2e8ff29b112b6b428d1d123187fdfd497e814 (diff) | |
parent | acacb718e5452bfdba4810007d5a10eace1a9fec (diff) |
Merge branch 'obsd-master'
-rw-r--r-- | server-client.c | 40 | ||||
-rw-r--r-- | tmux.h | 2 | ||||
-rw-r--r-- | window.c | 3 |
3 files changed, 41 insertions, 4 deletions
diff --git a/server-client.c b/server-client.c index f61cfa38..311b2d3b 100644 --- a/server-client.c +++ b/server-client.c @@ -763,11 +763,13 @@ server_client_loop(void) } } -/* Check if pane should be resized. */ -void -server_client_check_resize(struct window_pane *wp) +static void +server_client_resize_event(__unused int fd, __unused short events, void *data) { - struct winsize ws; + struct window_pane *wp = data; + struct winsize ws; + + evtimer_del(&wp->resize_timer); if (!(wp->flags & PANE_RESIZE)) return; @@ -792,6 +794,36 @@ server_client_check_resize(struct window_pane *wp) wp->flags &= ~PANE_RESIZE; } +/* Check if pane should be resized. */ +void +server_client_check_resize(struct window_pane *wp) +{ + struct timeval tv = { .tv_usec = 250000 }; + + if (!(wp->flags & PANE_RESIZE)) + return; + + if (!event_initialized(&wp->resize_timer)) + evtimer_set(&wp->resize_timer, server_client_resize_event, wp); + + /* + * The first resize should happen immediately, so if the timer is not + * running, do it now. + */ + if (!evtimer_pending(&wp->resize_timer, NULL)) + server_client_resize_event(-1, 0, wp); + + /* + * If the pane is in the alternate screen, let the timer expire and + * resize to give the application a chance to redraw. If not, keep + * pushing the timer back. + */ + if (wp->saved_grid != NULL && evtimer_pending(&wp->resize_timer, NULL)) + return; + evtimer_del(&wp->resize_timer); + evtimer_add(&wp->resize_timer, &tv); +} + /* Check whether pane should be focused. */ void server_client_check_focus(struct window_pane *wp) @@ -896,6 +896,8 @@ struct window_pane { int fd; struct bufferevent *event; + struct event resize_timer; + u_int wmark_size; u_int wmark_hits; @@ -806,6 +806,9 @@ window_pane_destroy(struct window_pane *wp) close(wp->pipe_fd); } + if (event_initialized(&wp->resize_timer)) + event_del(&wp->resize_timer); + RB_REMOVE(window_pane_tree, &all_window_panes, wp); free((void *)wp->cwd); |