popover: Stop making assumptions about corners
authorMatthias Clasen <mclasen@redhat.com>
Sat, 13 May 2023 11:35:05 +0000 (07:35 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 13 May 2023 11:36:35 +0000 (07:36 -0400)
The popover tail drawing code was just assuming that
the corner values are numbers. Which they won't, anymore.

gtk/gtkpopover.c

index b9fa4d2b721bfa409c2c2132392fbbfdbcd2f6cf..bd3bc0c004aaed51cfc33480119a8e80216de91a 100644 (file)
 #include "gtkroundedboxprivate.h"
 #include "gsk/gskroundedrectprivate.h"
 #include "gtkcssshadowvalueprivate.h"
+#include "gtkcsscornervalueprivate.h"
 
 #include "gdk/gdksurfaceprivate.h"
 
@@ -1196,6 +1197,16 @@ gtk_popover_finalize (GObject *object)
   G_OBJECT_CLASS (gtk_popover_parent_class)->finalize (object);
 }
 
+static double
+get_border_radius (GtkWidget *widget)
+{
+  GtkCssStyle *style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
+
+  /* FIXME this is a very crude interpretation of border radius */
+  return MAX (_gtk_css_corner_value_get_x (style->border->border_top_left_radius, 100),
+              _gtk_css_corner_value_get_y (style->border->border_top_left_radius, 100));
+}
+
 static void
 gtk_popover_get_gap_coords (GtkPopover *popover,
                             int        *initial_x_out,
@@ -1230,7 +1241,7 @@ gtk_popover_get_gap_coords (GtkPopover *popover,
   pos = priv->final_position;
 
   style = gtk_css_node_get_style (gtk_widget_get_css_node (priv->contents_widget));
-  border_radius = _gtk_css_number_value_get (style->border->border_top_left_radius, 100);
+  border_radius = round (get_border_radius (widget));
   border_top = _gtk_css_number_value_get (style->border->border_top_width, 100);
   border_right = _gtk_css_number_value_get (style->border->border_right_width, 100);
   border_bottom = _gtk_css_number_value_get (style->border->border_bottom_width, 100);
@@ -1429,15 +1440,6 @@ gtk_popover_update_shape (GtkPopover *popover)
     gtk_native_update_opaque_region (GTK_NATIVE (popover), priv->contents_widget, TRUE, TRUE, 0);
 }
 
-static int
-get_border_radius (GtkWidget *widget)
-{
-  GtkCssStyle *style;
-
-  style = gtk_css_node_get_style (gtk_widget_get_css_node (widget));
-  return round (_gtk_css_number_value_get (style->border->border_top_left_radius, 100));
-}
-
 static int
 get_minimal_size (GtkPopover     *popover,
                   GtkOrientation  orientation)
@@ -1448,7 +1450,7 @@ get_minimal_size (GtkPopover     *popover,
   int tail_gap_width = priv->has_arrow ? TAIL_GAP_WIDTH : 0;
   int min_width, min_height;
 
-  minimal_size = 2 * get_border_radius (GTK_WIDGET (priv->contents_widget));
+  minimal_size = 2 * round (get_border_radius (GTK_WIDGET (priv->contents_widget)));
   pos = priv->position;
 
   if ((orientation == GTK_ORIENTATION_HORIZONTAL && POS_IS_VERTICAL (pos)) ||