aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornicm <nicm>2017-05-09 13:04:36 +0000
committernicm <nicm>2017-05-09 13:04:36 +0000
commit3b35daacf734dc824b6101e54d62067fde6016b8 (patch)
treea2a689b2a562dd902d057b5e587fcc8e083b5663
parent18f36906a9e40ebcf9705fa9deb197bc4a1f813a (diff)
downloadrtmux-3b35daacf734dc824b6101e54d62067fde6016b8.tar.gz
rtmux-3b35daacf734dc824b6101e54d62067fde6016b8.tar.bz2
rtmux-3b35daacf734dc824b6101e54d62067fde6016b8.zip
If the current screen was complex enough, it was possible to make redraw
itself hit the "terminal can't keep up" check. To avoid this, record how much data we send during redraw (we know we will be starting with 0) and skip the check until it has been flushed. GitHub issue 912.
-rw-r--r--server-client.c10
-rw-r--r--tmux.h1
-rw-r--r--tty.c11
3 files changed, 20 insertions, 2 deletions
diff --git a/server-client.c b/server-client.c
index 72b5d312..ae8e0d6e 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1314,6 +1314,16 @@ server_client_check_redraw(struct client *c)
c->flags &= ~(CLIENT_REDRAW|CLIENT_BORDERS|CLIENT_STATUS|
CLIENT_STATUSFORCE);
+
+ if (needed) {
+ /*
+ * We would have deferred the redraw unless the output buffer
+ * was empty, so we can record how many bytes the redraw
+ * generated.
+ */
+ c->redraw = EVBUFFER_LENGTH(tty->out);
+ log_debug("%s: redraw added %zu bytes", c->name, c->redraw);
+ }
}
/* Set client title. */
diff --git a/tmux.h b/tmux.h
index 1b1343b7..ea02cebf 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1306,6 +1306,7 @@ struct client {
size_t written;
size_t discarded;
+ size_t redraw;
void (*stdin_callback)(struct client *, int, void *);
void *stdin_callback_data;
diff --git a/tty.c b/tty.c
index e951f25c..ba7a5158 100644
--- a/tty.c
+++ b/tty.c
@@ -233,7 +233,14 @@ tty_write_callback(__unused int fd, __unused short events, void *data)
return;
log_debug("%s: wrote %d bytes (of %zu)", c->name, nwrite, size);
- if (tty_block_maybe(tty))
+ if (c->redraw > 0) {
+ if ((size_t)nwrite >= c->redraw)
+ c->redraw = 0;
+ else
+ c->redraw -= nwrite;
+ log_debug("%s: waiting for redraw, %zu bytes left", c->name,
+ c->redraw);
+ } else if (tty_block_maybe(tty))
return;
if (EVBUFFER_LENGTH(tty->out) != 0)
@@ -488,7 +495,7 @@ tty_add(struct tty *tty, const char *buf, size_t len)
}
evbuffer_add(tty->out, buf, len);
- log_debug("%s: %.*s", c->name, (int)len, (const char *)buf);
+ log_debug("%s: %.*s", c->name, (int)len, buf);
c->written += len;
if (tty_log_fd != -1)