mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-04-01 07:15:32 -04:00
Merge branch 'opaque-flash'
This commit is contained in:
commit
20466e7fa4
6 changed files with 13 additions and 28 deletions
|
|
@ -80,9 +80,6 @@
|
||||||
|
|
||||||
* Runtime changes to the app-id (OSC-176) now limits the app-id string
|
* Runtime changes to the app-id (OSC-176) now limits the app-id string
|
||||||
to 2048 characters ([#1897][1897]).
|
to 2048 characters ([#1897][1897]).
|
||||||
* `colors.flash-alpha` can no longer be set to 1.0 (i.e. fully
|
|
||||||
opaque). This fixes an issue where the window would be stuck in the
|
|
||||||
flash state.
|
|
||||||
|
|
||||||
[1897]: https://codeberg.org/dnkl/foot/issues/1897
|
[1897]: https://codeberg.org/dnkl/foot/issues/1897
|
||||||
|
|
||||||
|
|
|
||||||
4
config.c
4
config.c
|
|
@ -1445,8 +1445,8 @@ parse_section_colors(struct context *ctx)
|
||||||
if (!value_to_float(ctx, &alpha))
|
if (!value_to_float(ctx, &alpha))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (alpha < 0. || alpha >= 1.) {
|
if (alpha < 0. || alpha > 1.) {
|
||||||
LOG_CONTEXTUAL_ERR("not in range 0.0-0.999");
|
LOG_CONTEXTUAL_ERR("not in range 0.0-1.0");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,8 @@ void render_refresh_title(struct terminal *term) {}
|
||||||
void render_refresh_app_id(struct terminal *term) {}
|
void render_refresh_app_id(struct terminal *term) {}
|
||||||
void render_refresh_icon(struct terminal *term) {}
|
void render_refresh_icon(struct terminal *term) {}
|
||||||
|
|
||||||
|
void render_overlay(struct terminal *term) {}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
render_xcursor_is_valid(const struct seat *seat, const char *cursor)
|
render_xcursor_is_valid(const struct seat *seat, const char *cursor)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
23
render.c
23
render.c
|
|
@ -1862,7 +1862,7 @@ render_overlay_single_pixel(struct terminal *term, enum overlay_style style,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
render_overlay(struct terminal *term)
|
render_overlay(struct terminal *term)
|
||||||
{
|
{
|
||||||
struct wayl_sub_surface *overlay = &term->window->overlay;
|
struct wayl_sub_surface *overlay = &term->window->overlay;
|
||||||
|
|
@ -1898,27 +1898,6 @@ render_overlay(struct terminal *term)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OVERLAY_FLASH:
|
case OVERLAY_FLASH:
|
||||||
/*
|
|
||||||
* A compositor will not send a frame callback for our main
|
|
||||||
* window if it is fully occluded (for example, by a fully
|
|
||||||
* opaque overlay...). This causes the overlay to stuck.
|
|
||||||
*
|
|
||||||
* For regular buffers, it _should_ be enough to *not* hint
|
|
||||||
* the compositor it's opaque. But at least some compositor
|
|
||||||
* special cases single-pixel buffers, and actually look at
|
|
||||||
* their pixel value.
|
|
||||||
*
|
|
||||||
* Thus, we have two options: implement frame callback
|
|
||||||
* handling for the overlay sub-surface, or ensure we don't
|
|
||||||
* use a fully opaque surface. Since no overlays are fully
|
|
||||||
* opaque by default, and the flash surface is the only one
|
|
||||||
* that can be configured to be opaque (colors.flash-alpha),
|
|
||||||
* and since adding frame callback handling adds a lot of
|
|
||||||
* boilerplate code... let's go with the simpler solution of
|
|
||||||
* not allowing colors.flash-alpha to be 1.0.
|
|
||||||
*/
|
|
||||||
xassert(term->conf->colors.flash_alpha != 0xffff);
|
|
||||||
|
|
||||||
color = color_hex_to_pixman_with_alpha(
|
color = color_hex_to_pixman_with_alpha(
|
||||||
term->conf->colors.flash,
|
term->conf->colors.flash,
|
||||||
term->conf->colors.flash_alpha);
|
term->conf->colors.flash_alpha);
|
||||||
|
|
|
||||||
2
render.h
2
render.h
|
|
@ -31,6 +31,8 @@ bool render_xcursor_set(
|
||||||
struct seat *seat, struct terminal *term, enum cursor_shape shape);
|
struct seat *seat, struct terminal *term, enum cursor_shape shape);
|
||||||
bool render_xcursor_is_valid(const struct seat *seat, const char *cursor);
|
bool render_xcursor_is_valid(const struct seat *seat, const char *cursor);
|
||||||
|
|
||||||
|
void render_overlay(struct terminal *term);
|
||||||
|
|
||||||
struct render_worker_context {
|
struct render_worker_context {
|
||||||
int my_id;
|
int my_id;
|
||||||
struct terminal *term;
|
struct terminal *term;
|
||||||
|
|
|
||||||
|
|
@ -419,7 +419,12 @@ fdm_flash(struct fdm *fdm, int fd, int events, void *data)
|
||||||
(unsigned long long)expiration_count);
|
(unsigned long long)expiration_count);
|
||||||
|
|
||||||
term->flash.active = false;
|
term->flash.active = false;
|
||||||
render_refresh(term);
|
render_overlay(term);
|
||||||
|
|
||||||
|
// since the overlay surface is synced with the main window surface, we have
|
||||||
|
// to commit the main surface for the compositor to acknowledge the new
|
||||||
|
// overlay state.
|
||||||
|
wl_surface_commit(term->window->surface.surf);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue