diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 92845b21b9..ce3e54f94e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -989,7 +989,8 @@ gtk_widget_real_pick (GtkWidget *widget, { gdouble tx = x, ty = y; - if (!gtk_widget_is_sensitive (child) || + if (gtk_widget_get_pass_through (child) || + !gtk_widget_is_sensitive (child) || !gtk_widget_is_drawable (child)) continue; @@ -15683,3 +15684,16 @@ gtk_widget_get_cursor (GtkWidget *widget) { return widget->priv->cursor; } + +void +gtk_widget_set_pass_through (GtkWidget *widget, + gboolean pass_through) +{ + widget->priv->pass_through = !!pass_through; +} + +gboolean +gtk_widget_get_pass_through (GtkWidget *widget) +{ + return widget->priv->pass_through; +} diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index 422969a4d8..8763278104 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -70,6 +70,7 @@ struct _GtkWidgetPrivate guint child_visible : 1; guint multidevice : 1; guint has_shape_mask : 1; + guint pass_through : 1; /* Queue-resize related flags */ guint resize_needed : 1; /* queue_resize() has been called but no get_preferred_size() yet */ @@ -323,6 +324,9 @@ void gtk_widget_set_cursor (GtkWidget *widget, GdkCursor *cursor); GdkCursor * gtk_widget_get_cursor (GtkWidget *widget); +void gtk_widget_set_pass_through (GtkWidget *widget, + gboolean pass_through); +gboolean gtk_widget_get_pass_through (GtkWidget *widget); /* inline getters */