From ea088ab21fc2ba1b03941dce2471f1df9556f444 Mon Sep 17 00:00:00 2001 From: zmike Date: Sun, 23 Mar 2014 10:37:47 -0400 Subject: [PATCH] genlist no longer crashes if a selected item is deleted during deselect_all --- legacy/elementary/src/lib/elm_genlist.c | 20 ++++++++++++------- .../elementary/src/lib/elm_widget_genlist.h | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index 567c586c1d..09e5a7f282 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/src/lib/elm_genlist.c @@ -2377,14 +2377,16 @@ _item_multi_select_down(Elm_Genlist_Smart_Data *sd) static Eina_Bool _all_items_deselect(Elm_Genlist_Smart_Data *sd) { - Eina_List *l; - Elm_Object_Item *it; - if (!sd->selected) return EINA_FALSE; - l = eina_list_clone(sd->selected); - EINA_LIST_FREE(l, it) - elm_genlist_item_selected_set(it, EINA_FALSE); + sd->deselecting = eina_list_clone(sd->selected); + while (sd->deselecting) + { + Elm_Object_Item *it = eina_list_data_get(sd->deselecting); + + sd->deselecting = eina_list_remove_list(sd->deselecting, sd->deselecting); + elm_genlist_item_selected_set(it, EINA_FALSE); + } return EINA_TRUE; } @@ -3286,7 +3288,11 @@ _elm_genlist_item_del_not_serious(Elm_Gen_Item *it) if (it->walking > 0) return; if (it->selected) - sd->selected = eina_list_remove(sd->selected, it); + { + sd->selected = eina_list_remove(sd->selected, it); + if (sd->deselecting) + sd->deselecting = eina_list_remove(sd->deselecting, it); + } if (sd->last_focused_item == (Elm_Object_Item *)it) sd->last_focused_item = NULL; if (sd->focused_item == (Elm_Object_Item *)it) diff --git a/legacy/elementary/src/lib/elm_widget_genlist.h b/legacy/elementary/src/lib/elm_widget_genlist.h index 5fe7fa2366..68da89b4db 100644 --- a/legacy/elementary/src/lib/elm_widget_genlist.h +++ b/legacy/elementary/src/lib/elm_widget_genlist.h @@ -38,6 +38,7 @@ struct _Elm_Genlist_Smart_Data Eina_List *selected; /* a list of * selected * items */ + Eina_List *deselecting; /* a list of items currently being deselected */ Eina_List *group_items; /* a list of * groups index * items */