From 9f6eb1946cd4efc0ccd9c699bee886659854d1b3 Mon Sep 17 00:00:00 2001 From: yak Date: Mon, 29 Jun 2026 20:56:00 -0400 Subject: [PATCH] fix: set max window clamp to current monitor size --- src/apprt/gtk/class/window.zig | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index 2a1a5435a2b..827d0282849 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -1156,6 +1156,35 @@ pub const Window = extern struct { }; } + fn toplevelComputeSize( + _: *gdk.Toplevel, + size: *gdk.ToplevelSize, + self: *Self, + ) callconv(.c) void { + // The compositor/quick terminal own the size in these states. + if (self.isMaximized() or + self.isFullscreen() or + self.isQuickTerminal()) return; + + const gdk_surface = self.as(gtk.Native).getSurface() orelse return; + const w = gdk_surface.getWidth(); + const h = gdk_surface.getHeight(); + if (w <= 0 or h <= 0) return; + + // GTK clamps the requested size to the compositor-reported bounds, which + // go stale when the window moves to a larger monitor. Only re-assert the + // current size when it exceeds those bounds; otherwise let GTK's default + // sizing win so a freshly-mapped window isn't forced to a tiny size. + var bounds_w: c_int = 0; + var bounds_h: c_int = 0; + size.getBounds(&bounds_w, &bounds_h); + + if (bounds_w <= 0 or bounds_h <= 0) return; + if (w <= bounds_w and h <= bounds_h) return; + + size.setSize(w, h); + } + fn propFullscreened( _: *adw.ApplicationWindow, _: *gobject.ParamSpec, @@ -1330,6 +1359,16 @@ pub const Window = extern struct { self, .{ .detail = "height" }, ); + // Connect after GTK's compute-size handler so our size wins. + if (gobject.ext.cast(gdk.Toplevel, gdk_surface)) |toplevel| { + _ = gdk.Toplevel.signals.compute_size.connect( + toplevel, + *Self, + toplevelComputeSize, + self, + .{ .after = true }, + ); + } } // When we are realized we always setup our appearance since this