eventcontroller: Make widget no longer a construct-only property
authorBenjamin Otte <otte@redhat.com>
Sat, 10 Mar 2018 19:02:28 +0000 (20:02 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Thu, 26 Apr 2018 15:59:42 +0000 (17:59 +0200)
The new API model is now complete. To set a widget on a controller, it
is now necessary to call gtk_widget_add_controller().

gtk/gtkeventcontroller.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index d00f09ce3628a8040f063ea8da2c52c1fcdc100a..aed43c3d5e85cd203a36b4384aee096a7976dab7 100644 (file)
@@ -87,17 +87,9 @@ gtk_event_controller_set_property (GObject      *object,
                                    GParamSpec   *pspec)
 {
   GtkEventController *self = GTK_EVENT_CONTROLLER (object);
-  GtkWidget *widget;
 
   switch (prop_id)
     {
-    case PROP_WIDGET:
-      widget = g_value_get_object (value);
-      if (widget)
-        {
-          _gtk_widget_add_controller (widget, self, FALSE);
-        }
-      break;
     case PROP_PROPAGATION_PHASE:
       gtk_event_controller_set_propagation_phase (self,
                                                   g_value_get_enum (value));
@@ -129,21 +121,6 @@ gtk_event_controller_get_property (GObject    *object,
     }
 }
 
-static void
-gtk_event_controller_dispose (GObject *object)
-{
-  GtkEventController *controller = GTK_EVENT_CONTROLLER (object);
-  GtkEventControllerPrivate *priv;
-
-  priv = gtk_event_controller_get_instance_private (controller);
-  if (priv->widget)
-    {
-      gtk_widget_remove_controller (priv->widget, controller);
-    }
-
-  G_OBJECT_CLASS (gtk_event_controller_parent_class)->dispose (object);
-}
-
 static void
 gtk_event_controller_class_init (GtkEventControllerClass *klass)
 {
@@ -156,7 +133,6 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
 
   object_class->set_property = gtk_event_controller_set_property;
   object_class->get_property = gtk_event_controller_get_property;
-  object_class->dispose = gtk_event_controller_dispose;
 
   /**
    * GtkEventController:widget:
@@ -168,7 +144,7 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
                            P_("Widget"),
                            P_("Widget the gesture relates to"),
                            GTK_TYPE_WIDGET,
-                           GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY);
+                           GTK_PARAM_READABLE);
   /**
    * GtkEventController:propagation-phase:
    *
index 011344d4b3e482c22bbb8ee95a9d484ff888fde4..e7ab8010c7d2efccaca17ee6b186e99d81433d75 100644 (file)
@@ -459,7 +459,6 @@ typedef struct {
   GtkEventController *controller;
   guint grab_notify_id;
   guint sequence_state_changed_id;
-  gboolean have_ref;
 } EventControllerData;
 
 struct _GtkWidgetClassPrivate
@@ -12885,20 +12884,32 @@ event_controller_sequence_state_changed (GtkGesture            *gesture,
   cancel_event_sequence_on_hierarchy (widget, event_widget, sequence);
 }
 
+/**
+ * gtk_widget_add_controller:
+ * @widget: a #GtkWidget
+ * @controller: (transfer full): a #GtkEventController that hasn't been
+ *     added to a widget yet
+ *
+ * Adds @controller to @widget so that it will receive events. You will
+ * usually want to call this function right after creating any kind of
+ * #GtkEventController.
+ **/
 void
-_gtk_widget_add_controller (GtkWidget          *widget,
-                            GtkEventController *controller,
-                            gboolean            have_ref)
+gtk_widget_add_controller (GtkWidget          *widget,
+                           GtkEventController *controller)
 {
-  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+  GtkWidgetPrivate *priv;
   EventControllerData *data;
 
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
+  g_return_if_fail (gtk_event_controller_get_widget (controller) == NULL);
+
   priv = widget->priv;
 
   GTK_EVENT_CONTROLLER_GET_CLASS (controller)->set_widget (controller, widget);
 
   data = g_new0 (EventControllerData, 1);
-  data->have_ref = have_ref;
   data->controller = controller;
   data->grab_notify_id =
     g_signal_connect (widget, "grab-notify",
@@ -12917,27 +12928,6 @@ _gtk_widget_add_controller (GtkWidget          *widget,
   priv->event_controllers = g_list_prepend (priv->event_controllers, data);
 }
 
-/**
- * gtk_widget_add_controller:
- * @widget: a #GtkWidget
- * @controller: (transfer full): a #GtkEventController that hasn't been
- *     added to a widget yet
- *
- * Adds @controller to @widget so that it will receive events. You will
- * usually want to call this function right after creating any kind of
- * #GtkEventController.
- **/
-void
-gtk_widget_add_controller (GtkWidget          *widget,
-                           GtkEventController *controller)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
-  g_return_if_fail (gtk_event_controller_get_widget (controller) == NULL);
-
-  _gtk_widget_add_controller (widget, controller, TRUE);
-}
-
 /**
  * gtk_widget_remove_controller:
  * @widget: a #GtkWidget
@@ -12984,8 +12974,7 @@ gtk_widget_remove_controller (GtkWidget          *widget,
     g_signal_handler_disconnect (data->controller, data->sequence_state_changed_id);
 
   data->controller = NULL;
-  if (data->have_ref)
-    g_object_unref (controller);
+  g_object_unref (controller);
 }
 
 GList *
index 2a3df8177bb36bf9917ccf1717e67c387988506a..1fec8a82b37b1e899d5e2947cae9214ce551ba4c 100644 (file)
@@ -258,9 +258,6 @@ void              _gtk_widget_update_parent_muxer          (GtkWidget    *widget
 GtkActionMuxer *  _gtk_widget_get_action_muxer             (GtkWidget    *widget,
                                                             gboolean      create);
 
-void              _gtk_widget_add_controller               (GtkWidget           *widget,
-                                                            GtkEventController  *controller,
-                                                            gboolean             take_ref);
 GList *           _gtk_widget_list_controllers             (GtkWidget           *widget,
                                                             GtkPropagationPhase  phase);
 gboolean          _gtk_widget_consumes_motion              (GtkWidget           *widget,