render: cursor color: remove assertion that both cursor fg/bg be set

Before this patch, we asserted both the cursor foreground, and
background colors had been set. This is true in most cases; the config
system enforces it.

It is however possible to set only the cursor background color, while
leaving the foreground (text) color unset:

* Use a foot config that does *not* configure the cursor colors. This
  means foot will invert the default fg/bg colors when rendering the
  cursor.
* Override the cursor color using an OSC-12 sequence. OSC-12 only sets
  the background color of the cursor, and there is no other OSC sequence
  to set the cursor's text color.

To handle this, remove the assertion, and simply split the logic for
the cursor backgound and foreground colors:

* Use the configured background color if set (either through config or
  OSC-12), otherwise use the default foreground color.
* Use the configured foreground color if set (through config),
  otherwise use the default background color.
This commit is contained in:
Daniel Eklöf 2024-07-01 10:53:21 +02:00
parent 94b9014f95
commit 7341ba5ee3
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 9 additions and 5 deletions

View file

@ -103,6 +103,9 @@
* VS15 being ignored ([#1742][1742]).
* VS16 being ignored for a subset of the valid VS16 sequences
([#1742][1742]).
* Crash in debug builds, when using OSC-12 to set the cursor color and
foot config has not set any custom cursor colors (i.e. without
OSC-12, inverted fg/bg would be used).
[1694]: https://codeberg.org/dnkl/foot/issues/1694
[1717]: https://codeberg.org/dnkl/foot/issues/1717

View file

@ -556,13 +556,14 @@ cursor_colors_for_cell(const struct terminal *term, const struct cell *cell,
const pixman_color_t *fg, const pixman_color_t *bg,
pixman_color_t *cursor_color, pixman_color_t *text_color)
{
if (term->cursor_color.cursor >> 31) {
xassert(term->cursor_color.text >> 31);
if (term->cursor_color.cursor >> 31)
*cursor_color = color_hex_to_pixman(term->cursor_color.cursor);
*text_color = color_hex_to_pixman(term->cursor_color.text);
} else {
else
*cursor_color = *fg;
if (term->cursor_color.text >> 31)
*text_color = color_hex_to_pixman(term->cursor_color.text);
else {
*text_color = *bg;
if (unlikely(text_color->alpha != 0xffff)) {