srdusr
aboutsummaryrefslogtreecommitdiffstats
path: root/crates/core
diff options
context:
space:
mode:
authorsrdusr <[email protected]>2025-05-30 01:12:00 +0200
committersrdusr <[email protected]>2025-05-30 01:12:00 +0200
commit3f2ac4d85c4e66c2f1ae6622bf3c2f302abe93b9 (patch)
treeba933aa00823a47a34715a09d15ffbf30a25b923 /crates/core
parent49ded5541243408e50a391f95bdca037c370a709 (diff)
downloadsrdwm-3f2ac4d85c4e66c2f1ae6622bf3c2f302abe93b9.tar.gz
srdwm-3f2ac4d85c4e66c2f1ae6622bf3c2f302abe93b9.zip
Detect XWayland dialogs via WM_TRANSIENT_FOR, not just native xdg_toplevel parent
Window::is_dialog (close-button-only titlebar, no traffic lights) was only ever set from a native xdg_toplevel's own parent() - redraw_ decoration_buffer's is_dialog computation called dw.toplevel(), which is always None for an XWayland-backed DWindow (X11Surface's own accessor is x11_surface(), a different method), so the .unwrap_or(false) fallback made every XWayland dialog - a GTK "Save As", an app's own "About" box, anything setting the ICCCM transient-for hint - always draw with the full three-button titlebar and traffic-light colours, even though the feature this was built for explicitly wanted the opposite. Documented as a known gap at the time; now closed. redraw_decoration_buffer now also checks X11Surface::is_transient_for() for an XWayland window. property_notify gained a WmWindowProperty:: TransientFor arm that re-runs redraw_decoration_buffer, for a client that sets the hint slightly after its own initial map - the same "read fresh every call" pattern the existing xdg_toplevel::parent() check already relied on, extended to catch a late X11 property the way the Wayland equivalent (set_parent, any time) already was.
Diffstat (limited to 'crates/core')
-rw-r--r--crates/core/src/window.rs17
1 files changed, 8 insertions, 9 deletions
diff --git a/crates/core/src/window.rs b/crates/core/src/window.rs
index b30cf7b..6e40486 100644
--- a/crates/core/src/window.rs
+++ b/crates/core/src/window.rs
@@ -160,15 +160,14 @@ pub struct Window {
/// Geometry to restore to when un-maximizing.
pub restore_geometry: Option<Rect>,
pub decorated: bool,
- /// Whether this window declared an `xdg_toplevel` parent (`set_parent`)
- /// - a dialog/utility window belonging to another one, not a normal
- /// top-level app window. Backend-set (the wayland crate reads the real
- /// `ToplevelSurface::parent()`, refreshed on every decoration redraw),
- /// same as `decorated` itself; `core` has no protocol concept of its
- /// own to derive this from. Only ever `true` for a genuine `xdg_
- /// toplevel` client that set a parent - an XWayland dialog's own
- /// `WM_TRANSIENT_FOR` isn't read yet, so this misses those specifically
- /// (a real, known gap, not an oversight). Requested directly: a
+ /// Whether this window declared itself a dialog/utility window
+ /// belonging to another one, not a normal top-level app window --
+ /// a native `xdg_toplevel`'s own `parent()` (`set_parent`), or an
+ /// XWayland `X11Surface`'s ICCCM `WM_TRANSIENT_FOR` hint
+ /// (`is_transient_for()`). Backend-set (the wayland crate reads
+ /// whichever real accessor applies, refreshed on every decoration
+ /// redraw), same as `decorated` itself; `core` has no protocol
+ /// concept of its own to derive this from. Requested directly: a
/// dialog's titlebar should show only a close button, no traffic
/// lights - see `hit_test`'s and `decoration::render_titlebar`'s own
/// use of this for what actually changes.