From: Benjamin Otte Date: Thu, 8 Mar 2018 02:30:44 +0000 (+0100) Subject: eventcontroller: Add vfuncs to (un)set widget X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~22^2~349^2~22 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e01e9ce0923f7e8fbbdfd090189688561724f762;p=gtk4.git eventcontroller: Add vfuncs to (un)set widget This is the first step towards refactoring how widgets deal with event controllers. In the future, the widget will treat controllers the same way it treats child widgets: 1. The controllers will be created without a widget. 2. There will be gtk_widget_add/remove_controller() functions to add or remove controllers. 3. The widget will hold a reference to all its controllers. This way we will ultimately be able to automate controllers with ui files. --- diff --git a/gtk/gtkeventcontroller.c b/gtk/gtkeventcontroller.c index 31afdc032e..31301b6106 100644 --- a/gtk/gtkeventcontroller.c +++ b/gtk/gtkeventcontroller.c @@ -56,8 +56,25 @@ struct _GtkEventControllerPrivate G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkEventController, gtk_event_controller, G_TYPE_OBJECT) +static void +gtk_event_controller_set_widget (GtkEventController *self, + GtkWidget *widget) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self); + + priv->widget = widget; +} + +static void +gtk_event_controller_unset_widget (GtkEventController *self) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self); + + priv->widget = NULL; +} + static gboolean -gtk_event_controller_handle_event_default (GtkEventController *controller, +gtk_event_controller_handle_event_default (GtkEventController *self, const GdkEvent *event) { return FALSE; @@ -71,15 +88,16 @@ gtk_event_controller_set_property (GObject *object, { GtkEventController *self = GTK_EVENT_CONTROLLER (object); GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self); + GtkWidget *widget; switch (prop_id) { case PROP_WIDGET: - priv->widget = g_value_get_object (value); - if (priv->widget) + widget = g_value_get_object (value); + if (widget) { - g_object_add_weak_pointer (G_OBJECT (priv->widget), (gpointer *) &priv->widget); - _gtk_widget_add_controller (priv->widget, self); + _gtk_widget_add_controller (widget, self); + g_object_add_weak_pointer (G_OBJECT (widget), (gpointer *) &priv->widget); } break; case PROP_PROPAGATION_PHASE: @@ -122,9 +140,8 @@ gtk_event_controller_dispose (GObject *object) priv = gtk_event_controller_get_instance_private (controller); if (priv->widget) { - _gtk_widget_remove_controller (priv->widget, controller); g_object_remove_weak_pointer (G_OBJECT (priv->widget), (gpointer *) &priv->widget); - priv->widget = NULL; + _gtk_widget_remove_controller (priv->widget, controller); } G_OBJECT_CLASS (gtk_event_controller_parent_class)->dispose (object); @@ -135,6 +152,8 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + klass->set_widget = gtk_event_controller_set_widget; + klass->unset_widget = gtk_event_controller_unset_widget; klass->filter_event = gtk_event_controller_handle_event_default; klass->handle_event = gtk_event_controller_handle_event_default; diff --git a/gtk/gtkeventcontrollerprivate.h b/gtk/gtkeventcontrollerprivate.h index 40462c1804..4d0efbb297 100644 --- a/gtk/gtkeventcontrollerprivate.h +++ b/gtk/gtkeventcontrollerprivate.h @@ -31,6 +31,9 @@ struct _GtkEventControllerClass { GObjectClass parent_class; + void (* set_widget) (GtkEventController *controller, + GtkWidget *widget); + void (* unset_widget) (GtkEventController *controller); gboolean (* handle_event) (GtkEventController *controller, const GdkEvent *event); void (* reset) (GtkEventController *controller); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 08c5db9bed..09cabb6bac 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -12894,13 +12894,15 @@ _gtk_widget_add_controller (GtkWidget *widget, g_return_if_fail (GTK_IS_WIDGET (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_event_controller_get_widget (controller) == NULL); data = _gtk_widget_has_controller (widget, controller); if (data) return; + GTK_EVENT_CONTROLLER_GET_CLASS (controller)->set_widget (controller, widget); + data = g_new0 (EventControllerData, 1); data->controller = controller; data->grab_notify_id = @@ -12934,6 +12936,8 @@ _gtk_widget_remove_controller (GtkWidget *widget, if (!data) return; + GTK_EVENT_CONTROLLER_GET_CLASS (controller)->unset_widget (controller); + g_object_remove_weak_pointer (G_OBJECT (data->controller), (gpointer *) &data->controller); if (g_signal_handler_is_connected (widget, data->grab_notify_id))