diff --git a/src/tsm/libtsm.h b/src/tsm/libtsm.h index 6349d8f..2c369b0 100644 --- a/src/tsm/libtsm.h +++ b/src/tsm/libtsm.h @@ -170,6 +170,7 @@ struct tsm_screen_attr { unsigned int inverse : 1; /* inverse colors */ unsigned int protect : 1; /* cannot be erased */ unsigned int blink : 1; /* blinking character */ + unsigned int dim:1; /* dim color */ }; /* Attributes that alter the glyph shape */ diff --git a/src/tsm/tsm-render.c b/src/tsm/tsm-render.c index de9ce68..0340af3 100644 --- a/src/tsm/tsm-render.c +++ b/src/tsm/tsm-render.c @@ -193,6 +193,13 @@ tsm_age_t tsm_screen_draw(struct tsm_screen *con, tsm_screen_draw_cb draw_cb, } } +static void color_dim(struct tsm_screen_color *out, const struct tsm_screen_color *fg, const struct tsm_screen_color *bg) +{ + out->r = bg->r / 2 + fg->r / 2; + out->g = bg->g / 2 + fg->g / 2; + out->b = bg->b / 2 + fg->b / 2; +} + /* * tsm_screen_draw2 returns a pointer to a table of tsm_screen_cell, one for each cell on the screen. * It uses a bit more memory, but should be much faster, as each cell is only 12 bytes. @@ -287,6 +294,9 @@ const struct tsm_screen_cell *tsm_screen_draw2(struct tsm_screen *con) out->bg.g = cell->attr.bg; out->bg.b = cell->attr.bb; } + if (cell->attr.dim) + color_dim(&out->fg, &out->fg, &out->bg); + if (sel_end && j == con->sel_end.x) in_sel = !in_sel; } diff --git a/src/tsm/tsm-vte.c b/src/tsm/tsm-vte.c index 894ca09..764efb6 100644 --- a/src/tsm/tsm-vte.c +++ b/src/tsm/tsm-vte.c @@ -791,6 +791,7 @@ static void reset_state(struct tsm_vte *vte) vte->saved_state.cattr.inverse = 0; vte->saved_state.cattr.protect = 0; vte->saved_state.cattr.blink = 0; + vte->saved_state.cattr.dim = 0; } static void save_state(struct tsm_vte *vte) @@ -1332,10 +1333,14 @@ static void csi_attribute(struct tsm_vte *vte) vte->cattr.underline = 0; vte->cattr.inverse = 0; vte->cattr.blink = 0; + vte->cattr.dim = 0; break; case 1: vte->cattr.bold = 1; break; + case 2: + vte->cattr.dim = 1; + break; case 3: vte->cattr.italic = 1; break; @@ -1350,6 +1355,7 @@ static void csi_attribute(struct tsm_vte *vte) break; case 22: vte->cattr.bold = 0; + vte->cattr.dim = 0; break; case 23: vte->cattr.italic = 0;