Skip to content

fix(wayland): skip fully off-surface blur regions - #4173

Open
meleeislandbot wants to merge 1 commit into
noctalia-dev:mainfrom
meleeislandbot:fix/off-surface-blur-region
Open

fix(wayland): skip fully off-surface blur regions#4173
meleeislandbot wants to merge 1 commit into
noctalia-dev:mainfrom
meleeislandbot:fix/off-surface-blur-region

Conversation

@meleeislandbot

@meleeislandbot meleeislandbot commented Aug 31, 2026

Copy link
Copy Markdown

Summary

  • Treat a non-empty compositor blur region as empty when none of its rectangles intersects the surface.
  • Keep partially visible blur regions unchanged and let the compositor perform normal clipping.
  • Add a regression test for the fully outside and one-pixel-visible boundary cases.

Motivation

During auto-hide transitions, a bar blur region can move completely outside its layer surface for one frame. Hyprland can interpret that fully clipped region as unbounded and render blur across the whole surface, producing a visible flash.

Sending a null region in that case is equivalent to the empty result required after compositor clipping, while preserving normal blur as soon as any part of the region intersects the surface.

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Build / packaging

Related Issue

No Noctalia issue. User-authored report and sanitized baseline frames: hyprwm/Hyprland#16076

Testing

  • just format with clang-format 22.1.8
  • just build
  • meson test -C build-debug surface_blur_region --print-errorlogs
  • just test debug --print-errorlogs — 97/97 tests passed
  • just lint — 571 source files checked with warnings treated as errors
  • just build release
  • Manual Hyprland test: repeated top-bar auto-hide transitions at 3840×2160, 119.88 Hz, scale 1.25. The baseline flash reproduced consistently; the candidate retained normal bar blur without the off-surface flash.

Manual Coverage

  • Tested on Niri
  • Tested on Hyprland
  • Tested on Sway
  • Tested on another compositor:
  • Tested with different bar positions and density settings
  • Tested at different interface scaling values
  • Tested with multiple monitors

Screenshots / Videos

Sanitized 120 fps baseline frames are included in the linked Hyprland discussion. The fix removes a one-frame artifact, so the candidate was validated through repeated live transitions rather than a static after screenshot.

Checklist

  • This PR is ready for review, or it is marked as Draft.
  • I read and followed the relevant guidance in CONTRIBUTING.md.
  • I ran just format with clang-format v22+ installed, or this PR has no code changes.
  • I ran the relevant build or test commands, or explained why they were not run.
  • I self-reviewed the changes.
  • I checked for new warnings or errors.
  • I updated user-facing documentation in docs/user/ when this PR changes documented behavior or configuration, or this PR does not require documentation changes.
  • I added or updated assets/translations/en.json, or this PR adds no new user-facing strings.
  • I did not edit non-English translation files unless this PR is explicitly for translation tooling, an import/export sync, or a maintainer-requested locale change.
  • I used the existing canonical names for config keys, IPC names, paths, and identifiers.

Additional Notes

ext-background-effect-v1 requires the compositor to clip regions to the surface. This is a defensive client-side guard for compositors that misinterpret a non-empty region whose clipped result is empty. Partially visible regions and normal blur behavior are unchanged.

Treat a blur region with no surface intersection as empty before publishing it. This avoids full-surface flashes on compositors that misinterpret a fully clipped region while leaving partially visible regions unchanged.
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.

1 participant