aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 94548724..e8a9f757 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1322,6 +1322,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 9e0d67c6..e8ad55ff 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1310,6 +1310,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)