git.lucas.co / cce-compositor
Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git

commite3805a3a6a04ac2a2ea22fa38afd00f8d76d94a5
parentbc187cb552
authorIsaac Freund <[email protected]>
date2026-03-31 09:59
Xwayland: update dimensions hint on change

 river/XwaylandWindow.zig | 40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/river/XwaylandWindow.zig b/river/XwaylandWindow.zig
index 33bca48..7d16d97 100644
--- a/river/XwaylandWindow.zig
+++ b/river/XwaylandWindow.zig
@@ -32,6 +32,7 @@ request_configure: wl.Listener(*wlr.XwaylandSurface.event.Configure) = .init(han
 set_override_redirect: wl.Listener(void) = .init(handleSetOverrideRedirect),
 associate: wl.Listener(void) = .init(handleAssociate),
 dissociate: wl.Listener(void) = .init(handleDissociate),
+set_size_hints: wl.Listener(void) = .init(handleSetSizeHints),
 set_title: wl.Listener(void) = .init(handleSetTitle),
 set_class: wl.Listener(void) = .init(handleSetClass),
 set_parent: wl.Listener(void) = .init(handleSetParent),
@@ -67,6 +68,7 @@ pub fn create(xsurface: *wlr.XwaylandSurface) error{OutOfMemory}!void {
     xsurface.events.dissociate.add(&xwindow.dissociate);
     xsurface.events.request_configure.add(&xwindow.request_configure);
     xsurface.events.set_override_redirect.add(&xwindow.set_override_redirect);
+    xsurface.events.set_size_hints.add(&xwindow.set_size_hints);
     xsurface.events.set_title.add(&xwindow.set_title);
     xsurface.events.set_class.add(&xwindow.set_class);
     xsurface.events.set_parent.add(&xwindow.set_parent);
@@ -152,6 +154,7 @@ fn handleDestroy(listener: *wl.Listener(void)) void {
     xwindow.dissociate.link.remove();
     xwindow.request_configure.link.remove();
     xwindow.set_override_redirect.link.remove();
+    xwindow.set_size_hints.link.remove();
     xwindow.set_title.link.remove();
     xwindow.set_class.link.remove();
     xwindow.set_parent.link.remove();
@@ -197,24 +200,6 @@ pub fn handleMap(listener: *wl.Listener(void)) void {
         return;
     };
 
-    // TODO(wlroots) update the dimensions_hint if the size hints change
-    // https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/5238
-    if (xwindow.xsurface.size_hints) |size_hints| {
-        const min_width: u31 = @max(0, size_hints.min_width);
-        const min_height: u31 = @max(0, size_hints.min_height);
-        // Don't trust X11 clients not to set a min_width greater than their max_width.
-        const max_width: u31 =
-            if (size_hints.max_width <= 0) 0 else @max(min_width, size_hints.max_width);
-        const max_height: u31 =
-            if (size_hints.max_height <= 0) 0 else @max(min_height, size_hints.max_height);
-        window.setDimensionsHint(.{
-            .min_width = min_width,
-            .max_width = max_width,
-            .min_height = min_height,
-            .max_height = max_height,
-        });
-    }
-
     if (xwindow.xsurface.fullscreen) {
         window.wm_scheduled.fullscreen_requested = .{ .fullscreen = null };
     }
@@ -283,6 +268,25 @@ fn handleSetOverrideRedirect(listener: *wl.Listener(void)) void {
     };
 }
 
+fn handleSetSizeHints(listener: *wl.Listener(void)) void {
+    const xwindow: *XwaylandWindow = @fieldParentPtr("set_size_hints", listener);
+    if (xwindow.xsurface.size_hints) |size_hints| {
+        const min_width: u31 = @max(0, size_hints.min_width);
+        const min_height: u31 = @max(0, size_hints.min_height);
+        // Don't trust X11 clients not to set a min_width greater than their max_width.
+        const max_width: u31 =
+            if (size_hints.max_width <= 0) 0 else @max(min_width, size_hints.max_width);
+        const max_height: u31 =
+            if (size_hints.max_height <= 0) 0 else @max(min_height, size_hints.max_height);
+        xwindow.window.setDimensionsHint(.{
+            .min_width = min_width,
+            .max_width = max_width,
+            .min_height = min_height,
+            .max_height = max_height,
+        });
+    }
+}
+
 fn handleSetTitle(listener: *wl.Listener(void)) void {
     const xwindow: *XwaylandWindow = @fieldParentPtr("set_title", listener);
     xwindow.window.notifyTitle();