Skip to content

Fix blur my shell compatibility and Xwayland as well - #165

Open
kem-a wants to merge 3 commits into
flexagoon:mainfrom
kem-a:main
Open

Fix blur my shell compatibility and Xwayland as well#165
kem-a wants to merge 3 commits into
flexagoon:mainfrom
kem-a:main

Conversation

@kem-a

@kem-a kem-a commented Jul 30, 2026

Copy link
Copy Markdown

Rounded corners break Blur my Shell's window blur: blurred windows lose the blur and are left plainly transparent.

The effect is a Shell.GLSLEffect, i.e. an offscreen effect, and was attached to the whole window actor on Wayland and to WindowActor.first_child on X11. Blur my Shell inserts its blur actor at index 0 of the window actor, and that actor samples what has already been painted behind it. On Wayland it ended up inside the (empty) offscreen framebuffer with nothing to sample; on X11 it was the first child, so the corner shader was applied to the blur widget instead of the window contents.

This attaches the effect to the surface actor instead. MetaSurfaceActor isn't introspectable, so it's matched by skipping injected actors, which are always StWidgets.

Tested on GNOME Shell 50.3 (Wayland) with Blur my Shell (v72), on both native Wayland and XWayland windows, plus maximize/unmaximize, overview, and disable/enable.
Shell patch to fix corners also was applied

*AI coauthored

kem-a and others added 3 commits July 30, 2026 22:50
The rounded corners effect is a Shell.GLSLEffect, which is an offscreen
effect: everything inside the actor it is attached to gets redirected
into a fresh offscreen framebuffer. It used to be attached to the whole
window actor on Wayland, and to WindowActor.first_child on X11.

Both are wrong when another extension puts an actor inside the window
actor. Blur my Shell inserts a blur actor at index 0 of the window
actor, and that actor samples whatever has already been painted behind
it. On Wayland it ended up inside our empty offscreen framebuffer with
nothing to sample, so the blur disappeared and the window was left
plainly transparent. On X11 it was even worse: since the blur actor is
the first child, the corner shader was applied to the blur widget
instead of the window contents.

Attach the effect to the surface actor instead, which holds the actual
window contents and no foreign actors. MetaSurfaceActor is not exposed
to introspection, so it is found by skipping StWidgets: actors injected
by other extensions are always StWidgets, while the surface actor never
is.

The readiness check in applyEffectTo now waits for that same actor.
It listens for `child-added` rather than `notify::first-child`, because
when another extension has already inserted an actor below the window
contents, adding the surface actor doesn't change the first child.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fix blur my shell compatibility and Xwayland as well
@flexagoon

Copy link
Copy Markdown
Owner

Thanks! Seems like this is similar to #77, but that PR has an issue with fractional scaling. Did you test your changes with it?

@kem-a

kem-a commented Aug 1, 2026

Copy link
Copy Markdown
Author

@flexagoon, yes, I did test it with fractional scaling, not all possible combinations, but some. My laptop has 4k screen, wayland and thus 1.5x scaling, not even standard 1.6x.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants