From e2cf40ef99bdb6e15b8229244a0f29a6859191b0 Mon Sep 17 00:00:00 2001 From: Michael Grant Date: Mon, 23 Feb 2026 08:08:31 +0000 Subject: [PATCH] Fix crash cause by not having a wp pointer in tty.c. --- screen-write.c | 34 ++++++++++++++++++++++++++++++++++ tmux.h | 3 +++ tty.c | 42 +++++------------------------------------- 3 files changed, 42 insertions(+), 37 deletions(-) diff --git a/screen-write.c b/screen-write.c index df176083..ecbd9e11 100644 --- a/screen-write.c +++ b/screen-write.c @@ -1814,6 +1814,39 @@ screen_write_collect_scroll(struct screen_write_ctx *ctx, u_int bg) TAILQ_INSERT_TAIL(&ctx->s->write_list[s->rlower].items, ci, entry); } +/* Return 1 if there is a floating window pane overlapping this pane. */ +static int +screen_write_pane_obscured(struct window_pane *base_wp) +{ + struct window_pane *wp; + struct window *w; + int found_self = 0; + + if (base_wp == NULL) + return(0); + w = base_wp->window; + + /* Check if there is a floating pane. xxxx borders? scrollbars? */ + TAILQ_FOREACH_REVERSE(wp, &w->z_index, window_panes_zindex, zentry) { + if (wp == base_wp) { + found_self = 1; + continue; + } + if (found_self && wp->flags & PANE_FLOATING && + ! (wp->flags & PANE_MINIMISED) && + ((wp->yoff >= base_wp->yoff && + wp->yoff <= base_wp->yoff + (int)base_wp->sy) || + (wp->yoff + (int)wp->sy >= base_wp->yoff && + wp->yoff + wp->sy <= base_wp->yoff + base_wp->sy)) && + ((wp->xoff >= base_wp->xoff && + wp->xoff <= base_wp->xoff + (int)base_wp->sx) || + (wp->xoff + (int)wp->sx >= base_wp->xoff && + wp->xoff + wp->sx <= base_wp->xoff + base_wp->sx))) + return (1); + } + return (0); +} + /* Flush collected lines. */ static void screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only, @@ -1853,6 +1886,7 @@ screen_write_collect_flush(struct screen_write_ctx *ctx, int scroll_only, ttyctx.orlower -= (wp->yoff + wp->sy - wp->window->sy); ttyctx.num = ctx->scrolled; ttyctx.bg = ctx->bg; + ttyctx.obscured = screen_write_pane_obscured(wp); tty_write(tty_cmd_scrollup, &ttyctx); if (wp != NULL) diff --git a/tmux.h b/tmux.h index 2c7a4376..36510028 100644 --- a/tmux.h +++ b/tmux.h @@ -1721,6 +1721,9 @@ struct tty_ctx { u_int woy; u_int wsx; u_int wsy; + + /* tty partly obscured, it will need to be surgically scrolled. */ + u_int obscured; }; /* Saved message entry. */ diff --git a/tty.c b/tty.c index f969f46d..75cdbe2d 100644 --- a/tty.c +++ b/tty.c @@ -1527,7 +1527,7 @@ tty_set_client_cb(struct tty_ctx *ttyctx, struct client *c) ttyctx->bigger = tty_window_offset(&c->tty, &ttyctx->wox, &ttyctx->woy, &ttyctx->wsx, &ttyctx->wsy); - ttyctx->yoff = ttyctx->ryoff = wp->yoff; + ttyctx->yoff = ttyctx->ryoff = wp->yoff; /* xxxx find another way to do this */ if (status_at_line(c) == 0) ttyctx->yoff += status_line_size(c); @@ -1555,7 +1555,7 @@ tty_draw_images(struct client *c, struct window_pane *wp, struct screen *s) ttyctx.sy = wp->sy; ttyctx.ptr = im; - ttyctx.arg = wp; + ttyctx.arg = wp; /* xxx remove this */ ttyctx.set_client_cb = tty_set_client_cb; ttyctx.allow_invisible_panes = 1; tty_write_one(tty_cmd_sixelimage, c, &ttyctx); @@ -1866,39 +1866,6 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx) tty_putc(tty, '\n'); } -/* Return 1 if there is a floating window pane overlapping this pane. */ -static int -tty_is_obscured(const struct tty_ctx *ctx) -{ - struct window_pane *base_wp = ctx->arg, *wp; - struct window *w; - int found_self = 0; - - if (base_wp == NULL) - return(0); - w = base_wp->window; - - /* Check if there is a floating pane. xxxx borders? scrollbars? */ - TAILQ_FOREACH_REVERSE(wp, &w->z_index, window_panes_zindex, zentry) { - if (wp == base_wp) { - found_self = 1; - continue; - } - if (found_self && wp->flags & PANE_FLOATING && - ! (wp->flags & PANE_MINIMISED) && - ((wp->yoff >= base_wp->yoff && - wp->yoff <= base_wp->yoff + (int)base_wp->sy) || - (wp->yoff + (int)wp->sy >= base_wp->yoff && - wp->yoff + wp->sy <= base_wp->yoff + base_wp->sy)) && - ((wp->xoff >= base_wp->xoff && - wp->xoff <= base_wp->xoff + (int)base_wp->sx) || - (wp->xoff + (int)wp->sx >= base_wp->xoff && - wp->xoff + wp->sx <= base_wp->xoff + base_wp->sx))) - return (1); - } - return (0); -} - void tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx) { @@ -1911,7 +1878,8 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx) !tty_term_has(tty->term, TTYC_CSR) || ctx->sx == 1 || ctx->sy == 1 || - c->overlay_check != NULL) { + c->overlay_check != NULL || + ctx->obscured) { tty_redraw_region(tty, ctx); return; } @@ -2069,7 +2037,7 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx) { const struct grid_cell *gcp = ctx->cell; struct screen *s = ctx->s; - struct visible_ranges *r; + struct visible_ranges *r = NULL; u_int px, py, i, vis = 0; px = ctx->xoff + ctx->ocx - ctx->wox;