diff options
author | zmike <michael.blumenkrantz@gmail.com> | 2014-03-23 10:37:47 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2014-03-23 10:41:45 -0400 |
commit | b0089c7017025f9e6cf5b7e8d8e7be5206929934 (patch) | |
tree | fcf1603ee7bf1e19eaa899485cecf6cabc981237 | |
parent | ed2dd62702ce5c63b2a6bc31fa5ac95c757489f4 (diff) | |
download | elementary-b0089c7017025f9e6cf5b7e8d8e7be5206929934.tar.gz |
genlist no longer crashes if a selected item is deleted during deselect_all
-rw-r--r-- | src/lib/elm_genlist.c | 20 | ||||
-rw-r--r-- | 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 b4c965bac..ca933e14b 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -2368,14 +2368,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; } @@ -3067,7 +3069,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 (it->itc->func.del) it->itc->func.del((void *)it->base.data, WIDGET(it)); diff --git a/src/lib/elm_widget_genlist.h b/src/lib/elm_widget_genlist.h index 4ac52c2a3..a0010b9d3 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 */ |