mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:37:12 +00:00
Do not hoke into struct window_pane from the tty code and instead set
everything up in tty_ctx. Provide a way to initialize the tty_ctx from a callback and use it to let popups draw directly through input_parse in the same way as panes do, rather than forcing a full redraw on every change.
This commit is contained in:
370
tty.c
370
tty.c
@ -34,7 +34,7 @@
|
||||
|
||||
static int tty_log_fd = -1;
|
||||
|
||||
static int tty_client_ready(struct client *, struct window_pane *);
|
||||
static int tty_client_ready(struct client *);
|
||||
|
||||
static void tty_set_italics(struct tty *);
|
||||
static int tty_try_colour(struct tty *, int, const char *);
|
||||
@ -45,12 +45,9 @@ static void tty_cursor_pane_unless_wrap(struct tty *,
|
||||
const struct tty_ctx *, u_int, u_int);
|
||||
static void tty_invalidate(struct tty *);
|
||||
static void tty_colours(struct tty *, const struct grid_cell *);
|
||||
static void tty_check_fg(struct tty *, struct window_pane *,
|
||||
struct grid_cell *);
|
||||
static void tty_check_bg(struct tty *, struct window_pane *,
|
||||
struct grid_cell *);
|
||||
static void tty_check_us(struct tty *, struct window_pane *,
|
||||
struct grid_cell *);
|
||||
static void tty_check_fg(struct tty *, int *, struct grid_cell *);
|
||||
static void tty_check_bg(struct tty *, int *, struct grid_cell *);
|
||||
static void tty_check_us(struct tty *, int *, struct grid_cell *);
|
||||
static void tty_colours_fg(struct tty *, const struct grid_cell *);
|
||||
static void tty_colours_bg(struct tty *, const struct grid_cell *);
|
||||
static void tty_colours_us(struct tty *, const struct grid_cell *);
|
||||
@ -61,17 +58,17 @@ static void tty_region(struct tty *, u_int, u_int);
|
||||
static void tty_margin_pane(struct tty *, const struct tty_ctx *);
|
||||
static void tty_margin(struct tty *, u_int, u_int);
|
||||
static int tty_large_region(struct tty *, const struct tty_ctx *);
|
||||
static int tty_fake_bce(const struct tty *, struct window_pane *, u_int);
|
||||
static int tty_fake_bce(const struct tty *, const struct grid_cell *,
|
||||
u_int);
|
||||
static void tty_redraw_region(struct tty *, const struct tty_ctx *);
|
||||
static void tty_emulate_repeat(struct tty *, enum tty_code_code,
|
||||
enum tty_code_code, u_int);
|
||||
static void tty_repeat_space(struct tty *, u_int);
|
||||
static void tty_draw_pane(struct tty *, const struct tty_ctx *, u_int);
|
||||
static void tty_cell(struct tty *, const struct grid_cell *,
|
||||
struct window_pane *);
|
||||
static void tty_default_colours(struct grid_cell *, struct window_pane *);
|
||||
static void tty_default_attributes(struct tty *, struct window_pane *,
|
||||
u_int);
|
||||
const struct grid_cell *, int *);
|
||||
static void tty_default_attributes(struct tty *, const struct grid_cell *,
|
||||
int *, u_int);
|
||||
|
||||
#define tty_use_margin(tty) \
|
||||
(tty->term->flags & TERM_DECSLRM)
|
||||
@ -888,6 +885,27 @@ tty_update_client_offset(struct client *c)
|
||||
c->flags |= (CLIENT_REDRAWWINDOW|CLIENT_REDRAWSTATUS);
|
||||
}
|
||||
|
||||
/* Get a palette entry. */
|
||||
static int
|
||||
tty_get_palette(int *palette, int c)
|
||||
{
|
||||
int new;
|
||||
|
||||
if (palette == NULL)
|
||||
return (-1);
|
||||
|
||||
new = -1;
|
||||
if (c < 8)
|
||||
new = palette[c];
|
||||
else if (c >= 90 && c <= 97)
|
||||
new = palette[8 + c - 90];
|
||||
else if (c & COLOUR_FLAG_256)
|
||||
new = palette[c & ~COLOUR_FLAG_256];
|
||||
if (new == 0)
|
||||
return (-1);
|
||||
return (new);
|
||||
}
|
||||
|
||||
/*
|
||||
* Is the region large enough to be worth redrawing once later rather than
|
||||
* probably several times now? Currently yes if it is more than 50% of the
|
||||
@ -904,18 +922,11 @@ tty_large_region(__unused struct tty *tty, const struct tty_ctx *ctx)
|
||||
* emulated.
|
||||
*/
|
||||
static int
|
||||
tty_fake_bce(const struct tty *tty, struct window_pane *wp, u_int bg)
|
||||
tty_fake_bce(const struct tty *tty, const struct grid_cell *gc, u_int bg)
|
||||
{
|
||||
struct grid_cell gc;
|
||||
|
||||
if (tty_term_flag(tty->term, TTYC_BCE))
|
||||
return (0);
|
||||
|
||||
memcpy(&gc, &grid_default_cell, sizeof gc);
|
||||
if (wp != NULL)
|
||||
tty_default_colours(&gc, wp);
|
||||
|
||||
if (!COLOUR_DEFAULT(bg) || !COLOUR_DEFAULT(gc.bg))
|
||||
if (!COLOUR_DEFAULT(bg) || !COLOUR_DEFAULT(gc->bg))
|
||||
return (1);
|
||||
return (0);
|
||||
}
|
||||
@ -929,16 +940,15 @@ static void
|
||||
tty_redraw_region(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct client *c = tty->client;
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int i;
|
||||
|
||||
/*
|
||||
* If region is large, schedule a window redraw. In most cases this is
|
||||
* likely to be followed by some more scrolling.
|
||||
* 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)) {
|
||||
log_debug("%s: %s, large redraw of %%%u", __func__, c->name, wp->id);
|
||||
wp->flags |= PANE_REDRAW;
|
||||
log_debug("%s: %s large redraw", __func__, c->name);
|
||||
ctx->redraw_cb(ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -977,8 +987,7 @@ static int
|
||||
tty_clamp_line(struct tty *tty, 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 *ry)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int xoff = wp->xoff + px;
|
||||
u_int xoff = ctx->rxoff + px;
|
||||
|
||||
if (!tty_is_visible(tty, ctx, px, py, nx, 1))
|
||||
return (0);
|
||||
@ -1013,8 +1022,8 @@ tty_clamp_line(struct tty *tty, const struct tty_ctx *ctx, u_int px, u_int py,
|
||||
|
||||
/* Clear a line. */
|
||||
static void
|
||||
tty_clear_line(struct tty *tty, struct window_pane *wp, u_int py, u_int px,
|
||||
u_int nx, u_int bg)
|
||||
tty_clear_line(struct tty *tty, const struct grid_cell *defaults, u_int py,
|
||||
u_int px, u_int nx, u_int bg)
|
||||
{
|
||||
struct client *c = tty->client;
|
||||
|
||||
@ -1025,7 +1034,7 @@ tty_clear_line(struct tty *tty, struct window_pane *wp, u_int py, u_int px,
|
||||
return;
|
||||
|
||||
/* If genuine BCE is available, can try escape sequences. */
|
||||
if (!tty_fake_bce(tty, wp, bg)) {
|
||||
if (!tty_fake_bce(tty, defaults, bg)) {
|
||||
/* Off the end of the line, use EL if available. */
|
||||
if (px + nx >= tty->sx && tty_term_has(tty->term, TTYC_EL)) {
|
||||
tty_cursor(tty, px, py);
|
||||
@ -1064,7 +1073,7 @@ tty_clear_pane_line(struct tty *tty, const struct tty_ctx *ctx, u_int py,
|
||||
log_debug("%s: %s, %u at %u,%u", __func__, c->name, nx, px, py);
|
||||
|
||||
if (tty_clamp_line(tty, ctx, px, py, nx, &i, &x, &rx, &ry))
|
||||
tty_clear_line(tty, ctx->wp, ry, x, rx, bg);
|
||||
tty_clear_line(tty, &ctx->defaults, ry, x, rx, bg);
|
||||
}
|
||||
|
||||
/* Clamp area position to visible part of pane. */
|
||||
@ -1073,8 +1082,7 @@ tty_clamp_area(struct tty *tty, 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)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int xoff = wp->xoff + px, yoff = wp->yoff + py;
|
||||
u_int xoff = ctx->rxoff + px, yoff = ctx->ryoff + py;
|
||||
|
||||
if (!tty_is_visible(tty, ctx, px, py, nx, ny))
|
||||
return (0);
|
||||
@ -1132,8 +1140,8 @@ tty_clamp_area(struct tty *tty, const struct tty_ctx *ctx, u_int px, u_int py,
|
||||
|
||||
/* Clear an area, adjusting to visible part of pane. */
|
||||
static void
|
||||
tty_clear_area(struct tty *tty, struct window_pane *wp, u_int py, u_int ny,
|
||||
u_int px, u_int nx, u_int bg)
|
||||
tty_clear_area(struct tty *tty, const struct grid_cell *defaults, u_int py,
|
||||
u_int ny, u_int px, u_int nx, u_int bg)
|
||||
{
|
||||
struct client *c = tty->client;
|
||||
u_int yy;
|
||||
@ -1146,7 +1154,7 @@ tty_clear_area(struct tty *tty, struct window_pane *wp, u_int py, u_int ny,
|
||||
return;
|
||||
|
||||
/* If genuine BCE is available, can try escape sequences. */
|
||||
if (!tty_fake_bce(tty, wp, bg)) {
|
||||
if (!tty_fake_bce(tty, defaults, bg)) {
|
||||
/* Use ED if clearing off the bottom of the terminal. */
|
||||
if (px == 0 &&
|
||||
px + nx >= tty->sx &&
|
||||
@ -1199,7 +1207,7 @@ tty_clear_area(struct tty *tty, struct window_pane *wp, u_int py, u_int ny,
|
||||
|
||||
/* Couldn't use an escape sequence, loop over the lines. */
|
||||
for (yy = py; yy < py + ny; yy++)
|
||||
tty_clear_line(tty, wp, yy, px, nx, bg);
|
||||
tty_clear_line(tty, defaults, yy, px, nx, bg);
|
||||
}
|
||||
|
||||
/* Clear an area in a pane. */
|
||||
@ -1210,24 +1218,26 @@ tty_clear_pane_area(struct tty *tty, const struct tty_ctx *ctx, u_int py,
|
||||
u_int i, j, x, y, rx, ry;
|
||||
|
||||
if (tty_clamp_area(tty, ctx, px, py, nx, ny, &i, &j, &x, &y, &rx, &ry))
|
||||
tty_clear_area(tty, ctx->wp, y, ry, x, rx, bg);
|
||||
tty_clear_area(tty, &ctx->defaults, y, ry, x, rx, bg);
|
||||
}
|
||||
|
||||
static void
|
||||
tty_draw_pane(struct tty *tty, const struct tty_ctx *ctx, u_int py)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
struct screen *s = wp->screen;
|
||||
u_int nx = ctx->sx, i, x, rx, ry;
|
||||
struct screen *s = ctx->s;
|
||||
u_int nx = ctx->sx, i, x, rx, ry;
|
||||
|
||||
log_debug("%s: %s %u %d", __func__, tty->client->name, py, ctx->bigger);
|
||||
|
||||
if (!ctx->bigger) {
|
||||
tty_draw_line(tty, wp, s, 0, py, nx, ctx->xoff, ctx->yoff + py);
|
||||
tty_draw_line(tty, s, 0, py, nx, ctx->xoff, ctx->yoff + py,
|
||||
&ctx->defaults, ctx->palette);
|
||||
return;
|
||||
}
|
||||
if (tty_clamp_line(tty, ctx, 0, py, nx, &i, &x, &rx, &ry))
|
||||
tty_draw_line(tty, wp, s, i, py, rx, x, ry);
|
||||
if (tty_clamp_line(tty, ctx, 0, py, nx, &i, &x, &rx, &ry)) {
|
||||
tty_draw_line(tty, s, i, py, rx, x, ry, &ctx->defaults,
|
||||
ctx->palette);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct grid_cell *
|
||||
@ -1265,8 +1275,8 @@ tty_check_overlay(struct tty *tty, u_int px, u_int py)
|
||||
}
|
||||
|
||||
void
|
||||
tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
u_int px, u_int py, u_int nx, u_int atx, u_int aty)
|
||||
tty_draw_line(struct tty *tty, struct screen *s, u_int px, u_int py, u_int nx,
|
||||
u_int atx, u_int aty, const struct grid_cell *defaults, int *palette)
|
||||
{
|
||||
struct grid *gd = s->grid;
|
||||
struct grid_cell gc, last;
|
||||
@ -1314,8 +1324,7 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
gl = NULL;
|
||||
else
|
||||
gl = grid_get_line(gd, gd->hsize + py - 1);
|
||||
if (wp == NULL ||
|
||||
gl == NULL ||
|
||||
if (gl == NULL ||
|
||||
(~gl->flags & GRID_LINE_WRAPPED) ||
|
||||
atx != 0 ||
|
||||
tty->cx < tty->sx ||
|
||||
@ -1324,8 +1333,8 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
atx == 0 &&
|
||||
px + sx != nx &&
|
||||
tty_term_has(tty->term, TTYC_EL1) &&
|
||||
!tty_fake_bce(tty, wp, 8)) {
|
||||
tty_default_attributes(tty, wp, 8);
|
||||
!tty_fake_bce(tty, defaults, 8)) {
|
||||
tty_default_attributes(tty, defaults, palette, 8);
|
||||
tty_cursor(tty, nx - 1, aty);
|
||||
tty_putcode(tty, TTYC_EL1);
|
||||
cleared = 1;
|
||||
@ -1352,11 +1361,11 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
gcp->us != last.us ||
|
||||
ux + width + gcp->data.width > nx ||
|
||||
(sizeof buf) - len < gcp->data.size)) {
|
||||
tty_attributes(tty, &last, wp);
|
||||
tty_attributes(tty, &last, defaults, palette);
|
||||
if (last.flags & GRID_FLAG_CLEARED) {
|
||||
log_debug("%s: %zu cleared", __func__, len);
|
||||
tty_clear_line(tty, wp, aty, atx + ux, width,
|
||||
last.bg);
|
||||
tty_clear_line(tty, defaults, aty, atx + ux,
|
||||
width, last.bg);
|
||||
} else {
|
||||
if (!wrapped || atx != 0 || ux != 0)
|
||||
tty_cursor(tty, atx + ux, aty);
|
||||
@ -1376,7 +1385,7 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
if (!tty_check_overlay(tty, atx + ux, aty))
|
||||
ux += gcp->data.width;
|
||||
else if (ux + gcp->data.width > nx) {
|
||||
tty_attributes(tty, &last, wp);
|
||||
tty_attributes(tty, &last, defaults, palette);
|
||||
tty_cursor(tty, atx + ux, aty);
|
||||
for (j = 0; j < gcp->data.width; j++) {
|
||||
if (ux + j > nx)
|
||||
@ -1385,7 +1394,7 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
ux++;
|
||||
}
|
||||
} else if (gcp->attr & GRID_ATTR_CHARSET) {
|
||||
tty_attributes(tty, &last, wp);
|
||||
tty_attributes(tty, &last, defaults, palette);
|
||||
tty_cursor(tty, atx + ux, aty);
|
||||
for (j = 0; j < gcp->data.size; j++)
|
||||
tty_putc(tty, gcp->data.data[j]);
|
||||
@ -1397,10 +1406,11 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
}
|
||||
}
|
||||
if (len != 0 && ((~last.flags & GRID_FLAG_CLEARED) || last.bg != 8)) {
|
||||
tty_attributes(tty, &last, wp);
|
||||
tty_attributes(tty, &last, defaults, palette);
|
||||
if (last.flags & GRID_FLAG_CLEARED) {
|
||||
log_debug("%s: %zu cleared (end)", __func__, len);
|
||||
tty_clear_line(tty, wp, aty, atx + ux, width, last.bg);
|
||||
tty_clear_line(tty, defaults, aty, atx + ux, width,
|
||||
last.bg);
|
||||
} else {
|
||||
if (!wrapped || atx != 0 || ux != 0)
|
||||
tty_cursor(tty, atx + ux, aty);
|
||||
@ -1412,8 +1422,8 @@ tty_draw_line(struct tty *tty, struct window_pane *wp, struct screen *s,
|
||||
if (!cleared && ux < nx) {
|
||||
log_debug("%s: %u to end of line (%zu cleared)", __func__,
|
||||
nx - ux, len);
|
||||
tty_default_attributes(tty, wp, 8);
|
||||
tty_clear_line(tty, wp, aty, atx + ux, nx - ux, 8);
|
||||
tty_default_attributes(tty, defaults, palette, 8);
|
||||
tty_clear_line(tty, defaults, aty, atx + ux, nx - ux, 8);
|
||||
}
|
||||
|
||||
tty->flags = (tty->flags & ~TTY_NOCURSOR) | flags;
|
||||
@ -1451,7 +1461,7 @@ tty_sync_end(struct tty *tty)
|
||||
}
|
||||
|
||||
static int
|
||||
tty_client_ready(struct client *c, struct window_pane *wp)
|
||||
tty_client_ready(struct client *c)
|
||||
{
|
||||
if (c->session == NULL || c->tty.term == NULL)
|
||||
return (0);
|
||||
@ -1459,10 +1469,6 @@ tty_client_ready(struct client *c, struct window_pane *wp)
|
||||
return (0);
|
||||
if (c->tty.flags & TTY_FREEZE)
|
||||
return (0);
|
||||
if (c->session->curw->window != wp->window)
|
||||
return (0);
|
||||
if (wp->layout_cell == NULL)
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@ -1470,36 +1476,19 @@ void
|
||||
tty_write(void (*cmdfn)(struct tty *, const struct tty_ctx *),
|
||||
struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
struct client *c;
|
||||
struct client *c;
|
||||
int state;
|
||||
|
||||
if (wp == NULL)
|
||||
if (ctx->set_client_cb == NULL)
|
||||
return;
|
||||
if (wp->flags & (PANE_REDRAW|PANE_DROP))
|
||||
return;
|
||||
|
||||
TAILQ_FOREACH(c, &clients, entry) {
|
||||
if (!tty_client_ready(c, wp))
|
||||
if (!tty_client_ready(c))
|
||||
continue;
|
||||
if (c->flags & CLIENT_REDRAWPANES) {
|
||||
/*
|
||||
* Redraw is already deferred to redraw another pane -
|
||||
* redraw this one also when that happens.
|
||||
*/
|
||||
log_debug("adding %%%u to deferred redraw", wp->id);
|
||||
wp->flags |= PANE_REDRAW;
|
||||
state = ctx->set_client_cb(ctx, c);
|
||||
if (state == -1)
|
||||
break;
|
||||
}
|
||||
|
||||
ctx->bigger = tty_window_offset(&c->tty, &ctx->wox, &ctx->woy,
|
||||
&ctx->wsx, &ctx->wsy);
|
||||
|
||||
ctx->xoff = wp->xoff;
|
||||
ctx->yoff = wp->yoff;
|
||||
|
||||
if (status_at_line(c) == 0)
|
||||
ctx->yoff += status_line_size(c);
|
||||
|
||||
if (state == 0)
|
||||
continue;
|
||||
cmdfn(&c->tty, ctx);
|
||||
}
|
||||
}
|
||||
@ -1507,18 +1496,16 @@ tty_write(void (*cmdfn)(struct tty *, const struct tty_ctx *),
|
||||
void
|
||||
tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
if (ctx->bigger ||
|
||||
!tty_full_width(tty, ctx) ||
|
||||
tty_fake_bce(tty, wp, ctx->bg) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, ctx->bg) ||
|
||||
(!tty_term_has(tty->term, TTYC_ICH) &&
|
||||
!tty_term_has(tty->term, TTYC_ICH1))) {
|
||||
tty_draw_pane(tty, ctx, ctx->ocy);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
||||
|
||||
@ -1528,18 +1515,16 @@ tty_cmd_insertcharacter(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_deletecharacter(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
if (ctx->bigger ||
|
||||
!tty_full_width(tty, ctx) ||
|
||||
tty_fake_bce(tty, wp, ctx->bg) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, ctx->bg) ||
|
||||
(!tty_term_has(tty->term, TTYC_DCH) &&
|
||||
!tty_term_has(tty->term, TTYC_DCH1))) {
|
||||
tty_draw_pane(tty, ctx, ctx->ocy);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
||||
|
||||
@ -1554,12 +1539,12 @@ tty_cmd_clearcharacter(struct tty *tty, const struct tty_ctx *ctx)
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, ctx->wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_cursor_pane(tty, ctx, ctx->ocx, ctx->ocy);
|
||||
|
||||
if (tty_term_has(tty->term, TTYC_ECH) &&
|
||||
!tty_fake_bce(tty, ctx->wp, 8))
|
||||
!tty_fake_bce(tty, &ctx->defaults, 8))
|
||||
tty_putcode1(tty, TTYC_ECH, ctx->num);
|
||||
else
|
||||
tty_repeat_space(tty, ctx->num);
|
||||
@ -1570,16 +1555,16 @@ tty_cmd_insertline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
if (ctx->bigger ||
|
||||
!tty_full_width(tty, ctx) ||
|
||||
tty_fake_bce(tty, ctx->wp, ctx->bg) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, ctx->bg) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
!tty_term_has(tty->term, TTYC_IL1) ||
|
||||
ctx->wp->sx == 1 ||
|
||||
ctx->wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, ctx->wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_off(tty);
|
||||
@ -1594,16 +1579,16 @@ tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
if (ctx->bigger ||
|
||||
!tty_full_width(tty, ctx) ||
|
||||
tty_fake_bce(tty, ctx->wp, ctx->bg) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, ctx->bg) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
!tty_term_has(tty->term, TTYC_DL1) ||
|
||||
ctx->wp->sx == 1 ||
|
||||
ctx->wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, ctx->wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_off(tty);
|
||||
@ -1616,9 +1601,7 @@ tty_cmd_deleteline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_clear_pane_line(tty, ctx, ctx->ocy, 0, ctx->sx, ctx->bg);
|
||||
}
|
||||
@ -1626,10 +1609,9 @@ tty_cmd_clearline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int nx = ctx->sx - ctx->ocx;
|
||||
u_int nx = ctx->sx - ctx->ocx;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_clear_pane_line(tty, ctx, ctx->ocy, ctx->ocx, nx, ctx->bg);
|
||||
}
|
||||
@ -1637,9 +1619,7 @@ tty_cmd_clearendofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_clear_pane_line(tty, ctx, ctx->ocy, 0, ctx->ocx + 1, ctx->bg);
|
||||
}
|
||||
@ -1647,24 +1627,22 @@ tty_cmd_clearstartofline(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
if (ctx->ocy != ctx->orupper)
|
||||
return;
|
||||
|
||||
if (ctx->bigger ||
|
||||
(!tty_full_width(tty, ctx) && !tty_use_margin(tty)) ||
|
||||
tty_fake_bce(tty, wp, 8) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, 8) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
(!tty_term_has(tty->term, TTYC_RI) &&
|
||||
!tty_term_has(tty->term, TTYC_RIN)) ||
|
||||
ctx->wp->sx == 1 ||
|
||||
ctx->wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_pane(tty, ctx);
|
||||
@ -1679,22 +1657,20 @@ tty_cmd_reverseindex(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
if (ctx->ocy != ctx->orlower)
|
||||
return;
|
||||
|
||||
if (ctx->bigger ||
|
||||
(!tty_full_width(tty, ctx) && !tty_use_margin(tty)) ||
|
||||
tty_fake_bce(tty, wp, 8) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, 8) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
wp->sx == 1 ||
|
||||
wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_pane(tty, ctx);
|
||||
@ -1720,20 +1696,19 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int i;
|
||||
u_int i;
|
||||
|
||||
if (ctx->bigger ||
|
||||
(!tty_full_width(tty, ctx) && !tty_use_margin(tty)) ||
|
||||
tty_fake_bce(tty, wp, 8) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, 8) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
wp->sx == 1 ||
|
||||
wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_pane(tty, ctx);
|
||||
@ -1757,22 +1732,21 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int i;
|
||||
u_int i;
|
||||
|
||||
if (ctx->bigger ||
|
||||
(!tty_full_width(tty, ctx) && !tty_use_margin(tty)) ||
|
||||
tty_fake_bce(tty, wp, 8) ||
|
||||
tty_fake_bce(tty, &ctx->defaults, 8) ||
|
||||
!tty_term_has(tty->term, TTYC_CSR) ||
|
||||
(!tty_term_has(tty->term, TTYC_RI) &&
|
||||
!tty_term_has(tty->term, TTYC_RIN)) ||
|
||||
wp->sx == 1 ||
|
||||
wp->sy == 1) {
|
||||
ctx->sx == 1 ||
|
||||
ctx->sy == 1) {
|
||||
tty_redraw_region(tty, ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
|
||||
tty_margin_pane(tty, ctx);
|
||||
@ -1789,10 +1763,9 @@ tty_cmd_scrolldown(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearendofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int px, py, nx, ny;
|
||||
u_int px, py, nx, ny;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, 0, ctx->sy - 1);
|
||||
tty_margin_off(tty);
|
||||
@ -1814,10 +1787,9 @@ tty_cmd_clearendofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearstartofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int px, py, nx, ny;
|
||||
u_int px, py, nx, ny;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, 0, ctx->sy - 1);
|
||||
tty_margin_off(tty);
|
||||
@ -1839,10 +1811,9 @@ tty_cmd_clearstartofscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int px, py, nx, ny;
|
||||
u_int px, py, nx, ny;
|
||||
|
||||
tty_default_attributes(tty, wp, ctx->bg);
|
||||
tty_default_attributes(tty, &ctx->defaults, ctx->palette, ctx->bg);
|
||||
|
||||
tty_region_pane(tty, ctx, 0, ctx->sy - 1);
|
||||
tty_margin_off(tty);
|
||||
@ -1858,15 +1829,14 @@ tty_cmd_clearscreen(struct tty *tty, const struct tty_ctx *ctx)
|
||||
void
|
||||
tty_cmd_alignmenttest(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
u_int i, j;
|
||||
u_int i, j;
|
||||
|
||||
if (ctx->bigger) {
|
||||
wp->flags |= PANE_REDRAW;
|
||||
ctx->redraw_cb(ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_attributes(tty, &grid_default_cell, wp);
|
||||
tty_attributes(tty, &grid_default_cell, &ctx->defaults, ctx->palette);
|
||||
|
||||
tty_region_pane(tty, ctx, 0, ctx->sy - 1);
|
||||
tty_margin_off(tty);
|
||||
@ -1892,14 +1862,12 @@ tty_cmd_cell(struct tty *tty, const struct tty_ctx *ctx)
|
||||
tty_margin_off(tty);
|
||||
tty_cursor_pane_unless_wrap(tty, ctx, ctx->ocx, ctx->ocy);
|
||||
|
||||
tty_cell(tty, ctx->cell, ctx->wp);
|
||||
tty_cell(tty, ctx->cell, &ctx->defaults, ctx->palette);
|
||||
}
|
||||
|
||||
void
|
||||
tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
struct window_pane *wp = ctx->wp;
|
||||
|
||||
if (!tty_is_visible(tty, ctx, ctx->ocx, ctx->ocy, ctx->num, 1))
|
||||
return;
|
||||
|
||||
@ -1915,14 +1883,14 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
|
||||
tty->cy == tty->rlower)
|
||||
tty_draw_pane(tty, ctx, ctx->ocy);
|
||||
else
|
||||
wp->flags |= PANE_REDRAW;
|
||||
ctx->redraw_cb(ctx);
|
||||
return;
|
||||
}
|
||||
|
||||
tty_margin_off(tty);
|
||||
tty_cursor_pane_unless_wrap(tty, ctx, ctx->ocx, ctx->ocy);
|
||||
|
||||
tty_attributes(tty, ctx->cell, ctx->wp);
|
||||
tty_attributes(tty, ctx->cell, &ctx->defaults, ctx->palette);
|
||||
tty_putn(tty, ctx->ptr, ctx->num, ctx->num);
|
||||
}
|
||||
|
||||
@ -1958,7 +1926,8 @@ tty_cmd_syncstart(struct tty *tty, __unused const struct tty_ctx *ctx)
|
||||
}
|
||||
|
||||
static void
|
||||
tty_cell(struct tty *tty, const struct grid_cell *gc, struct window_pane *wp)
|
||||
tty_cell(struct tty *tty, const struct grid_cell *gc,
|
||||
const struct grid_cell *defaults, int *palette)
|
||||
{
|
||||
const struct grid_cell *gcp;
|
||||
|
||||
@ -1973,7 +1942,7 @@ tty_cell(struct tty *tty, const struct grid_cell *gc, struct window_pane *wp)
|
||||
return;
|
||||
|
||||
/* Set the attributes. */
|
||||
tty_attributes(tty, gc, wp);
|
||||
tty_attributes(tty, gc, defaults, palette);
|
||||
|
||||
/* Get the cell and if ASCII write with putc to do ACS translation. */
|
||||
gcp = tty_check_codeset(tty, gc);
|
||||
@ -1999,21 +1968,16 @@ tty_reset(struct tty *tty)
|
||||
tty_putcode(tty, TTYC_SGR0);
|
||||
memcpy(gc, &grid_default_cell, sizeof *gc);
|
||||
}
|
||||
|
||||
memcpy(&tty->last_cell, &grid_default_cell, sizeof tty->last_cell);
|
||||
tty->last_wp = -1;
|
||||
}
|
||||
|
||||
static void
|
||||
tty_invalidate(struct tty *tty)
|
||||
{
|
||||
memcpy(&tty->cell, &grid_default_cell, sizeof tty->cell);
|
||||
|
||||
memcpy(&tty->last_cell, &grid_default_cell, sizeof tty->last_cell);
|
||||
tty->last_wp = -1;
|
||||
|
||||
tty->cx = tty->cy = UINT_MAX;
|
||||
|
||||
tty->rupper = tty->rleft = UINT_MAX;
|
||||
tty->rlower = tty->rright = UINT_MAX;
|
||||
|
||||
@ -2089,7 +2053,7 @@ static void
|
||||
tty_margin_pane(struct tty *tty, const struct tty_ctx *ctx)
|
||||
{
|
||||
tty_margin(tty, ctx->xoff - ctx->wox,
|
||||
ctx->xoff + ctx->wp->sx - 1 - ctx->wox);
|
||||
ctx->xoff + ctx->sx - 1 - ctx->wox);
|
||||
}
|
||||
|
||||
/* Set margin at absolute position. */
|
||||
@ -2282,27 +2246,24 @@ out:
|
||||
|
||||
void
|
||||
tty_attributes(struct tty *tty, const struct grid_cell *gc,
|
||||
struct window_pane *wp)
|
||||
const struct grid_cell *defaults, int *palette)
|
||||
{
|
||||
struct grid_cell *tc = &tty->cell, gc2;
|
||||
int changed;
|
||||
|
||||
/* Ignore cell if it is the same as the last one. */
|
||||
if (wp != NULL &&
|
||||
(int)wp->id == tty->last_wp &&
|
||||
~(wp->flags & PANE_STYLECHANGED) &&
|
||||
gc->attr == tty->last_cell.attr &&
|
||||
gc->fg == tty->last_cell.fg &&
|
||||
gc->bg == tty->last_cell.bg &&
|
||||
gc->us == tty->last_cell.us)
|
||||
return;
|
||||
tty->last_wp = (wp != NULL ? (int)wp->id : -1);
|
||||
memcpy(&tty->last_cell, gc, sizeof tty->last_cell);
|
||||
|
||||
/* Copy cell and update default colours. */
|
||||
memcpy(&gc2, gc, sizeof gc2);
|
||||
if (wp != NULL)
|
||||
tty_default_colours(&gc2, wp);
|
||||
if (gc2.fg == 8)
|
||||
gc2.fg = defaults->fg;
|
||||
if (gc2.bg == 8)
|
||||
gc2.bg = defaults->bg;
|
||||
|
||||
/* Ignore cell if it is the same as the last one. */
|
||||
if (gc2.attr == tty->last_cell.attr &&
|
||||
gc2.fg == tty->last_cell.fg &&
|
||||
gc2.bg == tty->last_cell.bg &&
|
||||
gc2.us == tty->last_cell.us)
|
||||
return;
|
||||
|
||||
/*
|
||||
* If no setab, try to use the reverse attribute as a best-effort for a
|
||||
@ -2320,9 +2281,9 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
|
||||
}
|
||||
|
||||
/* Fix up the colours if necessary. */
|
||||
tty_check_fg(tty, wp, &gc2);
|
||||
tty_check_bg(tty, wp, &gc2);
|
||||
tty_check_us(tty, wp, &gc2);
|
||||
tty_check_fg(tty, palette, &gc2);
|
||||
tty_check_bg(tty, palette, &gc2);
|
||||
tty_check_us(tty, palette, &gc2);
|
||||
|
||||
/*
|
||||
* If any bits are being cleared or the underline colour is now default,
|
||||
@ -2377,6 +2338,8 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
|
||||
tty_putcode(tty, TTYC_SMOL);
|
||||
if ((changed & GRID_ATTR_CHARSET) && tty_acs_needed(tty))
|
||||
tty_putcode(tty, TTYC_SMACS);
|
||||
|
||||
memcpy(&tty->last_cell, &gc2, sizeof tty->last_cell);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2441,7 +2404,7 @@ tty_colours(struct tty *tty, const struct grid_cell *gc)
|
||||
}
|
||||
|
||||
static void
|
||||
tty_check_fg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
tty_check_fg(struct tty *tty, int *palette, struct grid_cell *gc)
|
||||
{
|
||||
u_char r, g, b;
|
||||
u_int colours;
|
||||
@ -2456,7 +2419,7 @@ tty_check_fg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
c = gc->fg;
|
||||
if (c < 8 && gc->attr & GRID_ATTR_BRIGHT)
|
||||
c += 90;
|
||||
if ((c = window_pane_get_palette(wp, c)) != -1)
|
||||
if ((c = tty_get_palette(palette, c)) != -1)
|
||||
gc->fg = c;
|
||||
}
|
||||
|
||||
@ -2497,7 +2460,7 @@ tty_check_fg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
}
|
||||
|
||||
static void
|
||||
tty_check_bg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
tty_check_bg(struct tty *tty, int *palette, struct grid_cell *gc)
|
||||
{
|
||||
u_char r, g, b;
|
||||
u_int colours;
|
||||
@ -2505,7 +2468,7 @@ tty_check_bg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
|
||||
/* Perform substitution if this pane has a palette. */
|
||||
if (~gc->flags & GRID_FLAG_NOPALETTE) {
|
||||
if ((c = window_pane_get_palette(wp, gc->bg)) != -1)
|
||||
if ((c = tty_get_palette(palette, gc->bg)) != -1)
|
||||
gc->bg = c;
|
||||
}
|
||||
|
||||
@ -2548,14 +2511,13 @@ tty_check_bg(struct tty *tty, struct window_pane *wp, struct grid_cell *gc)
|
||||
}
|
||||
|
||||
static void
|
||||
tty_check_us(__unused struct tty *tty, struct window_pane *wp,
|
||||
struct grid_cell *gc)
|
||||
tty_check_us(__unused struct tty *tty, int *palette, struct grid_cell *gc)
|
||||
{
|
||||
int c;
|
||||
|
||||
/* Perform substitution if this pane has a palette. */
|
||||
if (~gc->flags & GRID_FLAG_NOPALETTE) {
|
||||
if ((c = window_pane_get_palette(wp, gc->us)) != -1)
|
||||
if ((c = tty_get_palette(palette, gc->us)) != -1)
|
||||
gc->us = c;
|
||||
}
|
||||
|
||||
@ -2686,11 +2648,12 @@ tty_window_default_style(struct grid_cell *gc, struct window_pane *wp)
|
||||
gc->bg = wp->bg;
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
|
||||
{
|
||||
struct options *oo = wp->options;
|
||||
int c;
|
||||
|
||||
memcpy(gc, &grid_default_cell, sizeof *gc);
|
||||
|
||||
if (wp->flags & PANE_STYLECHANGED) {
|
||||
wp->flags &= ~PANE_STYLECHANGED;
|
||||
@ -2707,12 +2670,6 @@ tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
|
||||
gc->fg = wp->cached_active_gc.fg;
|
||||
else
|
||||
gc->fg = wp->cached_gc.fg;
|
||||
|
||||
if (gc->fg != 8) {
|
||||
c = window_pane_get_palette(wp, gc->fg);
|
||||
if (c != -1)
|
||||
gc->fg = c;
|
||||
}
|
||||
}
|
||||
|
||||
if (gc->bg == 8) {
|
||||
@ -2720,21 +2677,16 @@ tty_default_colours(struct grid_cell *gc, struct window_pane *wp)
|
||||
gc->bg = wp->cached_active_gc.bg;
|
||||
else
|
||||
gc->bg = wp->cached_gc.bg;
|
||||
|
||||
if (gc->bg != 8) {
|
||||
c = window_pane_get_palette(wp, gc->bg);
|
||||
if (c != -1)
|
||||
gc->bg = c;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
tty_default_attributes(struct tty *tty, struct window_pane *wp, u_int bg)
|
||||
tty_default_attributes(struct tty *tty, const struct grid_cell *defaults,
|
||||
int *palette, u_int bg)
|
||||
{
|
||||
static struct grid_cell gc;
|
||||
struct grid_cell gc;
|
||||
|
||||
memcpy(&gc, &grid_default_cell, sizeof gc);
|
||||
gc.bg = bg;
|
||||
tty_attributes(tty, &gc, wp);
|
||||
tty_attributes(tty, &gc, defaults, palette);
|
||||
}
|
||||
|
Reference in New Issue
Block a user