[gtk/selection-filter-fixes: 1/2] selectionfilter: Fix bugs in signal translation



commit d1cf29a3b1fc129d62670092055a589fcaa323fa
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Jul 3 09:53:27 2020 -0400

    selectionfilter: Fix bugs in signal translation
    
    When the position is 0, we can't check for unchanged
    elements below with gtk_bitset_size_in_range. And
    we don't need to, either.
    
    And be careful when translating [start,length]
    intervals to [first,last] ones. Off-by-one errors
    lurk everywhere.

 gtk/gtkselectionfiltermodel.c | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkselectionfiltermodel.c b/gtk/gtkselectionfiltermodel.c
index 5cf094e1a3..b9057c5cd1 100644
--- a/gtk/gtkselectionfiltermodel.c
+++ b/gtk/gtkselectionfiltermodel.c
@@ -107,15 +107,20 @@ gtk_selection_filter_model_items_changed_cb (GListModel *model,
                                              GtkSelectionFilterModel *self)
 {
   GtkBitset *selection;
-  guint sel_position;
-  guint sel_removed;
-  guint sel_added;
+  guint sel_position = 0;
+  guint sel_removed = 0;
+  guint sel_added = 0;
 
   selection = gtk_selection_model_get_selection (self->model);
 
-  sel_position = gtk_bitset_get_size_in_range (self->selection, 0, position - 1);
-  sel_removed = gtk_bitset_get_size_in_range (self->selection, position, position + removed);
-  sel_added = gtk_bitset_get_size_in_range (selection, position, position + added);
+  if (position > 0)
+    sel_position = gtk_bitset_get_size_in_range (self->selection, 0, position - 1);
+
+  if (removed > 0)
+    sel_removed = gtk_bitset_get_size_in_range (self->selection, position, position + removed - 1);
+
+  if (added > 0)
+    sel_added = gtk_bitset_get_size_in_range (selection, position, position + added - 1);
 
   gtk_bitset_unref (self->selection);
   self->selection = gtk_bitset_copy (selection);
@@ -133,13 +138,15 @@ gtk_selection_filter_model_selection_changed_cb (GListModel *model,
                                                  GtkSelectionFilterModel *self)
 {
   GtkBitset *selection;
-  guint sel_position;
-  guint sel_removed;
-  guint sel_added;
+  guint sel_position = 0;
+  guint sel_removed = 0;
+  guint sel_added = 0;
 
   selection = gtk_selection_model_get_selection (self->model);
 
-  sel_position = gtk_bitset_get_size_in_range (self->selection, 0, position - 1);
+  if (position > 0)
+    sel_position = gtk_bitset_get_size_in_range (self->selection, 0, position - 1);
+
   sel_removed = gtk_bitset_get_size_in_range (self->selection, position, position + n_items);
   sel_added = gtk_bitset_get_size_in_range (selection, position, position + n_items);
 


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