diff --git a/CHANGELOG.md b/CHANGELOG.md index a890e244..0c2680d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -98,6 +98,9 @@ * `scrollback-*`+`pipe-scrollback` key bindings are now passed through to the client application when the alt screen is active (https://codeberg.org/dnkl/foot/issues/573). +* Reverse video (`\E[?5h`) now only swaps the default foreground and + background colors. Cells with explicit foreground and/or background + colors remain unchanged. ### Deprecated diff --git a/render.c b/render.c index d66058c8..22deaded 100644 --- a/render.c +++ b/render.c @@ -377,7 +377,7 @@ cursor_colors_for_cell(const struct terminal *term, const struct cell *cell, term->cursor_color.text >> 31 ? term->cursor_color.text : term->colors.bg); - if (term->reverse ^ cell->attrs.reverse ^ is_selected) { + if (cell->attrs.reverse ^ is_selected) { pixman_color_t swap = *cursor_color; *cursor_color = *text_color; *text_color = swap; @@ -461,10 +461,10 @@ render_cell(struct terminal *term, pixman_image_t *pix, _bg = term->colors.selection_bg; } else { /* Use cell specific color, if set, otherwise the default colors (possible reversed) */ - _fg = cell->attrs.have_fg ? cell->attrs.fg : term->colors.fg; - _bg = cell->attrs.have_bg ? cell->attrs.bg : term->colors.bg; + _fg = cell->attrs.have_fg ? cell->attrs.fg : term->reverse ? term->colors.bg : term->colors.fg; + _bg = cell->attrs.have_bg ? cell->attrs.bg : term->reverse ? term->colors.fg : term->colors.bg; - if (term->reverse ^ cell->attrs.reverse ^ is_selected) { + if (cell->attrs.reverse ^ is_selected) { uint32_t swap = _fg; _fg = _bg; _bg = swap;