diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 55c4d60fda..d074b529fa 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -648,10 +648,6 @@ static AtkObject* gtk_widget_ref_accessible (AtkImplementor *implementor); static gboolean gtk_widget_real_can_activate_accel (GtkWidget *widget, guint signal_id); -static void gtk_widget_get_origin_relative_to_parent(GtkWidget *widget, - int *origin_x, - int *origin_y); - static void gtk_widget_real_set_has_tooltip (GtkWidget *widget, gboolean has_tooltip, gboolean force); @@ -4830,7 +4826,7 @@ gtk_widget_common_ancestor (GtkWidget *widget_a, return widget_a; } -static void +void gtk_widget_get_origin_relative_to_parent (GtkWidget *widget, int *origin_x, int *origin_y) diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index da80377f04..75e84fe225 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -332,6 +332,12 @@ gboolean gtk_widget_emit_event_signals (GtkWidget *widg void gtk_widget_init_legacy_controller (GtkWidget *widget); +void gtk_widget_get_origin_relative_to_parent (GtkWidget *widget, + int *origin_x, + int *origin_y); + + + /* inline getters */ diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c index 517e716c0f..987eb4f4a7 100644 --- a/gtk/inspector/inspect-button.c +++ b/gtk/inspector/inspect-button.c @@ -30,6 +30,51 @@ #include "gtkstack.h" #include "gtkmain.h" #include "gtkinvisible.h" +#include "gtkwidgetprivate.h" + + +static gboolean +inspector_contains (GtkWidget *widget, + double x, + double y) +{ + g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); + + if (!gtk_widget_is_drawable (widget)) + return FALSE; + + return GTK_WIDGET_GET_CLASS (widget)->contains (widget, x, y); +} + +static GtkWidget * +inspector_pick (GtkWidget *widget, + double x, + double y) +{ + /* Like gtk_widget_pick and gtk_widget_contains, + * but we need to consider insensitive widgets as well. */ + GtkWidget *child; + + for (child = _gtk_widget_get_last_child (widget); + child; + child = _gtk_widget_get_prev_sibling (child)) + { + GtkWidget *picked; + int dx, dy; + + gtk_widget_get_origin_relative_to_parent (child, &dx, &dy); + + picked = inspector_pick (child, x - dx, y - dy); + if (picked) + return picked; + } + + + if (!inspector_contains (widget, x, y)) + return NULL; + + return widget; +} static GtkWidget * find_widget_at_pointer (GdkDevice *device) @@ -73,7 +118,7 @@ find_widget_at_pointer (GdkDevice *device) gdk_window_get_device_position_double (gtk_widget_get_window (widget), device, &x, &y, NULL); - widget = gtk_widget_pick (widget, x, y); + widget = inspector_pick (widget, x, y); } return widget;