summaryrefslogtreecommitdiffstats
path: root/tty.c
diff options
context:
space:
mode:
authornicm <nicm>2021-10-14 09:54:51 +0000
committernicm <nicm>2021-10-14 09:54:51 +0000
commitd0ab1a837a0ab3e26fe7195f14672f6feb43c4c4 (patch)
tree4dba4f0016458b52e868f655553ac0048962c0f3 /tty.c
parent837ca176d1874273f3de615c75b506e1b1787a1b (diff)
When checking ranges in tty_cmd_cells, cannot use the tty cursor
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@.
Diffstat (limited to 'tty.c')
-rw-r--r--tty.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/tty.c b/tty.c
index 9a8265ef..809289e0 100644
--- a/tty.c
+++ b/tty.c
@@ -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]);
}
}