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.
This commit is contained in:
Benjamin Otte
2018-03-08 03:30:44 +01:00
parent 47ea3a9452
commit 957ff4761e
3 changed files with 34 additions and 8 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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))