From d67dcadd6d1d8618a5bfcf15663357480632e7c5 Mon Sep 17 00:00:00 2001 From: axel10 Date: Sat, 11 Jul 2026 12:19:40 +0800 Subject: [PATCH] fix(linux): use gtk_window_set_geometry_hints to fix window size limits Using `gdk_window_set_geometry_hints` on the lower-level `GdkWindow` causes two major issues in GTK applications: 1. If window size limits (like `setMinimumSize` or `setMaximumSize`) are set before the window is realized (which is common during application startup), `get_gdk_window` returns `nullptr` and the sizing hints are silently ignored. 2. Even after realization, GTK's high-level layout cycle can bypass or override direct changes to the low-level `GdkWindow` hints. This commit replaces `gdk_window_set_geometry_hints` with the GTK-level `gtk_window_set_geometry_hints` on the `GtkWindow` directly. This allows GTK to cache the constraints internally, applying them correctly upon window realization and respecting them during GTK layout calculation. --- packages/window_manager/linux/window_manager_plugin.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/window_manager/linux/window_manager_plugin.cc b/packages/window_manager/linux/window_manager_plugin.cc index 7093ca49..35b7560c 100644 --- a/packages/window_manager/linux/window_manager_plugin.cc +++ b/packages/window_manager/linux/window_manager_plugin.cc @@ -213,7 +213,7 @@ static FlMethodResponse* set_aspect_ratio(WindowManagerPlugin* self, static_cast(self->window_hints & ~GDK_HINT_ASPECT); } - gdk_window_set_geometry_hints(get_gdk_window(self), &self->window_geometry, + gtk_window_set_geometry_hints(get_window(self), nullptr, &self->window_geometry, self->window_hints); g_autoptr(FlValue) result = fl_value_new_bool(true); return FL_METHOD_RESPONSE(fl_method_success_response_new(result)); @@ -309,7 +309,7 @@ static FlMethodResponse* set_minimum_size(WindowManagerPlugin* self, static_cast(self->window_hints & ~GDK_HINT_MIN_SIZE); } - gdk_window_set_geometry_hints(get_gdk_window(self), &self->window_geometry, + gtk_window_set_geometry_hints(get_window(self), nullptr, &self->window_geometry, self->window_hints); g_autoptr(FlValue) result = fl_value_new_bool(true); @@ -338,7 +338,7 @@ static FlMethodResponse* set_maximum_size(WindowManagerPlugin* self, if (self->window_geometry.max_height < 0) self->window_geometry.max_height = G_MAXINT; - gdk_window_set_geometry_hints(get_gdk_window(self), &self->window_geometry, + gtk_window_set_geometry_hints(get_window(self), nullptr, &self->window_geometry, self->window_hints); g_autoptr(FlValue) result = fl_value_new_bool(true);