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;
{
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:
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);
{
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;
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 =
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))