summaryrefslogtreecommitdiff
path: root/gtk/gtkeventcontroller.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-04-08 20:25:53 +0200
committerCarlos Garnacho <carlosg@gnome.org>2014-05-23 19:54:25 +0200
commit759705d3e67d4bcb85fbcc2c2244a3505a0fd78c (patch)
treed023c83d6e78ea4b88fd03fd6732dbf0e1b44e8a /gtk/gtkeventcontroller.c
parent2ed086748f66be9848c93c20be0f8493e4ad3634 (diff)
downloadgtk+-759705d3e67d4bcb85fbcc2c2244a3505a0fd78c.tar.gz
eventcontroller: Add propagation-phase property
This is so we don't have to specify the capture phase for every controller. The default "bubble" value will be sane on most situations.
Diffstat (limited to 'gtk/gtkeventcontroller.c')
-rw-r--r--gtk/gtkeventcontroller.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/gtk/gtkeventcontroller.c b/gtk/gtkeventcontroller.c
index cf891524ea..a4d294d244 100644
--- a/gtk/gtkeventcontroller.c
+++ b/gtk/gtkeventcontroller.c
@@ -19,6 +19,7 @@
*/
#include "config.h"
#include <gtk/gtkeventcontroller.h>
+#include "gtktypebuiltins.h"
#include "gtkmarshalers.h"
#include "gtkprivate.h"
#include "gtkintl.h"
@@ -27,7 +28,8 @@ typedef struct _GtkEventControllerPrivate GtkEventControllerPrivate;
enum {
PROP_WIDGET = 1,
- PROP_EVENT_MASK
+ PROP_EVENT_MASK,
+ PROP_PROPAGATION_PHASE
};
enum {
@@ -40,6 +42,7 @@ struct _GtkEventControllerPrivate
{
GtkWidget *widget;
guint evmask;
+ guint propagation_phase : 2;
};
guint signals[N_SIGNALS] = { 0 };
@@ -125,6 +128,13 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
P_("Event mask the controller handles"),
GDK_TYPE_EVENT_MASK, 0,
GTK_PARAM_READWRITE));
+ g_object_class_install_property (object_class,
+ PROP_PROPAGATION_PHASE,
+ g_param_spec_enum ("propagation-phase",
+ P_("Propagation phase"),
+ P_("Phase in event propagation where this controller handles events"),
+ GTK_TYPE_PROPAGATION_PHASE, GTK_PHASE_BUBBLE,
+ GTK_PARAM_READWRITE));
signals[HANDLE_EVENT] =
g_signal_new ("handle-event",
G_TYPE_FROM_CLASS (klass),
@@ -145,6 +155,10 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
static void
gtk_event_controller_init (GtkEventController *controller)
{
+ GtkEventControllerPrivate *priv;
+
+ priv = gtk_event_controller_get_instance_private (controller);
+ priv->propagation_phase = GTK_PHASE_BUBBLE;
}
/**
@@ -263,3 +277,53 @@ gtk_event_controller_reset (GtkEventController *controller)
g_signal_emit (controller, signals[RESET], 0);
}
+
+/**
+ * gtk_event_controller_get_propagation_phase:
+ * @controller: a #GtkEventController
+ *
+ * Gets the propagation phase at which this @controller is run.
+ *
+ * Returns: The propagation phase
+ *
+ * Since: 3.14
+ **/
+GtkPropagationPhase
+gtk_event_controller_get_propagation_phase (GtkEventController *controller)
+{
+ GtkEventControllerPrivate *priv;
+
+ g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER (controller), GTK_PHASE_NONE);
+
+ priv = gtk_event_controller_get_instance_private (controller);
+
+ return priv->propagation_phase;
+}
+
+/**
+ * gtk_event_controller_set_propagation_phase:
+ * @controller: a #GtkEventController
+ * @phase: the propagation phase
+ *
+ * Sets the propagation phase at which this @controller is run. Note that
+ * event controllers are run before the regular #GtkWidget::event handler.
+ *
+ * Since: 3.14
+ **/
+void
+gtk_event_controller_set_propagation_phase (GtkEventController *controller,
+ GtkPropagationPhase phase)
+{
+ GtkEventControllerPrivate *priv;
+
+ g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
+ g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_CAPTURE);
+
+ priv = gtk_event_controller_get_instance_private (controller);
+
+ if (priv->propagation_phase == phase)
+ return;
+
+ priv->propagation_phase = phase;
+ g_object_notify (G_OBJECT (controller), "propagation-phase");
+}