Add gtk_widget_prepend_controller

Add a variant of gtk_widget_add_controller that
inserts the controller at the beginning, instead
of the end. This will be used in entry completion
to make sure the entry completion key event handling
supersedes the entry one while the popup is open.

Keep this private for now, until we determine if
it needs to be public api.
This commit is contained in:
Matthias Clasen 2020-06-22 12:47:27 -04:00
parent 9faaa5e8be
commit 692cc42e10
2 changed files with 20 additions and 0 deletions

View File

@ -11415,6 +11415,23 @@ gtk_widget_add_controller (GtkWidget *widget,
gtk_list_list_model_item_added_at (priv->controller_observer, priv->controllers->len - 1); 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: * gtk_widget_remove_controller:
* @widget: a #GtkWidget * @widget: a #GtkWidget

View File

@ -346,6 +346,9 @@ gboolean gtk_widget_run_controllers (GtkWidget
double x, double x,
double y, double y,
GtkPropagationPhase phase); GtkPropagationPhase phase);
void gtk_widget_prepend_controller (GtkWidget *widget,
GtkEventController *controller);
void gtk_widget_handle_crossing (GtkWidget *widget, void gtk_widget_handle_crossing (GtkWidget *widget,
const GtkCrossingData *crossing, const GtkCrossingData *crossing,
double x, double x,