[gtk+] list, flow box: Make unpaired releases opt-in



commit 72c9853999c34fd4bd1309bf242173eacf4a67db
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Dec 30 23:23:16 2017 -0500

    list, flow box: Make unpaired releases opt-in
    
    We don't want a pointer that is moved off a scrollbar
    to trigger a row when it gets released. To avoid this,
    require an explicit opt-in to handling unpaired-releases.

 gtk/gtkflowbox.c |   33 +++++++++++++++++++++++++++++++--
 gtk/gtklistbox.c |   30 +++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index ca74b92..0d444f6 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -112,6 +112,9 @@ static void gtk_flow_box_bound_model_changed (GListModel *list,
                                               guint       added,
                                               gpointer    user_data);
 
+static void gtk_flow_box_set_accept_unpaired_release (GtkFlowBox *box,
+                                                      gboolean    accept);
+
 static void gtk_flow_box_check_model_compat  (GtkFlowBox *box);
 
 static void
@@ -616,6 +619,7 @@ enum {
   PROP_MAX_CHILDREN_PER_LINE,
   PROP_SELECTION_MODE,
   PROP_ACTIVATE_ON_SINGLE_CLICK,
+  PROP_ACCEPT_UNPAIRED_RELEASE,
 
   /* orientable */
   PROP_ORIENTATION,
@@ -642,6 +646,7 @@ struct _GtkFlowBoxPrivate {
   GtkAdjustment    *hadjustment;
   GtkAdjustment    *vadjustment;
   gboolean          activate_on_single_click;
+  gboolean          accept_unpaired_release;
 
   guint16           min_children_per_line;
   guint16           max_children_per_line;
@@ -2686,7 +2691,7 @@ gtk_flow_box_multipress_unpaired_release (GtkGestureMultiPress *gesture,
   GtkFlowBoxPrivate *priv = BOX_PRIV (box);
   GtkFlowBoxChild *child;
 
-  if (!priv->activate_on_single_click)
+  if (!priv->activate_on_single_click || !priv->accept_unpaired_release)
     return;
 
   child = gtk_flow_box_get_child_at_pos (box, x, y);
@@ -3302,6 +3307,9 @@ gtk_flow_box_get_property (GObject    *object,
     case PROP_ACTIVATE_ON_SINGLE_CLICK:
       g_value_set_boolean (value, priv->activate_on_single_click);
       break;
+    case PROP_ACCEPT_UNPAIRED_RELEASE:
+      g_value_set_boolean (value, priv->accept_unpaired_release);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -3350,6 +3358,9 @@ gtk_flow_box_set_property (GObject      *object,
     case PROP_ACTIVATE_ON_SINGLE_CLICK:
       gtk_flow_box_set_activate_on_single_click (box, g_value_get_boolean (value));
       break;
+    case PROP_ACCEPT_UNPAIRED_RELEASE:
+      gtk_flow_box_set_accept_unpaired_release (box, g_value_get_boolean (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -3445,6 +3456,13 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
                           TRUE,
                           GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
+  props[PROP_ACCEPT_UNPAIRED_RELEASE] =
+    g_param_spec_boolean ("accept-unpaired-release",
+                          P_("Accept unpaired release"),
+                          P_("Accept an unpaired release event"),
+                          FALSE,
+                          GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
   /**
    * GtkFlowBox:homogeneous:
    *
@@ -4387,7 +4405,18 @@ gtk_flow_box_get_activate_on_single_click (GtkFlowBox *box)
 
   return BOX_PRIV (box)->activate_on_single_click;
 }
- 
+
+static void
+gtk_flow_box_set_accept_unpaired_release (GtkFlowBox *box,
+                                          gboolean    accept)
+{
+  if (BOX_PRIV (box)->accept_unpaired_release == accept)
+    return;
+
+  BOX_PRIV (box)->accept_unpaired_release = accept;
+  g_object_notify_by_pspec (G_OBJECT (box), props[PROP_ACCEPT_UNPAIRED_RELEASE]);
+}
+
  /* Selection handling {{{2 */
 
 /**
diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c
index 6d704c5..03b35a5 100644
--- a/gtk/gtklistbox.c
+++ b/gtk/gtklistbox.c
@@ -104,6 +104,7 @@ typedef struct
   GtkWidget *scrollable_parent;
   GtkAdjustment *adjustment;
   gboolean activate_single_click;
+  gboolean accept_unpaired_release;
 
   GtkGesture *multipress_gesture;
 
@@ -151,6 +152,7 @@ enum {
   PROP_0,
   PROP_SELECTION_MODE,
   PROP_ACTIVATE_ON_SINGLE_CLICK,
+  PROP_ACCEPT_UNPAIRED_RELEASE,
   LAST_PROPERTY
 };
 
@@ -232,6 +234,8 @@ static void                 gtk_list_box_select_all_between             (GtkList
                                                                          gboolean             modify);
 static gboolean             gtk_list_box_unselect_all_internal          (GtkListBox          *box);
 static void                 gtk_list_box_selected_rows_changed          (GtkListBox          *box);
+static void                 gtk_list_box_set_accept_unpaired_release    (GtkListBox          *box,
+                                                                         gboolean             accept);
 
 static void gtk_list_box_multipress_gesture_pressed  (GtkGestureMultiPress *gesture,
                                                       guint                 n_press,
@@ -310,6 +314,9 @@ gtk_list_box_get_property (GObject    *obj,
     case PROP_ACTIVATE_ON_SINGLE_CLICK:
       g_value_set_boolean (value, priv->activate_single_click);
       break;
+    case PROP_ACCEPT_UNPAIRED_RELEASE:
+      g_value_set_boolean (value, priv->accept_unpaired_release);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -332,6 +339,9 @@ gtk_list_box_set_property (GObject      *obj,
     case PROP_ACTIVATE_ON_SINGLE_CLICK:
       gtk_list_box_set_activate_on_single_click (box, g_value_get_boolean (value));
       break;
+    case PROP_ACCEPT_UNPAIRED_RELEASE:
+      gtk_list_box_set_accept_unpaired_release (box, g_value_get_boolean (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec);
       break;
@@ -415,6 +425,13 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
                           TRUE,
                           G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
 
+  properties[PROP_ACCEPT_UNPAIRED_RELEASE] =
+    g_param_spec_boolean ("accept-unpaired-release",
+                          P_("Accept unpaired release"),
+                          P_("Accept unpaired release"),
+                          FALSE,
+                          G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (object_class, LAST_PROPERTY, properties);
 
   /**
@@ -1400,6 +1417,17 @@ gtk_list_box_get_activate_on_single_click (GtkListBox *box)
   return BOX_PRIV (box)->activate_single_click;
 }
 
+void
+gtk_list_box_set_accept_unpaired_release (GtkListBox *box,
+                                          gboolean    accept)
+{
+  if (BOX_PRIV (box)->accept_unpaired_release == accept)
+    return;
+
+  BOX_PRIV (box)->accept_unpaired_release = accept;
+
+  g_object_notify_by_pspec (G_OBJECT (box), properties[PROP_ACCEPT_UNPAIRED_RELEASE]);
+}
 
 static void
 gtk_list_box_add_move_binding (GtkBindingSet   *binding_set,
@@ -1791,7 +1819,7 @@ gtk_list_box_multipress_unpaired_release (GtkGestureMultiPress *gesture,
   GtkListBoxPrivate *priv = BOX_PRIV (box);
   GtkListBoxRow *row;
 
-  if (!priv->activate_single_click)
+  if (!priv->activate_single_click || !priv->accept_unpaired_release)
     return;
 
   row = gtk_list_box_get_row_at_y (box, y);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]