diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h index c2076f5167..d095450784 100644 --- a/gtk/gtkenums.h +++ b/gtk/gtkenums.h @@ -1060,8 +1060,11 @@ typedef enum * to the event widget. This option should only be used on containers that * might possibly handle events before their children do. * @GTK_PHASE_BUBBLE: Events are delivered in the bubble phase. The bubble - * phase happens after the capture phase, runs from the event widget, up to - * the toplevel. + * phase happens after the capture phase, and before the default handlers + * are run. This phase runs from the event widget, up to the toplevel. + * @GTK_PHASE_TARGET: Events are delivered in the default widget event handlers, + * note that widget implementations must chain up on button, motion, touch and + * grab broken handlers for controllers in this phase to be run. * * Describes the stage at which events are fed into a #GtkEventController. * @@ -1071,7 +1074,8 @@ typedef enum { GTK_PHASE_NONE, GTK_PHASE_CAPTURE, - GTK_PHASE_BUBBLE + GTK_PHASE_BUBBLE, + GTK_PHASE_TARGET } GtkPropagationPhase; /** diff --git a/gtk/gtkgesture.c b/gtk/gtkgesture.c index 9689f55a54..5cdba14d0e 100644 --- a/gtk/gtkgesture.c +++ b/gtk/gtkgesture.c @@ -1530,7 +1530,7 @@ gtk_gesture_attach (GtkGesture *gesture, GtkWidget *widget; g_return_if_fail (GTK_IS_GESTURE (gesture)); - g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_BUBBLE); + g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_TARGET); widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); _gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture), phase); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 1023cd1104..62e43bbd0e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -16700,8 +16700,7 @@ event_controller_grab_notify (GtkWidget *widget, if (!grab_widget || grab_widget == widget) return; - if (((data->phase == GTK_PHASE_NONE || - data->phase == GTK_PHASE_BUBBLE) && + if ((data->phase != GTK_PHASE_CAPTURE && !gtk_widget_is_ancestor (widget, grab_widget)) || (data->phase == GTK_PHASE_CAPTURE && !gtk_widget_is_ancestor (widget, grab_widget) && @@ -16802,7 +16801,7 @@ _gtk_widget_add_controller (GtkWidget *widget, g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller)); g_return_if_fail (widget == gtk_event_controller_get_widget (controller)); g_return_if_fail (!_gtk_widget_has_controller (widget, controller)); - g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_BUBBLE); + g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_TARGET); priv = widget->priv; data = _gtk_widget_has_controller (widget, controller);