mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-05 07:15:30 -04:00
Merge branch 'cell-colors-use-index'
This commit is contained in:
commit
366da7349c
4 changed files with 61 additions and 79 deletions
22
csi.c
22
csi.c
|
|
@ -32,8 +32,6 @@ static void
|
||||||
sgr_reset(struct terminal *term)
|
sgr_reset(struct terminal *term)
|
||||||
{
|
{
|
||||||
memset(&term->vt.attrs, 0, sizeof(term->vt.attrs));
|
memset(&term->vt.attrs, 0, sizeof(term->vt.attrs));
|
||||||
term->vt.attrs.fg = term->colors.fg;
|
|
||||||
term->vt.attrs.bg = term->colors.bg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
|
|
@ -116,7 +114,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 36:
|
case 36:
|
||||||
case 37:
|
case 37:
|
||||||
term->vt.attrs.fg_src = COLOR_BASE16;
|
term->vt.attrs.fg_src = COLOR_BASE16;
|
||||||
term->vt.attrs.fg = term->colors.table[param - 30];
|
term->vt.attrs.fg = param - 30;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 38: {
|
case 38: {
|
||||||
|
|
@ -124,9 +122,8 @@ csi_sgr(struct terminal *term)
|
||||||
if (term->vt.params.idx - i - 1 >= 2 &&
|
if (term->vt.params.idx - i - 1 >= 2 &&
|
||||||
term->vt.params.v[i + 1].value == 5)
|
term->vt.params.v[i + 1].value == 5)
|
||||||
{
|
{
|
||||||
uint8_t idx = term->vt.params.v[i + 2].value;
|
|
||||||
term->vt.attrs.fg_src = COLOR_BASE256;
|
term->vt.attrs.fg_src = COLOR_BASE256;
|
||||||
term->vt.attrs.fg = term->colors.table[idx];
|
term->vt.attrs.fg = term->vt.params.v[i + 2].value;
|
||||||
i += 2;
|
i += 2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -149,9 +146,8 @@ csi_sgr(struct terminal *term)
|
||||||
{
|
{
|
||||||
const struct vt_param *param = &term->vt.params.v[i];
|
const struct vt_param *param = &term->vt.params.v[i];
|
||||||
|
|
||||||
uint8_t idx = param->sub.value[1];
|
|
||||||
term->vt.attrs.fg_src = COLOR_BASE256;
|
term->vt.attrs.fg_src = COLOR_BASE256;
|
||||||
term->vt.attrs.fg = term->colors.table[idx];
|
term->vt.attrs.fg = param->sub.value[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -209,7 +205,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 46:
|
case 46:
|
||||||
case 47:
|
case 47:
|
||||||
term->vt.attrs.bg_src = COLOR_BASE16;
|
term->vt.attrs.bg_src = COLOR_BASE16;
|
||||||
term->vt.attrs.bg = term->colors.table[param - 40];
|
term->vt.attrs.bg = param - 40;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 48: {
|
case 48: {
|
||||||
|
|
@ -217,9 +213,8 @@ csi_sgr(struct terminal *term)
|
||||||
if (term->vt.params.idx - i - 1 >= 2 &&
|
if (term->vt.params.idx - i - 1 >= 2 &&
|
||||||
term->vt.params.v[i + 1].value == 5)
|
term->vt.params.v[i + 1].value == 5)
|
||||||
{
|
{
|
||||||
uint8_t idx = term->vt.params.v[i + 2].value;
|
|
||||||
term->vt.attrs.bg_src = COLOR_BASE256;
|
term->vt.attrs.bg_src = COLOR_BASE256;
|
||||||
term->vt.attrs.bg = term->colors.table[idx];
|
term->vt.attrs.bg = term->vt.params.v[i + 2].value;
|
||||||
i += 2;
|
i += 2;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -242,9 +237,8 @@ csi_sgr(struct terminal *term)
|
||||||
{
|
{
|
||||||
const struct vt_param *param = &term->vt.params.v[i];
|
const struct vt_param *param = &term->vt.params.v[i];
|
||||||
|
|
||||||
uint8_t idx = param->sub.value[1];
|
|
||||||
term->vt.attrs.bg_src = COLOR_BASE256;
|
term->vt.attrs.bg_src = COLOR_BASE256;
|
||||||
term->vt.attrs.bg = term->colors.table[idx];
|
term->vt.attrs.bg = param->sub.value[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -300,7 +294,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 96:
|
case 96:
|
||||||
case 97:
|
case 97:
|
||||||
term->vt.attrs.fg_src = COLOR_BASE16;
|
term->vt.attrs.fg_src = COLOR_BASE16;
|
||||||
term->vt.attrs.fg = term->colors.table[param - 90 + 8];
|
term->vt.attrs.fg = param - 90 + 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Bright background colors */
|
/* Bright background colors */
|
||||||
|
|
@ -313,7 +307,7 @@ csi_sgr(struct terminal *term)
|
||||||
case 106:
|
case 106:
|
||||||
case 107:
|
case 107:
|
||||||
term->vt.attrs.bg_src = COLOR_BASE16;
|
term->vt.attrs.bg_src = COLOR_BASE16;
|
||||||
term->vt.attrs.bg = term->colors.table[param - 100 + 8];
|
term->vt.attrs.bg = param - 100 + 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
64
osc.c
64
osc.c
|
|
@ -527,61 +527,6 @@ osc_notify(struct terminal *term, char *string)
|
||||||
notify_notify(term, title, msg != NULL ? msg : "");
|
notify_notify(term, title, msg != NULL ? msg : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
update_color_in_grids(struct terminal *term, int palette_idx, uint32_t new_color)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Update color of already rendered cells.
|
|
||||||
*
|
|
||||||
* Note that we do *not* store the original palette
|
|
||||||
* index. Therefore, the best we can do is compare colors - if
|
|
||||||
* they match, assume "our" palette index was the one used to
|
|
||||||
* render the cell.
|
|
||||||
*
|
|
||||||
* There are a couple of cases where this isn't necessarily true:
|
|
||||||
* - user has configured the 16 base colors with non-unique
|
|
||||||
* colors. - the client has used 24-bit escapes for colors
|
|
||||||
*
|
|
||||||
* In general though, if the client configures the palette, it is
|
|
||||||
* very likely only using index:ed coloring (i.e. not 24-bit
|
|
||||||
* direct colors), and I hope that it is unusual with palettes
|
|
||||||
* where all the colors aren't unique.
|
|
||||||
*
|
|
||||||
* TODO(?): for performance reasons, we only update the current
|
|
||||||
* screen rows (of both grids). I.e. scrollback is *not* updated.
|
|
||||||
*/
|
|
||||||
for (size_t i = 0; i < 2; i++) {
|
|
||||||
struct grid *grid = i == 0 ? &term->normal : &term->alt;
|
|
||||||
|
|
||||||
for (size_t r = 0; r < term->rows; r++) {
|
|
||||||
struct row *row = grid_row(grid, r);
|
|
||||||
xassert(row != NULL);
|
|
||||||
|
|
||||||
for (size_t c = 0; c < term->grid->num_cols; c++) {
|
|
||||||
struct cell *cell = &row->cells[c];
|
|
||||||
enum color_source fg_src = cell->attrs.fg_src;
|
|
||||||
enum color_source bg_src = cell->attrs.bg_src;
|
|
||||||
|
|
||||||
if ((fg_src == COLOR_BASE16 || fg_src == COLOR_BASE256) &&
|
|
||||||
cell->attrs.fg == term->colors.table[palette_idx])
|
|
||||||
{
|
|
||||||
cell->attrs.fg = new_color;
|
|
||||||
cell->attrs.clean = 0;
|
|
||||||
row->dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bg_src == COLOR_BASE16 || bg_src == COLOR_BASE256) &&
|
|
||||||
cell->attrs.bg == term->colors.table[palette_idx])
|
|
||||||
{
|
|
||||||
cell->attrs.bg = new_color;
|
|
||||||
cell->attrs.clean = 0;
|
|
||||||
row->dirty = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
osc_dispatch(struct terminal *term)
|
osc_dispatch(struct terminal *term)
|
||||||
{
|
{
|
||||||
|
|
@ -668,8 +613,8 @@ osc_dispatch(struct terminal *term)
|
||||||
LOG_DBG("change color definition for #%u from %06x to %06x",
|
LOG_DBG("change color definition for #%u from %06x to %06x",
|
||||||
idx, term->colors.table[idx], color);
|
idx, term->colors.table[idx], color);
|
||||||
|
|
||||||
update_color_in_grids(term, idx, color);
|
|
||||||
term->colors.table[idx] = color;
|
term->colors.table[idx] = color;
|
||||||
|
term_damage_view(term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -811,11 +756,9 @@ osc_dispatch(struct terminal *term)
|
||||||
|
|
||||||
if (strlen(string) == 0) {
|
if (strlen(string) == 0) {
|
||||||
LOG_DBG("resetting all colors");
|
LOG_DBG("resetting all colors");
|
||||||
for (size_t i = 0; i < ALEN(term->colors.table); i++) {
|
for (size_t i = 0; i < ALEN(term->colors.table); i++)
|
||||||
update_color_in_grids(term, i, term->conf->colors.table[i]);
|
|
||||||
term->colors.table[i] = term->conf->colors.table[i];
|
term->colors.table[i] = term->conf->colors.table[i];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
else {
|
else {
|
||||||
for (const char *s_idx = strtok(string, ";");
|
for (const char *s_idx = strtok(string, ";");
|
||||||
|
|
@ -835,11 +778,12 @@ osc_dispatch(struct terminal *term)
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_DBG("resetting color #%u", idx);
|
LOG_DBG("resetting color #%u", idx);
|
||||||
update_color_in_grids(term, idx, term->conf->colors.table[idx]);
|
|
||||||
term->colors.table[idx] = term->conf->colors.table[idx];
|
term->colors.table[idx] = term->conf->colors.table[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
term_damage_view(term);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
33
render.c
33
render.c
|
|
@ -494,8 +494,37 @@ render_cell(struct terminal *term, pixman_image_t *pix,
|
||||||
_bg = term->colors.selection_bg;
|
_bg = term->colors.selection_bg;
|
||||||
} else {
|
} else {
|
||||||
/* Use cell specific color, if set, otherwise the default colors (possible reversed) */
|
/* Use cell specific color, if set, otherwise the default colors (possible reversed) */
|
||||||
_fg = cell->attrs.fg_src != COLOR_DEFAULT ? cell->attrs.fg : term->reverse ? term->colors.bg : term->colors.fg;
|
switch (cell->attrs.fg_src) {
|
||||||
_bg = cell->attrs.bg_src != COLOR_DEFAULT ? cell->attrs.bg : term->reverse ? term->colors.fg : term->colors.bg;
|
case COLOR_RGB:
|
||||||
|
_fg = cell->attrs.fg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_BASE16:
|
||||||
|
case COLOR_BASE256:
|
||||||
|
xassert(cell->attrs.fg < ALEN(term->colors.table));
|
||||||
|
_fg = term->colors.table[cell->attrs.fg];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_DEFAULT:
|
||||||
|
_fg = term->reverse ? term->colors.bg : term->colors.fg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cell->attrs.bg_src) {
|
||||||
|
case COLOR_RGB:
|
||||||
|
_bg = cell->attrs.bg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_BASE16:
|
||||||
|
case COLOR_BASE256:
|
||||||
|
xassert(cell->attrs.bg < ALEN(term->colors.table));
|
||||||
|
_bg = term->colors.table[cell->attrs.bg];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_DEFAULT:
|
||||||
|
_bg = term->reverse ? term->colors.fg : term->colors.bg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (cell->attrs.reverse ^ is_selected) {
|
if (cell->attrs.reverse ^ is_selected) {
|
||||||
uint32_t swap = _fg;
|
uint32_t swap = _fg;
|
||||||
|
|
|
||||||
21
sixel.c
21
sixel.c
|
|
@ -68,11 +68,26 @@ sixel_init(struct terminal *term, int p1, int p2, int p3)
|
||||||
term->sixel.palette = term->sixel.shared_palette;
|
term->sixel.palette = term->sixel.shared_palette;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t bg = 0;
|
||||||
|
|
||||||
|
switch (term->vt.attrs.bg_src) {
|
||||||
|
case COLOR_RGB:
|
||||||
|
bg = term->vt.attrs.bg;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_BASE16:
|
||||||
|
case COLOR_BASE256:
|
||||||
|
bg = term->colors.table[term->vt.attrs.bg];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case COLOR_DEFAULT:
|
||||||
|
bg = term->colors.bg;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
term->sixel.default_bg = term->sixel.transparent_bg
|
term->sixel.default_bg = term->sixel.transparent_bg
|
||||||
? 0x00000000u
|
? 0x00000000u
|
||||||
: 0xffu << 24 | (term->vt.attrs.bg_src != COLOR_DEFAULT
|
: 0xffu << 24 | bg;
|
||||||
? term->vt.attrs.bg
|
|
||||||
: term->colors.bg);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 1 * 6; i++)
|
for (size_t i = 0; i < 1 * 6; i++)
|
||||||
term->sixel.image.data[i] = term->sixel.default_bg;
|
term->sixel.image.data[i] = term->sixel.default_bg;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue