summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-07-14 16:50:22 -0400
committerMatthias Clasen <mclasen@redhat.com>2022-07-14 16:53:09 -0400
commit678eb8ab76bda38829be4de8371ced6f43f781ff (patch)
tree9a6b13fa84b651ec012346a716dace31549167ea
parentc46b5ed6461fd54b739a04b17ac00b31d607aec8 (diff)
downloadgtk+-678eb8ab76bda38829be4de8371ced6f43f781ff.tar.gz
maplistmodel: Fix items-changed emission
We were modifying the removed value before passing it to the items-changed signal, so we always ended up with removed == 0 in our signal emission, instead of passing the original value on, as we should. Pointed out in !4870
-rw-r--r--gtk/gtkmaplistmodel.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gtk/gtkmaplistmodel.c b/gtk/gtkmaplistmodel.c
index 5001367b9f..e1cb0b1553 100644
--- a/gtk/gtkmaplistmodel.c
+++ b/gtk/gtkmaplistmodel.c
@@ -220,6 +220,7 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
{
MapNode *node;
guint start, end;
+ guint count;
if (self->items == NULL)
{
@@ -232,21 +233,22 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
node = gtk_map_list_model_get_nth (self->items, position, &start);
g_assert (start <= position);
- while (removed > 0)
+ count = removed;
+ while (count > 0)
{
end = start + node->n_items;
- if (start == position && end <= position + removed)
+ if (start == position && end <= position + count)
{
MapNode *next = gtk_rb_tree_node_get_next (node);
- removed -= node->n_items;
+ count -= node->n_items;
gtk_rb_tree_remove (self->items, node);
node = next;
}
else
{
- if (end >= position + removed)
+ if (end >= position + count)
{
- node->n_items -= removed;
+ node->n_items -= count;
removed = 0;
gtk_rb_tree_node_mark_dirty (node);
}
@@ -255,7 +257,7 @@ gtk_map_list_model_items_changed_cb (GListModel *model,
guint overlap = node->n_items - (position - start);
node->n_items -= overlap;
gtk_rb_tree_node_mark_dirty (node);
- removed -= overlap;
+ count -= overlap;
start = position;
node = gtk_rb_tree_node_get_next (node);
}