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)