When checking ranges in tty_cmd_cells, cannot use the tty cursor
authornicm <nicm@openbsd.org>
Thu, 14 Oct 2021 09:54:51 +0000 (09:54 +0000)
committernicm <nicm@openbsd.org>
Thu, 14 Oct 2021 09:54:51 +0000 (09:54 +0000)
position and tty_cursor because it may be at the final invisible cursor
position on automargin terminals. The text to be drawn is confined to
the pane, so use the pane cursor position for the checks instead. Fix
from Anindya Mukherjee, redraw problem reported by naddy@.

usr.bin/tmux/tty.c

index 6a6b883..8f06227 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tty.c,v 1.406 2021/10/11 13:27:50 nicm Exp $ */
+/* $OpenBSD: tty.c,v 1.407 2021/10/14 09:54:51 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1993,8 +1993,9 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx)
 void
 tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
 {
-       struct overlay_ranges   r;
-       u_int                   i, px;
+       struct overlay_ranges    r;
+       u_int                    i, px, py, cx;
+       char                    *cp = ctx->ptr;
 
        if (!tty_is_visible(tty, ctx, ctx->ocx, ctx->ocy, ctx->num, 1))
                return;
@@ -2017,16 +2018,20 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
 
        tty_margin_off(tty);
        tty_cursor_pane_unless_wrap(tty, ctx, ctx->ocx, ctx->ocy);
-
        tty_attributes(tty, ctx->cell, &ctx->defaults, ctx->palette);
-       px = tty->cx;
-       tty_check_overlay_range(tty, px, tty->cy, ctx->num, &r);
+
+       /* Get tty position from pane position for overlay check. */
+       px = ctx->xoff + ctx->ocx - ctx->wox;
+       py = ctx->yoff + ctx->ocy - ctx->woy;
+
+       tty_check_overlay_range(tty, px, py, ctx->num, &r);
        for (i = 0; i < OVERLAY_MAX_RANGES; i++) {
                if (r.nx[i] == 0)
                        continue;
-               tty_cursor(tty, r.px[i], tty->cy);
-               tty_putn(tty, (char *)ctx->ptr + r.px[i] - px, r.nx[i],
-                   r.nx[i]);
+               /* Convert back to pane position for printing. */
+               cx = r.px[i] - ctx->xoff + ctx->wox;
+               tty_cursor_pane_unless_wrap(tty, ctx, cx, ctx->ocy);
+               tty_putn(tty, cp + r.px[i] - px, r.nx[i], r.nx[i]);
        }
 }