If a pane has no scrollbar, don't bother to redraw it, and if redraw is

deferred change scrollbar redraws into redraw-all-scrollbars not redraw
entire window. GitHub issue 5529.
This commit is contained in:
nicm
2026-08-24 21:17:19 +00:00
committed by tmux update bot
parent dc78d8f9ea
commit 2d5328a860
3 changed files with 19 additions and 9 deletions

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: server-client.c,v 1.506 2026/08/24 07:08:19 nicm Exp $ */
/* $OpenBSD: server-client.c,v 1.507 2026/08/24 21:17:19 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2489,7 +2489,7 @@ server_client_check_redraw(struct client *c)
/* Work out if a redraw is actually needed. */
needed = 0;
if (c->flags & CLIENT_ALLREDRAWFLAGS)
if (c->flags & (CLIENT_ALLREDRAWFLAGS|CLIENT_REDRAWSCROLLBARS))
needed = 1;
else if (server_client_any_pane_redraw(c))
needed = 1;
@@ -2515,8 +2515,14 @@ server_client_check_redraw(struct client *c)
log_debug("redraw timer started");
evtimer_add(&ev, &tv);
}
if (server_client_any_pane_redraw(c))
c->flags |= CLIENT_REDRAWWINDOW;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->flags & PANE_REDRAW) {
c->flags |= CLIENT_REDRAWWINDOW;
break;
}
if (wp->flags & PANE_REDRAWSCROLLBAR)
c->flags |= CLIENT_REDRAWSCROLLBARS;
}
return;
}
@@ -2535,7 +2541,8 @@ server_client_check_redraw(struct client *c)
log_debug("%s: redraw pane %%%u", __func__,
wp->id);
redraw_pane(c, wp);
} else if (wp->flags & PANE_REDRAWSCROLLBAR) {
} else if ((wp->flags & PANE_REDRAWSCROLLBAR) ||
(c->flags & CLIENT_REDRAWSCROLLBARS)) {
log_debug("%s: redraw scrollbar %%%u", __func__,
wp->id);
redraw_pane_scrollbar(c, wp);
@@ -2565,7 +2572,8 @@ server_client_check_redraw(struct client *c)
* All the redraw flags can now be cleared. Also record how many bytes
* were written.
*/
c->flags &= ~(CLIENT_ALLREDRAWFLAGS|CLIENT_STATUSFORCE);
c->flags &= ~(CLIENT_ALLREDRAWFLAGS|CLIENT_REDRAWSCROLLBARS|
CLIENT_STATUSFORCE);
c->redraw = EVBUFFER_LENGTH(tty->out);
log_debug("%s: redraw added %zu bytes", c->name, c->redraw);
}

4
tmux.h
View File

@@ -1,4 +1,4 @@
/* $OpenBSD: tmux.h,v 1.1429 2026/08/20 09:19:24 nicm Exp $ */
/* $OpenBSD: tmux.h,v 1.1430 2026/08/24 21:17:19 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -2249,7 +2249,7 @@ struct client {
#define CLIENT_STARTSERVER 0x10000000
#define CLIENT_REDRAWMENU 0x20000000
#define CLIENT_NOFORK 0x40000000
/* 0x80000000ULL unused */
#define CLIENT_REDRAWSCROLLBARS 0x80000000ULL
#define CLIENT_CONTROL_PAUSEAFTER 0x100000000ULL
#define CLIENT_CONTROL_WAITEXIT 0x200000000ULL
#define CLIENT_WINDOWSIZECHANGED 0x400000000ULL

View File

@@ -1,4 +1,4 @@
/* $OpenBSD: window.c,v 1.372 2026/08/24 07:14:54 nicm Exp $ */
/* $OpenBSD: window.c,v 1.373 2026/08/24 21:17:19 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1471,6 +1471,8 @@ window_pane_scrollbar_overlay_visible(struct window_pane *wp)
void
window_pane_scrollbar_redraw(struct window_pane *wp)
{
if (!window_pane_scrollbar_visible(wp))
return;
if (window_pane_scrollbar_overlay_visible(wp)) {
wp->flags |= PANE_REDRAW;
return;