diff --git a/tty.c b/tty.c index 233bcb1e..2e29c4d9 100644 --- a/tty.c +++ b/tty.c @@ -1093,7 +1093,7 @@ tty_redraw_region(struct tty *tty, const struct tty_ctx *ctx) * If region is large, schedule a redraw. In most cases this is likely * to be followed by some more scrolling. */ - if (tty_large_region(tty, ctx) && ~ctx->flags & TTY_CTX_PANE_OBSCURED) { + if (tty_large_region(tty, ctx) || ctx->flags & TTY_CTX_PANE_OBSCURED) { log_debug("%s: %s large region redraw", __func__, c->name); ctx->redraw_cb(ctx); return; @@ -1128,6 +1128,17 @@ tty_clamp_line(struct tty *tty, const struct tty_ctx *ctx, u_int px, u_int py, { int xoff = ctx->rxoff + px; + /* + * px = x position in pane + * py = y position in pane + * nx = width + * + * i = new x position in pane + * x = x position on terminal + * rx = new width + * ry = y position on terminal + */ + if (!tty_is_visible(tty, ctx, px, py, nx, 1)) return (0); *ry = ctx->yoff + py - ctx->woy; @@ -1391,63 +1402,32 @@ static void tty_draw_pane(struct tty *tty, const struct tty_ctx *ctx, u_int py) { struct screen *s = ctx->s; - struct window_pane *wp = ctx->arg; - struct visible_ranges *r = NULL; - struct visible_range *ri; - u_int nx = ctx->sx, i, px, x, rx, ry; + u_int nx = ctx->sx, i, x, rx, ry, j; + struct visible_ranges *r; + struct visible_range *rr; log_debug("%s: %s %u", __func__, tty->client->name, py); if (~ctx->flags & TTY_CTX_WINDOW_BIGGER) { - if (wp) { - if (ctx->flags & TTY_CTX_PANE_OBSCURED) { - /* - * Floating pane is present: use physical - * coordinates and clip to visible ranges to - * avoid drawing over the floating pane. - */ - r = tty_check_overlay_range(tty, ctx->xoff, - ctx->yoff + py, nx); - for (i = 0; i < r->used; i++) { - ri = &r->ranges[i]; - if (ri->nx == 0) continue; - tty_draw_line(tty, s, - ri->px - ctx->xoff, py, ri->nx, - ri->px, ctx->yoff + py, - &ctx->defaults, ctx->palette); - } - } else { - r = tty_check_overlay_range(tty, 0, - ctx->yoff + py, nx); - for (i = 0; i < r->used; i++) { - ri = &r->ranges[i]; - if (ri->nx == 0) continue; - tty_draw_line(tty, s, ri->px, py, - ri->nx, ctx->xoff + ri->px, - ctx->yoff + py, - &ctx->defaults, ctx->palette); - } - } - } else { - tty_draw_line(tty, s, 0, py, nx, ctx->xoff, - ctx->yoff + py, &ctx->defaults, ctx->palette); + r = tty_check_overlay_range(tty, ctx->xoff, ctx->yoff + py, nx); + for (j = 0; j < r->used; j++) { + rr = &r->ranges[j]; + if (rr->nx == 0) + continue; + tty_draw_line(tty, s, rr->px, py, rr->nx, + ctx->xoff + rr->px, ctx->yoff + py, &ctx->defaults, + ctx->palette); } return; } - if (tty_clamp_line(tty, ctx, 0, py, nx, &px, &x, &rx, &ry)) { - if (wp) { - r = tty_check_overlay_range(tty, px, py, rx); - for (i=0; i < r->used; i++) { - ri = &r->ranges[i]; - if (ri->nx == 0) - continue; - tty_draw_line(tty, s, ri->px, py, ri->nx, - x + ri->px, ry, &ctx->defaults, - ctx->palette); - } - } else { - tty_draw_line(tty, s, px, py, rx, x, ry, &ctx->defaults, - ctx->palette); + if (tty_clamp_line(tty, ctx, 0, py, nx, &i, &x, &rx, &ry)) { + r = tty_check_overlay_range(tty, x, ry, rx); + for (j = 0; j < r->used; j++) { + rr = &r->ranges[j]; + if (rr->nx == 0) + continue; + tty_draw_line(tty, s, i + rr->px, py, rr->nx, + x + rr->px, ry, &ctx->defaults, ctx->palette); } } } @@ -2221,21 +2201,21 @@ tty_cmd_syncstart(struct tty *tty, const struct tty_ctx *ctx) { struct client *c = tty->client; - if ((ctx->flags & TTY_CTX_OVERLAY_SYNC) && - (ctx->flags & TTY_CTX_SYNC)) { - /* - * This is an overlay and a command that moves the cursor so - * start synchronized updates. - */ - tty_sync_start(tty); - } else if (~ctx->flags & TTY_CTX_OVERLAY_SYNC) { - /* - * This is a pane. If there is an overlay, always start; - * otherwise, only if requested. - */ - if ((ctx->flags & TTY_CTX_SYNC) || c->overlay_draw != NULL) - tty_sync_start(tty); - } + if ((ctx->flags & TTY_CTX_OVERLAY_SYNC) && + (ctx->flags & TTY_CTX_SYNC)) { + /* + * This is an overlay and a command that moves the cursor so + * start synchronized updates. + */ + tty_sync_start(tty); + } else if (~ctx->flags & TTY_CTX_OVERLAY_SYNC) { + /* + * This is a pane. If there is an overlay, always start; + * otherwise, only if requested. + */ + if ((ctx->flags & TTY_CTX_SYNC) || c->overlay_draw != NULL) + tty_sync_start(tty); + } } void