diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 2cedb2508f..61ae38f0b5 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -11415,6 +11415,23 @@ gtk_widget_add_controller (GtkWidget *widget, gtk_list_list_model_item_added_at (priv->controller_observer, priv->controllers->len - 1); } +void +gtk_widget_prepend_controller (GtkWidget *widget, + GtkEventController *controller) +{ + GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + + GTK_EVENT_CONTROLLER_GET_CLASS (controller)->set_widget (controller, widget); + + if (G_UNLIKELY (!priv->controllers)) + priv->controllers = g_ptr_array_new (); + + g_ptr_array_insert (priv->controllers, 0, controller); + + if (priv->controller_observer) + gtk_list_list_model_item_added_at (priv->controller_observer, 0); +} + /** * gtk_widget_remove_controller: * @widget: a #GtkWidget diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index e7688a65cd..d281dd0f43 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -346,6 +346,9 @@ gboolean gtk_widget_run_controllers (GtkWidget double x, double y, GtkPropagationPhase phase); + +void gtk_widget_prepend_controller (GtkWidget *widget, + GtkEventController *controller); void gtk_widget_handle_crossing (GtkWidget *widget, const GtkCrossingData *crossing, double x,