discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=2cf854752f5dd8462609b2766325359286548b62
commit 2cf854752f5dd8462609b2766325359286548b62 Author: zmike <[email protected]> Date: Sun Mar 23 10:37:47 2014 -0400 genlist no longer crashes if a selected item is deleted during deselect_all --- src/lib/elm_genlist.c | 20 +++++++++++++------- src/lib/elm_widget_genlist.h | 1 + 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index 567c586..09e5a7f 100644 --- a/src/lib/elm_genlist.c +++ b/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/src/lib/elm_widget_genlist.h b/src/lib/elm_widget_genlist.h index 5fe7fa2..68da89b 100644 --- a/src/lib/elm_widget_genlist.h +++ b/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 */ --
