Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2026-06-15 09:00:05 +01:00
3 changed files with 70 additions and 13 deletions

View File

@@ -1127,6 +1127,25 @@ screen_write_backspace(struct screen_write_ctx *ctx)
screen_write_set_cursor(ctx, cx, cy); screen_write_set_cursor(ctx, cx, cy);
} }
/* Is this cell a single ASCII character? */
static int
screen_write_cell_is_single(const struct grid_cell *gc)
{
if (gc->data.width != 1)
return (0);
if (gc->data.size != 1)
return (0);
if (*gc->data.data < 0x20 || *gc->data.data == 0x7f)
return (0);
if (gc->flags & GRID_FLAG_CLEARED)
return (0);
if (gc->flags & GRID_FLAG_PADDING)
return (0);
if (gc->flags & GRID_FLAG_TAB)
return (0);
return (1);
}
/* Redraw all visible cells on a line. */ /* Redraw all visible cells on a line. */
static void static void
screen_write_redraw_line(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx, screen_write_redraw_line(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx,
@@ -1135,11 +1154,14 @@ screen_write_redraw_line(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx,
struct window_pane *wp = ctx->wp; struct window_pane *wp = ctx->wp;
struct screen *s = ctx->s; struct screen *s = ctx->s;
struct grid_cell gc, ngc; struct grid_cell gc, ngc;
u_int sx = screen_size_x(s), cx, i, n; u_int sx = screen_size_x(s), cx, i;
int xoff = wp->xoff, yoff = wp->yoff; int xoff = wp->xoff, yoff = wp->yoff;
struct visible_ranges *r; struct visible_ranges *r;
struct visible_range *ri; struct visible_range *ri;
if (s->mode & MODE_SYNC)
return;
r = screen_redraw_get_visible_ranges(wp, xoff, yoff + yy, sx, NULL); r = screen_redraw_get_visible_ranges(wp, xoff, yoff + yy, sx, NULL);
for (i = 0; i < r->used; i++) { for (i = 0; i < r->used; i++) {
ri = &r->ranges[i]; ri = &r->ranges[i];
@@ -1147,22 +1169,36 @@ screen_write_redraw_line(struct screen_write_ctx *ctx, struct tty_ctx *ttyctx,
continue; continue;
cx = ri->px - xoff; cx = ri->px - xoff;
for (n = 0; n < ri->nx && cx < sx; n++, cx++) { if (cx >= sx)
continue;
if (cx + ri->nx > sx)
ttyctx->n = sx - cx;
else
ttyctx->n = ri->nx;
if (ttyctx->n == 0)
continue;
ttyctx->ocx = cx;
ttyctx->ocy = yy;
if (ttyctx->n != 1) {
tty_write(tty_cmd_redrawline, ttyctx);
continue;
}
grid_view_get_cell(s->grid, cx, yy, &gc); grid_view_get_cell(s->grid, cx, yy, &gc);
if (!screen_write_cell_is_single(&gc)) {
tty_write(tty_cmd_redrawline, ttyctx);
continue;
}
if (~gc.flags & GRID_FLAG_SELECTED) if (~gc.flags & GRID_FLAG_SELECTED)
ttyctx->cell = &gc; ttyctx->cell = &gc;
else { else {
screen_select_cell(s, &ngc, &gc); screen_select_cell(s, &ngc, &gc);
ttyctx->cell = &ngc; ttyctx->cell = &ngc;
} }
ttyctx->ocx = cx;
ttyctx->ocy = yy;
if (~s->mode & MODE_SYNC)
tty_write(tty_cmd_cell, ttyctx); tty_write(tty_cmd_cell, ttyctx);
} }
} }
}
/* Redraw all visible cells in a pane. */ /* Redraw all visible cells in a pane. */
static void static void

1
tmux.h
View File

@@ -2738,6 +2738,7 @@ void tty_write(void (*)(struct tty *, const struct tty_ctx *),
void tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *); void tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
void tty_cmd_cell(struct tty *, const struct tty_ctx *); void tty_cmd_cell(struct tty *, const struct tty_ctx *);
void tty_cmd_cells(struct tty *, const struct tty_ctx *); void tty_cmd_cells(struct tty *, const struct tty_ctx *);
void tty_cmd_redrawline(struct tty *, const struct tty_ctx *);
void tty_cmd_clearendofline(struct tty *, const struct tty_ctx *); void tty_cmd_clearendofline(struct tty *, const struct tty_ctx *);
void tty_cmd_clearendofscreen(struct tty *, const struct tty_ctx *); void tty_cmd_clearendofscreen(struct tty *, const struct tty_ctx *);
void tty_cmd_clearline(struct tty *, const struct tty_ctx *); void tty_cmd_clearline(struct tty *, const struct tty_ctx *);

20
tty.c
View File

@@ -1435,6 +1435,26 @@ tty_draw_pane(struct tty *tty, const struct tty_ctx *ctx, u_int py)
} }
} }
void
tty_cmd_redrawline(struct tty *tty, const struct tty_ctx *ctx)
{
u_int i, x, rx, ry, j;
struct visible_ranges *r;
struct visible_range *rr;
if (tty_clamp_line(tty, ctx, ctx->ocx, ctx->ocy, ctx->n,
&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, ctx->s, i + rr->px - x,
ctx->ocy, rr->nx, rr->px, ry, &ctx->style_ctx);
}
}
}
/* Check if character needs to be mapped for codeset. */ /* Check if character needs to be mapped for codeset. */
const struct grid_cell * const struct grid_cell *
tty_check_codeset(struct tty *tty, const struct grid_cell *gc) tty_check_codeset(struct tty *tty, const struct grid_cell *gc)