From 957ff4761ec5e1e11952cdc116e1e4293d091b8b Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Thu, 8 Mar 2018 03:30:44 +0100 Subject: [PATCH] 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. --- gtk/gtkeventcontroller.c | 33 ++++++++++++++++++++++++++------- gtk/gtkeventcontrollerprivate.h | 3 +++ gtk/gtkwidget.c | 6 +++++- 3 files changed, 34 insertions(+), 8 deletions(-) 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 a140e12fce..b6e9ae0f08 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -13010,7 +13010,7 @@ _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); priv = widget->priv; data = _gtk_widget_has_controller (widget, controller); @@ -13018,6 +13018,8 @@ _gtk_widget_add_controller (GtkWidget *widget, 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 = @@ -13051,6 +13053,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))