Speed up gtk_widget_pick
authorMatthias Clasen <mclasen@redhat.com>
Mon, 13 Jan 2020 00:36:53 +0000 (19:36 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 15 Jan 2020 16:01:20 +0000 (11:01 -0500)
Add early exits, and avoid as much work as
possible.

gtk/gtkwidget.c

index aaf201b5476baf58e3aa18d1bdf0c3ee62edc7bc..9138c5a3795fd575572cdc09a422e5bf2bee875c 100644 (file)
@@ -10476,6 +10476,25 @@ gtk_widget_contains (GtkWidget  *widget,
   return GTK_WIDGET_GET_CLASS (widget)->contains (widget, x, y);
 }
 
+/* do the checks for gtk_widget_pick that do not depend on position */
+static gboolean
+gtk_widget_can_be_picked (GtkWidget    *widget,
+                          GtkPickFlags  flags)
+{
+  if (!_gtk_widget_is_drawable (widget))
+    return FALSE;
+
+  if (!(flags & GTK_PICK_NON_TARGETABLE) &&
+      !gtk_widget_get_can_target (widget))
+    return FALSE;
+
+  if (!(flags & GTK_PICK_INSENSITIVE) &&
+      !_gtk_widget_is_sensitive (widget))
+    return FALSE;
+
+  return TRUE;
+}
+
 /**
  * gtk_widget_pick:
  * @widget: the widget to query
@@ -10507,37 +10526,18 @@ gtk_widget_pick (GtkWidget    *widget,
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GtkWidget *child;
+  GtkCssBoxes boxes;
 
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-
-  if (!_gtk_widget_is_drawable (widget))
-    return NULL;
-
-  if (!(flags & GTK_PICK_NON_TARGETABLE) &&
-      !gtk_widget_get_can_target (widget))
-    return NULL;
-
-  if (!(flags & GTK_PICK_INSENSITIVE) &&
-      !_gtk_widget_is_sensitive (widget))
+  if (!gtk_widget_can_be_picked (widget, flags))
     return NULL;
 
-  switch (priv->overflow)
+  if (priv->overflow == GTK_OVERFLOW_HIDDEN)
     {
-    default:
-    case GTK_OVERFLOW_VISIBLE:
-      break;
-
-    case GTK_OVERFLOW_HIDDEN:
-      {
-        GtkCssBoxes boxes;
+      gtk_css_boxes_init (&boxes, widget);
 
-        gtk_css_boxes_init (&boxes, widget);
-
-        if (!gsk_rounded_rect_contains_point (gtk_css_boxes_get_padding_box (&boxes),
-                                              &GRAPHENE_POINT_INIT (x, y)))
-          return NULL;
-      }
-      break;
+      if (!gsk_rounded_rect_contains_point (gtk_css_boxes_get_padding_box (&boxes),
+                                            &GRAPHENE_POINT_INIT (x, y)))
+        return NULL;
     }
 
   if (GTK_IS_WINDOW (widget))
@@ -10559,6 +10559,9 @@ gtk_widget_pick (GtkWidget    *widget,
       GtkWidget *picked;
       graphene_point3d_t p0, p1, res;
 
+      if (!gtk_widget_can_be_picked (child, flags))
+        continue;
+
       if (GTK_IS_NATIVE (child))
         continue;