summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/server-client.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2019-08-28 07:34:32 +0000
committernicm <nicm@openbsd.org>2019-08-28 07:34:32 +0000
commit709842a6d27adab67357181068ffa6b2f79aa865 (patch)
tree46c1df26f4262595feebaa04a3b5688f64be6e67 /usr.bin/tmux/server-client.c
parentAdd amlpinctrl(4), a driver to configure pins and control GPIOs on Amlogic (diff)
downloadwireguard-openbsd-709842a6d27adab67357181068ffa6b2f79aa865.tar.xz
wireguard-openbsd-709842a6d27adab67357181068ffa6b2f79aa865.zip
The resize event was never deciding to actually resize the pane if there
was output in the pane faster than the timer would fire, so change how it works to only defer the timer again if the pane was actually resized within the last timer period. Reported by James Tai in GitHub issue 1880.
Diffstat (limited to 'usr.bin/tmux/server-client.c')
-rw-r--r--usr.bin/tmux/server-client.c77
1 files changed, 45 insertions, 32 deletions
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index 39591ddb470..253fc028801 100644
--- a/usr.bin/tmux/server-client.c
+++ b/usr.bin/tmux/server-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.293 2019/07/17 17:46:51 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.294 2019/08/28 07:34:32 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -44,6 +44,7 @@ static void server_client_set_title(struct client *);
static void server_client_reset_state(struct client *);
static int server_client_assume_paste(struct session *);
static void server_client_clear_overlay(struct client *);
+static void server_client_resize_event(int, short, void *);
static void server_client_dispatch(struct imsg *, void *);
static void server_client_dispatch_command(struct client *, struct imsg *);
@@ -1319,19 +1320,11 @@ server_client_resize_force(struct window_pane *wp)
return (1);
}
-/* Resize timer event. */
+/* Resize a pane. */
static void
-server_client_resize_event(__unused int fd, __unused short events, void *data)
+server_client_resize_pane(struct window_pane *wp)
{
- struct window_pane *wp = data;
- struct winsize ws;
-
- evtimer_del(&wp->resize_timer);
-
- if (!(wp->flags & PANE_RESIZE))
- return;
- if (server_client_resize_force(wp))
- return;
+ struct winsize ws;
memset(&ws, 0, sizeof ws);
ws.ws_col = wp->sx;
@@ -1346,35 +1339,55 @@ server_client_resize_event(__unused int fd, __unused short events, void *data)
wp->osy = wp->sy;
}
+/* Start the resize timer. */
+static void
+server_client_start_resize_timer(struct window_pane *wp)
+{
+ struct timeval tv = { .tv_usec = 250000 };
+
+ if (!evtimer_pending(&wp->resize_timer, NULL))
+ evtimer_add(&wp->resize_timer, &tv);
+}
+
+/* Resize timer event. */
+static void
+server_client_resize_event(__unused int fd, __unused short events, void *data)
+{
+ struct window_pane *wp = data;
+
+ evtimer_del(&wp->resize_timer);
+
+ if (~wp->flags & PANE_RESIZE)
+ return;
+ log_debug("%s: %%%u timer fired (was%s resized)", __func__, wp->id,
+ (wp->flags & PANE_RESIZED) ? "" : " not");
+
+ if (wp->saved_grid == NULL && (wp->flags & PANE_RESIZED)) {
+ log_debug("%s: %%%u deferring timer", __func__, wp->id);
+ server_client_start_resize_timer(wp);
+ } else if (!server_client_resize_force(wp)) {
+ log_debug("%s: %%%u resizing pane", __func__, wp->id);
+ server_client_resize_pane(wp);
+ }
+ wp->flags &= ~PANE_RESIZED;
+}
+
/* Check if pane should be resized. */
static void
server_client_check_resize(struct window_pane *wp)
{
- struct timeval tv = { .tv_usec = 250000 };
-
- if (!(wp->flags & PANE_RESIZE))
+ if (~wp->flags & PANE_RESIZE)
return;
- log_debug("%s: %%%u resize to %u,%u", __func__, wp->id, wp->sx, wp->sy);
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);
+ if (!evtimer_pending(&wp->resize_timer, NULL)) {
+ log_debug("%s: %%%u starting timer", __func__, wp->id);
+ server_client_resize_pane(wp);
+ server_client_start_resize_timer(wp);
+ } else
+ log_debug("%s: %%%u timer running", __func__, wp->id);
}
/* Check whether pane should be focused. */