[gtk/event-controller-responsive: 1/4] event controller: Add a ::responsive property
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/event-controller-responsive: 1/4] event controller: Add a ::responsive property
- Date: Thu, 2 May 2019 19:17:40 +0000 (UTC)
commit da034390f27620829705e507b373140f987cf668
Author: Matthias Clasen <mclasen redhat com>
Date: Thu May 2 19:11:30 2019 +0000
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.
docs/reference/gtk/gtk4-sections.txt | 1 +
gtk/gtkeventcontroller.c | 75 +++++++++++++++++++++++++++++++++++-
gtk/gtkeventcontroller.h | 3 ++
gtk/gtkeventcontrollerprivate.h | 4 ++
4 files changed, 82 insertions(+), 1 deletion(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 64a14c44fa..5f90536a69 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -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
diff --git a/gtk/gtkeventcontroller.c b/gtk/gtkeventcontroller.c
index aed43c3d5e..f4951613d7 100644
--- a/gtk/gtkeventcontroller.c
+++ b/gtk/gtkeventcontroller.c
@@ -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;
+}
diff --git a/gtk/gtkeventcontroller.h b/gtk/gtkeventcontroller.h
index f2f2b6a2b0..c6b563c4a0 100644
--- a/gtk/gtkeventcontroller.h
+++ b/gtk/gtkeventcontroller.h
@@ -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__ */
diff --git a/gtk/gtkeventcontrollerprivate.h b/gtk/gtkeventcontrollerprivate.h
index 4d0efbb297..879460540e 100644
--- a/gtk/gtkeventcontrollerprivate.h
+++ b/gtk/gtkeventcontrollerprivate.h
@@ -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__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]