[gtk+] GtkWindow: fix default empty window size with CSD
- From: Christoph Reiter <creiter src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkWindow: fix default empty window size with CSD
- Date: Tue, 23 Jun 2015 19:18:21 +0000 (UTC)
commit 84e99b20ac806ee5fafd8646b599252057079961
Author: Christoph Reiter <reiter christoph gmail com>
Date: Mon Jun 22 20:36:50 2015 +0200
GtkWindow: fix default empty window size with CSD
In the non-CSD case we checked for 0x0 window size requisition
and replaced it with 200x200 so the window was still visible.
This no longer works in case of CSD as the shadow and title bar
are always added to the requisition resulting in a titlebar/shadow
only window in case there is no child widget (this is currently
visible under wayland or when setting GTK_CSD=1).
Instead of special casing the final window size, special case
the child requisition paths instead. This gives us the same
requisition in both, CSD and non-CSD cases (the header bar
has a too large minimum width atm so the resulting window is
still not the same)
https://bugzilla.gnome.org/show_bug.cgi?id=751341
gtk/gtkwindow.c | 45 ++++++++++++++++++++++++++++++++-------------
1 files changed, 32 insertions(+), 13 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 06eee67..68f7220 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -126,6 +126,12 @@
*/
#define MNEMONICS_DELAY 300 /* ms */
+#define NO_CONTENT_CHILD_NAT 200
+/* In case the content (excluding header bar and shadows) of the window
+ * would be empty, either because there is no visible child widget or only an
+ * empty container widget, we use NO_CONTENT_CHILD_NAT as natural width/height
+ * instead.
+ */
typedef struct _GtkWindowPopover GtkWindowPopover;
@@ -7054,12 +7060,6 @@ gtk_window_realize (GtkWidget *widget)
gtk_window_get_remembered_size (window, &w, &h);
allocation.width = MAX (allocation.width, w);
allocation.height = MAX (allocation.height, h);
- if (allocation.width == 0 || allocation.height == 0)
- {
- /* non-empty window */
- allocation.width = 200;
- allocation.height = 200;
- }
gtk_widget_size_allocate (widget, &allocation);
_gtk_container_queue_resize (GTK_CONTAINER (widget));
@@ -8396,11 +8396,18 @@ gtk_window_get_preferred_width (GtkWidget *widget,
if (child && gtk_widget_get_visible (child))
{
gtk_widget_get_preferred_width (child, &child_min, &child_nat);
+
+ if (child_nat == 0)
+ child_nat = NO_CONTENT_CHILD_NAT;
child_min += border_width * 2 +
window_border.left + window_border.right;
child_nat += border_width * 2 +
window_border.left + window_border.right;
}
+ else
+ {
+ child_nat = NO_CONTENT_CHILD_NAT;
+ }
*minimum_size = MAX (title_min, child_min);
*natural_size = MAX (title_nat, child_nat);
@@ -8454,11 +8461,18 @@ gtk_window_get_preferred_width_for_height (GtkWidget *widget,
gtk_widget_get_preferred_width_for_height (child,
height,
&child_min, &child_nat);
+
+ if (child_nat == 0 && height == 0)
+ child_nat = NO_CONTENT_CHILD_NAT;
child_min += border_width * 2 +
window_border.left + window_border.right;
child_nat += border_width * 2 +
window_border.left + window_border.right;
}
+ else
+ {
+ child_nat = NO_CONTENT_CHILD_NAT;
+ }
*minimum_size = MAX (title_min, child_min);
*natural_size = MAX (title_nat, child_nat);
@@ -8510,9 +8524,15 @@ gtk_window_get_preferred_height (GtkWidget *widget,
gint child_min, child_nat;
gtk_widget_get_preferred_height (child, &child_min, &child_nat);
+ if (child_nat == 0)
+ child_nat = NO_CONTENT_CHILD_NAT;
*minimum_size += child_min + 2 * border_width;
*natural_size += child_nat + 2 * border_width;
}
+ else
+ {
+ *natural_size += NO_CONTENT_CHILD_NAT;
+ }
}
@@ -8569,9 +8589,15 @@ gtk_window_get_preferred_height_for_width (GtkWidget *widget,
gtk_widget_get_preferred_height_for_width (child, width,
&child_min, &child_nat);
+ if (child_nat == 0 && width == 0)
+ child_nat = NO_CONTENT_CHILD_NAT;
*minimum_size += child_min + 2 * border_width;
*natural_size += child_nat + 2 * border_width;
}
+ else
+ {
+ *natural_size += NO_CONTENT_CHILD_NAT;
+ }
}
/**
@@ -8755,13 +8781,6 @@ gtk_window_compute_configure_request_size (GtkWindow *window,
*width = MAX (*width, w);
*height = MAX (*height, h);
- /* If window is empty so requests 0, default to random nonzero size */
- if (*width == 0 && *height == 0)
- {
- *width = 200;
- *height = 200;
- }
-
/* Override with default size */
if (info)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]