Speed up gtk_widget_pick

Add early exits, and avoid as much work as
possible.
This commit is contained in:
Matthias Clasen 2020-01-12 19:36:53 -05:00
parent 82dc7b903c
commit e8eb1df29f

View File

@ -10476,6 +10476,25 @@ gtk_widget_contains (GtkWidget *widget,
return GTK_WIDGET_GET_CLASS (widget)->contains (widget, x, y); 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: * gtk_widget_pick:
* @widget: the widget to query * @widget: the widget to query
@ -10507,37 +10526,18 @@ gtk_widget_pick (GtkWidget *widget,
{ {
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkWidget *child; GtkWidget *child;
GtkCssBoxes boxes;
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); if (!gtk_widget_can_be_picked (widget, flags))
if (!_gtk_widget_is_drawable (widget))
return NULL; return NULL;
if (!(flags & GTK_PICK_NON_TARGETABLE) && if (priv->overflow == GTK_OVERFLOW_HIDDEN)
!gtk_widget_get_can_target (widget))
return NULL;
if (!(flags & GTK_PICK_INSENSITIVE) &&
!_gtk_widget_is_sensitive (widget))
return NULL;
switch (priv->overflow)
{ {
default: gtk_css_boxes_init (&boxes, widget);
case GTK_OVERFLOW_VISIBLE:
break;
case GTK_OVERFLOW_HIDDEN: if (!gsk_rounded_rect_contains_point (gtk_css_boxes_get_padding_box (&boxes),
{ &GRAPHENE_POINT_INIT (x, y)))
GtkCssBoxes boxes; return NULL;
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 (GTK_IS_WINDOW (widget)) if (GTK_IS_WINDOW (widget))
@ -10559,6 +10559,9 @@ gtk_widget_pick (GtkWidget *widget,
GtkWidget *picked; GtkWidget *picked;
graphene_point3d_t p0, p1, res; graphene_point3d_t p0, p1, res;
if (!gtk_widget_can_be_picked (child, flags))
continue;
if (GTK_IS_NATIVE (child)) if (GTK_IS_NATIVE (child))
continue; continue;