Skip to content

Fix GTK popup transparency proof during capture - #401

Merged
devmobasa merged 2 commits into
mainfrom
fix/gtk-popup-capture-proof-398
Sep 30, 2026
Merged

devmobasa merged 2 commits into
mainfrom
fix/gtk-popup-capture-proof-398

Conversation

@devmobasa

@devmobasa devmobasa commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Bind GTK capture suppression to the frame that snapshots fresh transparent proof
content on the native surface. A parent after-paint event on the shared clock
could previously select a counter the frozen popup never rendered, causing a
500 ms toolbar transparency timeout.

  • Record the proof serial and frame counter in an internal GdkPaintable; keep
    the existing mapping, withdrawal, stale-proof and compositor-feedback checks.
  • Give empty proof wrappers a one-pixel minimum. The mapped GtkPopoverMenu
    regression exposed a zero-area proof that GTK never snapshotted.
  • Exercise real plain and menu popovers through a private Weston/Wayland proxy
    that withholds one real callback and forwards file descriptors unchanged.
  • Require exactly one passing child test and native execution markers in both
    GTK gates; add shell/C# gate parity fixtures and document dependencies.
  • Apply the review's logical spacing, module wiring, typed reply parsing and
    unused-helper cleanup.

Related to #398. The reporter's separate display layout changed toast remains
unexplained; this PR should leave that issue open.

Validation

  • The updated popup regression fails on unpatched 65b6410d for the intended
    missing Canvas compositor feedback and passes with this repair.
  • The new mapped menu case fails without the minimum-size repair and passes
    afterward, including restoration of its original model and class-owned child.
  • Full ./tools/lint-and-test.sh passed: strict Clippy, all/no-default-feature
    workspace checks, 5,227/5,041 root unit tests and 79 C# tool cases.
  • Shell and C# GTK gates each passed 86 tests and all four required markers.
  • GitHub's required GTK job
    passed all 86 tests and the native execution markers on GTK 4.14.5.
  • Final branch binary in the isolated mixed-scale KWin lab: three keyboard and
    three button Freeze captures passed; observer pixels verified the frozen active
    output and continued repainting on the other output.
  • Formatting, whitespace and Python syntax checks passed.

Remaining coverage limits

  • Three additional invocations began with a real tooltip visible and succeeded,
    but GTK dismissed it before barrier target collection. A deterministic tooltip
    frame-acknowledgment regression remains a follow-up.
  • GTK's frame completion is still shared with the parent. This change identifies
    the popup's rendered frame; it does not add per-surface completion tracking.

Observe the serial and frame counter when GTK snapshots fresh alpha-zero proof content, instead of accepting a shared after-paint event. Preserve stale-proof rejection and the existing mapped-surface and compositor-feedback checks.

Keep empty menu proof wrappers at least one pixel so GTK snapshots them. Exercise real GtkPopover and GtkPopoverMenu surfaces through an isolated Wayland proxy, including menu restoration and an exact child execution check. Fold the unused counter helper into the drag paint callback.

The paintable has its own module; the wrapper stays in view/mod.rs because its observation and refresh state belong to that existing owner. The native regressions fail before their respective repairs and pass afterward. Full local validation and both GTK gates pass. Related to #398; the separate layout-change toast is unresolved.
Require execution markers for the native popup race and empty menu proof. Install explicit Python and Mesa dependencies in the widget CI profile, and document pkg-config and ordinary display-backed test behavior.

Add parity fixtures for shell and C# admission failures, private runtime cleanup, and process failure propagation. Both actual GTK gates pass 86 tests with four required markers; the full local gate passes, including all four parity cases.
@devmobasa
devmobasa merged commit 23bfdfd into main Sep 30, 2026
3 checks passed
@devmobasa
devmobasa deleted the fix/gtk-popup-capture-proof-398 branch October 2, 2026 20:02
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