From 004c88e41ebf02e07b55a392f984e4545c3d60c7 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 | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index 2a1a5435a..c34f2cb4f 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -1156,6 +1156,38 @@ 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; + + // If there's no GdkSurface yet these dimensions will be zero size which + // will make the window start out as small as possible. These checks ensure + // we don't start with a 0, 0 window size. + 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 = undefined; + var bounds_h: c_int = undefined; + 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 +1362,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