[gtk/event-controller-responsive: 1/4] event controller: Add a ::responsive property



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]