[gtk+] popover: Improve minimal size allocation



commit 709fb26587ab1f32780c4c932857eb52250d42a8
Author: Carlos Garnacho <carlosg gnome org>
Date:   Tue Jan 28 16:02:47 2014 +0100

    popover: Improve minimal size allocation
    
    The minimal size if no child widget was present/shown was far too small
    to have enough room for the arrow width plus border radii, so
    gtk_render_frame_gap would spew warnings about the gap being out of
    boundaries.
    
    Fixes issues seen in
    https://bugzilla.gnome.org/show_bug.cgi?id=723031#c2

 gtk/gtkpopover.c |   84 ++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 63 insertions(+), 21 deletions(-)
---
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index f635e6b..b9dd811 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -793,6 +793,40 @@ get_padding_and_border (GtkWidget *widget,
   border->left += tmp.left + border_width;
 }
 
+static gint
+get_border_radius (GtkWidget *widget)
+{
+  GtkStyleContext *context;
+  GtkStateFlags state;
+  gint border_radius;
+
+  context = gtk_widget_get_style_context (widget);
+  state = gtk_widget_get_state_flags (widget);
+  gtk_style_context_get (context, state,
+                         GTK_STYLE_PROPERTY_BORDER_RADIUS, &border_radius,
+                         NULL);
+  return border_radius;
+}
+
+static gint
+get_minimal_size (GtkPopover     *popover,
+                  GtkOrientation  orientation)
+{
+  GtkPopoverPrivate *priv;
+  GtkPositionType pos;
+  gint minimal_size;
+
+  priv = gtk_popover_get_instance_private (popover);
+  minimal_size = 2 * get_border_radius (GTK_WIDGET (popover));
+  pos = get_effective_position (popover, priv->preferred_position);
+
+  if ((orientation == GTK_ORIENTATION_HORIZONTAL && POS_IS_VERTICAL (pos)) ||
+      (orientation == GTK_ORIENTATION_VERTICAL && !POS_IS_VERTICAL (pos)))
+    minimal_size += TAIL_GAP_WIDTH;
+
+  return minimal_size;
+}
+
 static void
 gtk_popover_get_preferred_width (GtkWidget *widget,
                                  gint      *minimum_width,
@@ -801,7 +835,7 @@ gtk_popover_get_preferred_width (GtkWidget *widget,
   GtkPopoverPrivate *priv;
   GtkWidget *child;
   GtkPositionType pos;
-  gint min, nat, extra;
+  gint min, nat, extra, minimal_size;
   GtkBorder border, margin;
 
   priv = GTK_POPOVER (widget)->priv;
@@ -813,9 +847,11 @@ gtk_popover_get_preferred_width (GtkWidget *widget,
 
   get_padding_and_border (widget, &border);
   get_margin (widget, &margin);
+  minimal_size = get_minimal_size (GTK_POPOVER (widget),
+                                   GTK_ORIENTATION_HORIZONTAL);
 
-  min += border.left + border.right;
-  nat += border.left + border.right;
+  min = MAX (min, minimal_size) + border.left + border.right;
+  nat = MAX (nat, minimal_size) + border.left + border.right;
 
   pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
 
@@ -830,10 +866,10 @@ gtk_popover_get_preferred_width (GtkWidget *widget,
   nat += extra;
 
   if (minimum_width)
-    *minimum_width = MAX (min, TAIL_GAP_WIDTH);
+    *minimum_width = min;
 
   if (natural_width)
-    *natural_width = MAX (nat, TAIL_GAP_WIDTH);
+    *natural_width = nat;
 }
 
 static void
@@ -845,7 +881,7 @@ gtk_popover_get_preferred_width_for_height (GtkWidget *widget,
   GtkPopoverPrivate *priv;
   GtkWidget *child;
   GtkPositionType pos;
-  gint min, nat, extra;
+  gint min, nat, extra, minimal_size;
   gint child_height;
   GtkBorder border, margin;
 
@@ -861,12 +897,14 @@ gtk_popover_get_preferred_width_for_height (GtkWidget *widget,
   get_padding_and_border (widget, &border);
   get_margin (widget, &margin);
   child_height -= border.top + border.bottom;
+  minimal_size = get_minimal_size (GTK_POPOVER (widget),
+                                   GTK_ORIENTATION_HORIZONTAL);
 
   if (child)
     gtk_widget_get_preferred_width_for_height (child, child_height, &min, &nat);
 
-  min += border.left + border.right;
-  nat += border.left + border.right;
+  min = MAX (min, minimal_size) + border.left + border.right;
+  nat = MAX (nat, minimal_size) + border.left + border.right;
 
   pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
 
@@ -881,10 +919,10 @@ gtk_popover_get_preferred_width_for_height (GtkWidget *widget,
   nat += extra;
 
   if (minimum_width)
-    *minimum_width = MAX (min, TAIL_GAP_WIDTH);
+    *minimum_width = min;
 
   if (natural_width)
-    *natural_width = MAX (nat, TAIL_GAP_WIDTH);
+    *natural_width = nat;
 }
 
 static void
@@ -895,7 +933,7 @@ gtk_popover_get_preferred_height (GtkWidget *widget,
   GtkPopoverPrivate *priv;
   GtkWidget *child;
   GtkPositionType pos;
-  gint min, nat, extra;
+  gint min, nat, extra, minimal_size;
   GtkBorder border, margin;
 
   priv = GTK_POPOVER (widget)->priv;
@@ -907,8 +945,11 @@ gtk_popover_get_preferred_height (GtkWidget *widget,
 
   get_padding_and_border (widget, &border);
   get_margin (widget, &margin);
-  min += border.top + border.bottom;
-  nat += border.top + border.bottom;
+  minimal_size = get_minimal_size (GTK_POPOVER (widget),
+                                   GTK_ORIENTATION_VERTICAL);
+
+  min = MAX (min, minimal_size) + border.top + border.bottom;
+  nat = MAX (nat, minimal_size) + border.top + border.bottom;
 
   pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
 
@@ -923,10 +964,10 @@ gtk_popover_get_preferred_height (GtkWidget *widget,
   nat += extra;
 
   if (minimum_height)
-    *minimum_height = MAX (min, TAIL_GAP_WIDTH);
+    *minimum_height = min;
 
   if (natural_height)
-    *natural_height = MAX (nat, TAIL_GAP_WIDTH);
+    *natural_height = nat;
 }
 
 static void
@@ -938,7 +979,7 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
   GtkPopoverPrivate *priv;
   GtkWidget *child;
   GtkPositionType pos;
-  gint min, nat, extra;
+  gint min, nat, extra, minimal_size;
   gint child_width;
   GtkBorder border, margin;
 
@@ -954,12 +995,13 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
   get_padding_and_border (widget, &border);
   get_margin (widget, &margin);
   child_width -= border.left + border.right;
-
+  minimal_size = get_minimal_size (GTK_POPOVER (widget),
+                                   GTK_ORIENTATION_VERTICAL);
   if (child)
     gtk_widget_get_preferred_height_for_width (child, child_width, &min, &nat);
 
-  min += border.top + border.bottom;
-  nat += border.top + border.bottom;
+  min = MAX (min, minimal_size) + border.top + border.bottom;
+  nat = MAX (nat, minimal_size) + border.top + border.bottom;
 
   pos = get_effective_position (GTK_POPOVER (widget), priv->preferred_position);
 
@@ -974,10 +1016,10 @@ gtk_popover_get_preferred_height_for_width (GtkWidget *widget,
   nat += extra;
 
   if (minimum_height)
-    *minimum_height = MAX (min, TAIL_GAP_WIDTH);
+    *minimum_height = min;
 
   if (natural_height)
-    *natural_height = MAX (nat, TAIL_GAP_WIDTH);
+    *natural_height = nat;
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]