From 658719a205bfcfbf07d453e426aceb43ce480540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 7 Aug 2020 10:11:10 +0200 Subject: [PATCH 1/3] gtk/window: Fix min size calculation It should always use "preferred" size, not any remembered or otherwise computed one, otherwise we won't be able to shrink to the preferred size. --- gtk/gtkwindow.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index e22f2e2bfd..b228b7630b 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4272,26 +4272,26 @@ toplevel_compute_size (GdkToplevel *toplevel, GtkWindowGeometryInfo *info; int width, height; GtkBorder shadow; + int bounds_width, bounds_height; + int default_width, default_height; int min_width, min_height; info = gtk_window_get_geometry_info (window, FALSE); + gdk_toplevel_size_get_bounds (size, &bounds_width, &bounds_height); + + gtk_window_compute_default_size (window, + bounds_width, bounds_height, + &default_width, &default_height); + if (priv->need_default_size) { int remembered_width; int remembered_height; - int bounds_width; - int bounds_height; - - gdk_toplevel_size_get_bounds (size, &bounds_width, &bounds_height); - - gtk_window_compute_default_size (window, - bounds_width, bounds_height, - &width, &height); gtk_window_get_remembered_size (window, &remembered_width, &remembered_height); - width = MAX (width, remembered_width); - height = MAX (height, remembered_height); + width = MAX (default_width, remembered_width); + height = MAX (default_height, remembered_height); /* Override with default size */ if (info) @@ -4306,9 +4306,9 @@ toplevel_compute_size (GdkToplevel *toplevel, INCLUDE_CSD_SIZE); if (info->default_width > 0) - width = default_width_csd; + width = min_width = default_width_csd; if (info->default_height > 0) - height = default_height_csd; + height = min_height = default_height_csd; } } else @@ -4348,8 +4348,8 @@ toplevel_compute_size (GdkToplevel *toplevel, get_shadow_width (window, &shadow); - min_width = width + shadow.left + shadow.right; - min_height = height + shadow.top + shadow.bottom; + min_width = default_width + shadow.left + shadow.right; + min_height = default_height + shadow.top + shadow.bottom; gdk_toplevel_size_set_min_size (size, min_width, min_height); } From a95012caa38057c7decdb6e4e94749e64a2528f8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 7 Aug 2020 12:45:19 -0400 Subject: [PATCH 2/3] Check sanity of toplevel sizes Emit a warning when sizes returned in GdkToplevelSize don't look sane. This is the case in the failing reftest. --- gdk/gdktoplevel.c | 1 + gdk/gdktoplevelsize.c | 16 ++++++++++++++++ gdk/gdktoplevelsizeprivate.h | 2 ++ 3 files changed, 19 insertions(+) diff --git a/gdk/gdktoplevel.c b/gdk/gdktoplevel.c index 3b8a22a611..a7802a3504 100644 --- a/gdk/gdktoplevel.c +++ b/gdk/gdktoplevel.c @@ -99,6 +99,7 @@ gdk_toplevel_notify_compute_size (GdkToplevel *toplevel, GdkToplevelSize *size) { g_signal_emit (toplevel, signals[COMPUTE_SIZE], 0, size); + gdk_toplevel_size_validate (size); } static void diff --git a/gdk/gdktoplevelsize.c b/gdk/gdktoplevelsize.c index 18933523ff..276e63f951 100644 --- a/gdk/gdktoplevelsize.c +++ b/gdk/gdktoplevelsize.c @@ -117,3 +117,19 @@ gdk_toplevel_size_set_min_size (GdkToplevelSize *size, size->min_width = min_width; size->min_height = min_height; } + +void +gdk_toplevel_size_validate (GdkToplevelSize *size) +{ + if (size->min_width > size->bounds_width || + size->min_height > size->bounds_height) + g_warning ("GdkToplevelSize: min_size exceeds bounds"); + + if (size->width > size->bounds_width || + size->height > size->bounds_height) + g_warning ("GdkToplevelSize: size exceeds bounds"); + + if (size->min_width > size->width || + size->min_height > size->height) + g_warning ("GdkToplevelSize: min_size exceeds size"); +} diff --git a/gdk/gdktoplevelsizeprivate.h b/gdk/gdktoplevelsizeprivate.h index eaddefba0b..3576513888 100644 --- a/gdk/gdktoplevelsizeprivate.h +++ b/gdk/gdktoplevelsizeprivate.h @@ -36,4 +36,6 @@ void gdk_toplevel_size_init (GdkToplevelSize *size, int bounds_width, int bounds_height); +void gdk_toplevel_size_validate (GdkToplevelSize *size); + #endif /* __GDK_TOPLEVEL_SIZE_PRIVATE_H__ */ From f6d9e15c16278a1aa373fb0c1526509af1c84ebb Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 7 Aug 2020 13:55:02 -0400 Subject: [PATCH 3/3] window: Don't set min_size > size This fixes the failing reftest. --- gtk/gtkwindow.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index b228b7630b..d84729442f 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4348,8 +4348,8 @@ toplevel_compute_size (GdkToplevel *toplevel, get_shadow_width (window, &shadow); - min_width = default_width + shadow.left + shadow.right; - min_height = default_height + shadow.top + shadow.bottom; + min_width = MIN (default_width + shadow.left + shadow.right, width); + min_height = MIN (default_height + shadow.top + shadow.bottom, height); gdk_toplevel_size_set_min_size (size, min_width, min_height); }