Use the y offset from the context which has already been adjusted for

the status line, also make tty_clamp_line adjust the y position.
pull/1450/head
Nicholas Marriott 2018-08-20 19:34:04 +01:00
parent 1e8c9fb490
commit 31508228bc
2 changed files with 28 additions and 28 deletions

View File

@ -94,7 +94,7 @@ void
screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp, screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
struct screen *s) struct screen *s)
{ {
char tmp[16]; char tmp[32];
u_int y; u_int y;
memset(ctx, 0, sizeof *ctx); memset(ctx, 0, sizeof *ctx);
@ -113,8 +113,10 @@ screen_write_start(struct screen_write_ctx *ctx, struct window_pane *wp,
ctx->scrolled = 0; ctx->scrolled = 0;
ctx->bg = 8; ctx->bg = 8;
if (wp != NULL) if (wp != NULL) {
snprintf(tmp, sizeof tmp, "pane %%%u", wp->id); snprintf(tmp, sizeof tmp, "pane %%%u (at %u,%u)", wp->id,
wp->xoff, wp->yoff);
}
log_debug("%s: size %ux%u, %s", __func__, screen_size_x(ctx->s), log_debug("%s: size %ux%u, %s", __func__, screen_size_x(ctx->s),
screen_size_y(ctx->s), wp == NULL ? "no pane" : tmp); screen_size_y(ctx->s), wp == NULL ? "no pane" : tmp);
} }

48
tty.c
View File

@ -889,13 +889,12 @@ static int
tty_is_visible(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx, tty_is_visible(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx,
u_int ny) u_int ny)
{ {
struct window_pane *wp = ctx->wp; u_int xoff = ctx->xoff + px, yoff = ctx->yoff + py;
u_int xoff = wp->xoff + px, yoff = wp->yoff + py;
if (!ctx->bigger) if (!ctx->bigger)
return (1); return (1);
if (xoff + nx <= ctx->ox || xoff >= ctx->ox + ctx->sx || if (xoff + nx <= ctx->ox || xoff > ctx->ox + ctx->sx ||
yoff + ny <= ctx->oy || yoff >= ctx->oy + ctx->sy) { yoff + ny <= ctx->oy || yoff > ctx->oy + ctx->sy) {
return (0); return (0);
} }
return (1); return (1);
@ -904,13 +903,13 @@ tty_is_visible(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx,
/* Clamp line position to visible part of pane. */ /* Clamp line position to visible part of pane. */
static int static int
tty_clamp_line(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx, tty_clamp_line(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx,
u_int *i, u_int *x, u_int *rx) u_int *i, u_int *x, u_int *rx, u_int *ry)
{ {
struct window_pane *wp = ctx->wp; u_int xoff = ctx->xoff + px;
u_int xoff = wp->xoff + px;
if (!tty_is_visible(ctx, px, py, nx, 1)) if (!tty_is_visible(ctx, px, py, nx, 1))
return (0); return (0);
*ry = ctx->yoff + py - ctx->oy;
if (xoff >= ctx->ox && xoff + nx <= ctx->ox + ctx->sx) { if (xoff >= ctx->ox && xoff + nx <= ctx->ox + ctx->sx) {
/* All visible. */ /* All visible. */
@ -983,10 +982,13 @@ static void
tty_clear_pane_line(struct tty *tty, const struct tty_ctx *ctx, u_int py, tty_clear_pane_line(struct tty *tty, const struct tty_ctx *ctx, u_int py,
u_int px, u_int nx, u_int bg) u_int px, u_int nx, u_int bg)
{ {
u_int i, x, rx; struct client *c = tty->client;
u_int i, x, rx, ry;
if (tty_clamp_line(ctx, px, py, nx, &i, &x, &rx)) log_debug("%s: %s, %u at %u,%u", __func__, c->name, nx, px, py);
tty_clear_line(tty, ctx->wp, py - ctx->oy, x, rx, bg);
if (tty_clamp_line(ctx, px, py, nx, &i, &x, &rx, &ry))
tty_clear_line(tty, ctx->wp, ry, x, rx, bg);
} }
/* Clamp area position to visible part of pane. */ /* Clamp area position to visible part of pane. */
@ -994,11 +996,9 @@ static int
tty_clamp_area(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx, tty_clamp_area(const struct tty_ctx *ctx, u_int px, u_int py, u_int nx,
u_int ny, u_int *i, u_int *j, u_int *x, u_int *y, u_int *rx, u_int *ry) u_int ny, u_int *i, u_int *j, u_int *x, u_int *y, u_int *rx, u_int *ry)
{ {
struct window_pane *wp = ctx->wp; u_int xoff = ctx->xoff + px, yoff = ctx->yoff + py;
u_int xoff = wp->xoff + px, yoff = wp->yoff + py;
if (xoff + nx <= ctx->ox || xoff >= ctx->ox + ctx->sx || if (!tty_is_visible(ctx, px, py, nx, ny))
yoff + ny <= ctx->oy || yoff >= ctx->oy + ctx->sy)
return (0); return (0);
if (xoff >= ctx->ox && xoff + nx <= ctx->ox + ctx->sx) { if (xoff >= ctx->ox && xoff + nx <= ctx->ox + ctx->sx) {
@ -1134,17 +1134,16 @@ tty_draw_pane(struct tty *tty, const struct tty_ctx *ctx, u_int py)
{ {
struct window_pane *wp = ctx->wp; struct window_pane *wp = ctx->wp;
struct screen *s = wp->screen; struct screen *s = wp->screen;
u_int xoff = ctx->xoff, yoff = ctx->yoff; u_int nx = screen_size_x(s), i, x, rx, ry;
u_int nx = screen_size_x(s), i, x, rx;
log_debug("%s: %s %u %d", __func__, tty->client->name, py, ctx->bigger); log_debug("%s: %s %u %d", __func__, tty->client->name, py, ctx->bigger);
if (!ctx->bigger) { if (!ctx->bigger) {
tty_draw_line(tty, wp, s, 0, py, nx, xoff, yoff + py); tty_draw_line(tty, wp, s, 0, py, nx, ctx->xoff, ctx->yoff);
return; return;
} }
if (tty_clamp_line(ctx, 0, py, nx, &i, &x, &rx)) if (tty_clamp_line(ctx, 0, py, nx, &i, &x, &rx, &ry))
tty_draw_line(tty, wp, s, i, py, rx, x, yoff + py - ctx->oy); tty_draw_line(tty, wp, s, i, py, rx, x, ry);
} }
static const struct grid_cell * static const struct grid_cell *
@ -1465,35 +1464,34 @@ void
tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
{ {
struct window_pane *wp = ctx->wp; struct window_pane *wp = ctx->wp;
u_int nx, py = ctx->yoff + ctx->ocy; u_int nx;
tty_default_attributes(tty, wp, ctx->bg); tty_default_attributes(tty, wp, ctx->bg);
nx = screen_size_x(wp->screen); nx = screen_size_x(wp->screen);
tty_clear_pane_line(tty, ctx, py, 0, nx, ctx->bg); tty_clear_pane_line(tty, ctx, ctx->ocy, 0, nx, ctx->bg);
} }
void void
tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
{ {
struct window_pane *wp = ctx->wp; struct window_pane *wp = ctx->wp;
u_int nx, py = ctx->yoff + ctx->ocy; u_int nx;
tty_default_attributes(tty, wp, ctx->bg); tty_default_attributes(tty, wp, ctx->bg);
nx = screen_size_x(wp->screen) - ctx->ocx; nx = screen_size_x(wp->screen) - ctx->ocx;
tty_clear_pane_line(tty, ctx, py, ctx->ocx, nx, ctx->bg); tty_clear_pane_line(tty, ctx, ctx->ocy, ctx->ocx, nx, ctx->bg);
} }
void void
tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx) tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
{ {
struct window_pane *wp = ctx->wp; struct window_pane *wp = ctx->wp;
u_int py = ctx->yoff + ctx->ocy;
tty_default_attributes(tty, wp, ctx->bg); tty_default_attributes(tty, wp, ctx->bg);
tty_clear_pane_line(tty, ctx, py, 0, ctx->ocx + 1, ctx->bg); tty_clear_pane_line(tty, ctx, ctx->ocy, 0, ctx->ocx + 1, ctx->bg);
} }
void void