event controller: Add a ::responsive property

This lets us 'mute' controllers, for example
when widgets are insensitive. For now, we make
this property readonly and only let GTK itself
update it.
This commit is contained in:
Matthias Clasen
2019-05-02 19:11:30 +00:00
parent 19227d9789
commit da034390f2
4 changed files with 82 additions and 1 deletions

View File

@@ -6514,6 +6514,7 @@ GtkEventController
GtkPropagationPhase
gtk_event_controller_get_propagation_phase
gtk_event_controller_set_propagation_phase
gtk_event_controller_get_responsive
gtk_event_controller_handle_event
gtk_event_controller_get_widget
gtk_event_controller_reset

View File

@@ -43,6 +43,7 @@ typedef struct _GtkEventControllerPrivate GtkEventControllerPrivate;
enum {
PROP_WIDGET = 1,
PROP_PROPAGATION_PHASE,
PROP_RESPONSIVE,
LAST_PROP
};
@@ -52,6 +53,7 @@ struct _GtkEventControllerPrivate
{
GtkWidget *widget;
GtkPropagationPhase phase;
gboolean responsive;
};
G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkEventController, gtk_event_controller, G_TYPE_OBJECT)
@@ -63,6 +65,7 @@ gtk_event_controller_set_widget (GtkEventController *self,
GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self);
priv->widget = widget;
priv->responsive = gtk_widget_get_sensitive (widget);
}
static void
@@ -71,6 +74,16 @@ gtk_event_controller_unset_widget (GtkEventController *self)
GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self);
priv->widget = NULL;
priv->responsive = TRUE;
}
static gboolean
gtk_event_controller_filter_event_default (GtkEventController *self,
const GdkEvent *event)
{
GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self);
return !priv->responsive;
}
static gboolean
@@ -116,6 +129,9 @@ gtk_event_controller_get_property (GObject *object,
case PROP_PROPAGATION_PHASE:
g_value_set_enum (value, priv->phase);
break;
case PROP_RESPONSIVE:
g_value_set_enum (value, priv->responsive);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -128,7 +144,7 @@ gtk_event_controller_class_init (GtkEventControllerClass *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->filter_event = gtk_event_controller_filter_event_default;
klass->handle_event = gtk_event_controller_handle_event_default;
object_class->set_property = gtk_event_controller_set_property;
@@ -158,6 +174,21 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
GTK_PHASE_BUBBLE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
/**
* GtkEventController:responsive:
*
* Whether the controller handles events.
*
* GTK sets event controllers to be not responsive
* when the widget they are attached to becomes insensitive.
*/
properties[PROP_RESPONSIVE] =
g_param_spec_boolean ("responsive",
P_("Responsive"),
P_("Whether the controller is reponsive"),
TRUE,
GTK_PARAM_READABLE);
g_object_class_install_properties (object_class, LAST_PROP, properties);
}
@@ -168,6 +199,7 @@ gtk_event_controller_init (GtkEventController *controller)
priv = gtk_event_controller_get_instance_private (controller);
priv->phase = GTK_PHASE_BUBBLE;
priv->responsive = TRUE;
}
/**
@@ -299,3 +331,44 @@ gtk_event_controller_set_propagation_phase (GtkEventController *controller,
g_object_notify_by_pspec (G_OBJECT (controller), properties[PROP_PROPAGATION_PHASE]);
}
void
gtk_event_controller_set_responsive (GtkEventController *controller,
gboolean responsive)
{
GtkEventControllerPrivate *priv;
g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
priv = gtk_event_controller_get_instance_private (controller);
if (priv->responsive == responsive)
return;
priv->responsive = responsive;
if (!responsive)
gtk_event_controller_reset (controller);
g_object_notify_by_pspec (G_OBJECT (controller), properties[PROP_RESPONSIVE]);
}
/**
* gtk_event_controller_get_responsive:
* @controller: a #GtkEventController
*
* Returns whether the controller is currently responsive.
*
* Returns: %TRUE if @controller is responsive
*/
gboolean
gtk_event_controller_get_responsive (GtkEventController *controller)
{
GtkEventControllerPrivate *priv;
g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER (controller), TRUE);
priv = gtk_event_controller_get_instance_private (controller);
return priv->responsive;
}

View File

@@ -59,6 +59,9 @@ GDK_AVAILABLE_IN_ALL
void gtk_event_controller_set_propagation_phase (GtkEventController *controller,
GtkPropagationPhase phase);
GDK_AVAILABLE_IN_ALL
gboolean gtk_event_controller_get_responsive (GtkEventController *controller);
G_END_DECLS
#endif /* __GTK_EVENT_CONTROLLER_H__ */

View File

@@ -48,4 +48,8 @@ struct _GtkEventControllerClass
gpointer padding[10];
};
void
gtk_event_controller_set_responsive (GtkEventController *controller,
gboolean responsive);
#endif /* __GTK_EVENT_CONTROLLER_PRIVATE_H__ */