summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2020-04-18 06:10:15 +0000
committernicm <nicm@openbsd.org>2020-04-18 06:10:15 +0000
commit0d89b7abb6d399743b4125b8c5725c732279c788 (patch)
tree26aaa90b86fb25741eb112344a76e9a951ab4a1f
parentRevert "drm/dp_mst: Remove VCPI while disabling topology mgr" (diff)
downloadwireguard-openbsd-0d89b7abb6d399743b4125b8c5725c732279c788.tar.xz
wireguard-openbsd-0d89b7abb6d399743b4125b8c5725c732279c788.zip
When a redraw is deferred because the terminal hasn't finished reading
the data from the last one, other panes could update while waiting, so we set the flag to redraw them all when the new redraw actually happened. But this means a lot of redrawing panes unnecessarily if they haven't changed - so instead set a flag to say "at least one pane needs to be redrawed" then look at the invidual pane flags to see which ones need it.
-rw-r--r--usr.bin/tmux/screen-redraw.c15
-rw-r--r--usr.bin/tmux/server-client.c20
-rw-r--r--usr.bin/tmux/tmux.h7
-rw-r--r--usr.bin/tmux/tty.c18
4 files changed, 41 insertions, 19 deletions
diff --git a/usr.bin/tmux/screen-redraw.c b/usr.bin/tmux/screen-redraw.c
index 436126f80a5..3726c29478e 100644
--- a/usr.bin/tmux/screen-redraw.c
+++ b/usr.bin/tmux/screen-redraw.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-redraw.c,v 1.67 2020/04/16 13:35:24 nicm Exp $ */
+/* $OpenBSD: screen-redraw.c,v 1.68 2020/04/18 06:10:15 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -438,17 +438,24 @@ screen_redraw_screen(struct client *c)
tty_sync_start(&c->tty);
if (flags & (CLIENT_REDRAWWINDOW|CLIENT_REDRAWBORDERS)) {
+ log_debug("%s: redrawing borders", c->name);
if (ctx.pane_status != PANE_STATUS_OFF)
screen_redraw_draw_pane_status(&ctx);
screen_redraw_draw_borders(&ctx);
}
- if (flags & CLIENT_REDRAWWINDOW)
+ if (flags & CLIENT_REDRAWWINDOW) {
+ log_debug("%s: redrawing panes", c->name);
screen_redraw_draw_panes(&ctx);
+ }
if (ctx.statuslines != 0 &&
- (flags & (CLIENT_REDRAWSTATUS|CLIENT_REDRAWSTATUSALWAYS)))
+ (flags & (CLIENT_REDRAWSTATUS|CLIENT_REDRAWSTATUSALWAYS))) {
+ log_debug("%s: redrawing status", c->name);
screen_redraw_draw_status(&ctx);
- if (c->overlay_draw != NULL && (flags & CLIENT_REDRAWOVERLAY))
+ }
+ if (c->overlay_draw != NULL && (flags & CLIENT_REDRAWOVERLAY)) {
+ log_debug("%s: redrawing overlay", c->name);
c->overlay_draw(c, &ctx);
+ }
tty_reset(&c->tty);
tty_sync_end(&c->tty);
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index 985962dc2de..11a1abdd0c9 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.320 2020/04/17 22:16:28 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.321 2020/04/18 06:10:15 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1681,7 +1681,7 @@ server_client_check_redraw(struct client *c)
struct session *s = c->session;
struct tty *tty = &c->tty;
struct window_pane *wp;
- int needed, flags, mode = tty->mode;
+ int needed, flags, mode = tty->mode, new_flags = 0;
struct timeval tv = { .tv_usec = 1000 };
static struct event ev;
size_t left;
@@ -1689,11 +1689,12 @@ server_client_check_redraw(struct client *c)
if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED))
return;
if (c->flags & CLIENT_ALLREDRAWFLAGS) {
- log_debug("%s: redraw%s%s%s%s", c->name,
+ log_debug("%s: redraw%s%s%s%s%s", c->name,
(c->flags & CLIENT_REDRAWWINDOW) ? " window" : "",
(c->flags & CLIENT_REDRAWSTATUS) ? " status" : "",
(c->flags & CLIENT_REDRAWBORDERS) ? " borders" : "",
- (c->flags & CLIENT_REDRAWOVERLAY) ? " overlay" : "");
+ (c->flags & CLIENT_REDRAWOVERLAY) ? " overlay" : "",
+ (c->flags & CLIENT_REDRAWPANES) ? " panes" : "");
}
/*
@@ -1711,6 +1712,8 @@ server_client_check_redraw(struct client *c)
break;
}
}
+ if (needed)
+ new_flags |= CLIENT_REDRAWPANES;
}
if (needed && (left = EVBUFFER_LENGTH(tty->out)) != 0) {
log_debug("%s: redraw deferred (%zu left)", c->name, left);
@@ -1720,12 +1723,7 @@ server_client_check_redraw(struct client *c)
log_debug("redraw timer started");
evtimer_add(&ev, &tv);
}
-
- /*
- * We may have got here for a single pane redraw, but force a
- * full redraw next time in case other panes have been updated.
- */
- c->flags |= CLIENT_ALLREDRAWFLAGS;
+ c->flags |= new_flags;
return;
} else if (needed)
log_debug("%s: redraw needed", c->name);
@@ -1741,10 +1739,12 @@ server_client_check_redraw(struct client *c)
*/
TAILQ_FOREACH(wp, &c->session->curw->window->panes, entry) {
if (wp->flags & PANE_REDRAW) {
+ log_debug("%s: redrawing pane %%%u", __func__, wp->id);
tty_update_mode(tty, tty->mode, NULL);
screen_redraw_pane(c, wp);
}
}
+ c->flags &= ~CLIENT_REDRAWPANES;
}
if (c->flags & CLIENT_ALLREDRAWFLAGS) {
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 9708b9b16ec..113397281ba 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1001 2020/04/17 14:06:42 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1002 2020/04/18 06:10:15 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1244,6 +1244,7 @@ struct tty {
#define TTY_BLOCK 0x80
#define TTY_HAVEDA 0x100
#define TTY_HAVEDSR 0x200
+#define TTY_SYNCING 0x400
int flags;
struct tty_term *term;
@@ -1538,12 +1539,14 @@ struct client {
#define CLIENT_CONTROL_NOOUTPUT 0x4000000
#define CLIENT_DEFAULTSOCKET 0x8000000
#define CLIENT_STARTSERVER 0x10000000
+#define CLIENT_REDRAWPANES 0x20000000
#define CLIENT_ALLREDRAWFLAGS \
(CLIENT_REDRAWWINDOW| \
CLIENT_REDRAWSTATUS| \
CLIENT_REDRAWSTATUSALWAYS| \
CLIENT_REDRAWBORDERS| \
- CLIENT_REDRAWOVERLAY)
+ CLIENT_REDRAWOVERLAY| \
+ CLIENT_REDRAWPANES)
#define CLIENT_UNATTACHEDFLAGS \
(CLIENT_DEAD| \
CLIENT_SUSPENDED| \
diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c
index 34961d01f47..34e84066c1c 100644
--- a/usr.bin/tmux/tty.c
+++ b/usr.bin/tmux/tty.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.354 2020/04/17 22:16:28 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.355 2020/04/18 06:10:15 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1438,15 +1438,19 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
void
tty_sync_start(struct tty *tty)
{
- if (tty_get_flags(tty) & TERM_SYNC)
+ if ((~tty->flags & TTY_SYNCING) && (tty_get_flags(tty) & TERM_SYNC)) {
tty_puts(tty, "\033P=1s\033\\");
+ tty->flags |= TTY_SYNCING;
+ }
}
void
tty_sync_end(struct tty *tty)
{
- if (tty_get_flags(tty) & TERM_SYNC)
+ if (tty_get_flags(tty) & TERM_SYNC) {
tty_puts(tty, "\033P=2s\033\\");
+ tty->flags &= ~TTY_SYNCING;
+ }
}
static int
@@ -1480,6 +1484,14 @@ tty_write(void (*cmdfn)(struct tty *, const struct tty_ctx *),
TAILQ_FOREACH(c, &clients, entry) {
if (!tty_client_ready(c, wp))
continue;
+ if (c->flags & CLIENT_REDRAWPANES) {
+ /*
+ * Redraw is already deferred to redraw another pane -
+ * redraw this one also when that happens.
+ */
+ wp->flags |= PANE_REDRAW;
+ break;
+ }
ctx->bigger = tty_window_offset(&c->tty, &ctx->ox, &ctx->oy,
&ctx->sx, &ctx->sy);