render: disable transparency when we’re fullscreened

The wayland protocol recommends (or mandates?) that compositors render
a black background behind fullscreened transparent windows. I.e. you
never see what’s _actually_ behind the window.

So, if you have a white, but semi-transparent background in foot,
it’ll be rendered in a shade of gray.

Given this, it’s better to simply disable transparency while we’re
fullscreened. That way, we at least get the "correct" background
color.

Closes #1416
This commit is contained in:
Daniel Eklöf 2023-07-19 16:34:42 +02:00
parent 648f6016e3
commit 899b768b74
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 32 additions and 2 deletions

View file

@ -51,8 +51,11 @@
configuration) from the monitor we were most recently mapped on,
instead of the one least recently.
* Starlight theme (the default theme) updated to [V4][starlight-v4]
* Background transparency (alpha) is now disabled in fullscreened
windows ([#1416][1416]).
[starlight-v4]: https://github.com/CosmicToast/starlight/blob/v4/CHANGELOG.md#v4
[1416]: https://codeberg.org/dnkl/foot/issues/1416
### Deprecated

View file

@ -526,8 +526,35 @@ render_cell(struct terminal *term, pixman_image_t *pix,
uint32_t swap = _fg;
_fg = _bg;
_bg = swap;
} else if (cell->attrs.bg_src == COLOR_DEFAULT)
alpha = term->colors.alpha;
}
else if (cell->attrs.bg_src == COLOR_DEFAULT) {
if (term->window->is_fullscreen) {
/*
* Note: disable transparency when fullscreened.
*
* This is because the wayland protocol recommends
* (mandates even?) the compositor render a black
* background behind fullscreened transparent windows.
*
* In other words, transparency does not work when
* fullscreened, in the sense that you don't see
* what's behind the window.
*
* And if we keep our alpha channel, the background
* color will just look weird. For example, if the
* background color is white, and alpha is 0.5, then
* the window will be drawn in a shade of gray while
* fullscreened.
*
* By disabling the alpha channel, the window will at
* least be rendered in the intended background color.
*/
xassert(alpha == 0xffff);
} else {
alpha = term->colors.alpha;
}
}
}
if (unlikely(is_selected && _fg == _bg)) {