From 39560a6ff1b398ec814c8e08fd694ea9ed4abad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 7 Jun 2021 21:46:46 +0200 Subject: [PATCH] render: reverse video only swaps *default* fg/bg This matches XTerm behavior, and fixes vttest 11.6.6.2: Test non-VT100 -> Test ISO-6429 colors -> Test of VT102-style features with BCE -> Test of screen features --- CHANGELOG.md | 3 +++ render.c | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) 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;