From 77f39c9df9ad8a0f55d09886181602f090a4c52e Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 12 Oct 2026 17:39:48 +0100 Subject: [PATCH 1/2] Remove check code for tracking down what turned out to be a Apple bug. --- grid.c | 50 -------------------------------------------------- screen.c | 6 ++---- spawn.c | 2 +- tmux.h | 2 +- 4 files changed, 4 insertions(+), 56 deletions(-) diff --git a/grid.c b/grid.c index e7f9ab7c6..830929c0e 100644 --- a/grid.c +++ b/grid.c @@ -18,9 +18,6 @@ #include -#ifdef __APPLE__ -#include -#endif #include #include @@ -59,42 +56,6 @@ static const struct grid_cell_entry grid_cleared_entry = { { .data = { 0, 8, 8, ' ' } }, GRID_FLAG_CLEARED }; -#ifdef __APPLE__ -void -grid_check_is_clear(struct grid *gd) -{ - struct grid_line *gl; - u_int yy, ny; - - assert(gd != NULL); - - if (gd->sy == 0) { - assert(gd->linedata == NULL); - return; - } - - assert(gd->linedata != NULL); - - ny = gd->hsize + gd->sy; - for (yy = 0; yy < ny; yy++) { - gl = &gd->linedata[yy]; - - assert(gl->celldata == NULL); - assert(gl->cellused == 0); - assert(gl->cellsize == 0); - assert(gl->extddata == NULL); - assert(gl->extdsize == 0); - assert(gl->flags == 0); - assert(gl->time == 0); - } -} -#else -void -grid_check_is_clear(__unused struct grid *gd) -{ -} -#endif - /* Store cell in entry. */ static void grid_store_cell(struct grid_cell_entry *gce, const struct grid_cell *gc, @@ -347,12 +308,6 @@ grid_free_line(struct grid *gd, u_int py) { struct grid_line *gl = &gd->linedata[py]; -#ifdef __APPLE__ - assert(gl->cellused <= gl->cellsize); - assert(gl->extdsize == 0 || gl->extddata != NULL); - assert(gl->cellsize == 0 || gl->celldata != NULL); -#endif - free(gl->celldata); free(gl->extddata); memset(gl, 0, sizeof *gl); @@ -384,11 +339,6 @@ grid_create(u_int sx, u_int sy, u_int hlimit) if (gd->sy != 0) gd->linedata = xcalloc(gd->sy, sizeof *gd->linedata); - -#ifdef __APPLE__ - assert(gd->hsize == 0); -#endif - grid_check_is_clear(gd); return (gd); } diff --git a/screen.c b/screen.c index 2a088edff..e8d90d595 100644 --- a/screen.c +++ b/screen.c @@ -101,12 +101,12 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit) s->write_list = NULL; s->hyperlinks = NULL; - screen_reinit(s, 1); + screen_reinit(s); } /* Reinitialise screen. */ void -screen_reinit(struct screen *s, int check) +screen_reinit(struct screen *s) { s->cx = 0; s->cy = 0; @@ -125,8 +125,6 @@ screen_reinit(struct screen *s, int check) s->saved_cy = UINT_MAX; screen_reset_tabs(s); - if (check) - grid_check_is_clear(s->grid); grid_clear_lines(s->grid, s->grid->hsize, s->grid->sy, 8); screen_clear_selection(s); diff --git a/spawn.c b/spawn.c index 63300e4fb..4717b55c1 100644 --- a/spawn.c +++ b/spawn.c @@ -327,7 +327,7 @@ spawn_pane(struct spawn_context *sc, char **cause) sc->wp0->fd = -1; } window_pane_reset_mode_all(sc->wp0); - screen_reinit(&sc->wp0->base, 0); + screen_reinit(&sc->wp0->base); if (sc->wp0->ictx != NULL) { input_free(sc->wp0->ictx); sc->wp0->ictx = NULL; diff --git a/tmux.h b/tmux.h index 1fe443561..37a504ac8 100644 --- a/tmux.h +++ b/tmux.h @@ -3674,7 +3674,7 @@ int redraw_get_status_border_cell_type(struct redraw_span **, u_int); /* screen.c */ void screen_init(struct screen *, u_int, u_int, u_int); -void screen_reinit(struct screen *, int); +void screen_reinit(struct screen *); void screen_free(struct screen *); void screen_reset_tabs(struct screen *); void screen_reset_hyperlinks(struct screen *); From d8aa8887323815d79596c7afc877d42bc08daf5d Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 12 Oct 2026 15:28:45 +0000 Subject: [PATCH 2/2] Reset background colour before clearing to end of line. --- tty-draw.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tty-draw.c b/tty-draw.c index d707d1bf3..c5d66a169 100644 --- a/tty-draw.c +++ b/tty-draw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-draw.c,v 1.17 2026/09/22 06:49:47 nicm Exp $ */ +/* $OpenBSD: tty-draw.c,v 1.18 2026/10/12 15:28:45 nicm Exp $ */ /* * Copyright (c) 2026 Nicholas Marriott @@ -253,6 +253,10 @@ tty_draw_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx, /* Outside the area being drawn. */ empty = nx - i; gcp = &grid_default_cell; + + /* Flush the background before clearing. */ + if (empty != 0 && gcp->bg != last.bg) + empty = 0; } else { /* Get the current cell. */ grid_view_get_cell(gd, px + i, py, &gc);