summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzmike <michael.blumenkrantz@gmail.com>2014-03-23 10:37:47 -0400
committerMike Blumenkrantz <zmike@samsung.com>2014-03-23 10:41:45 -0400
commitb0089c7017025f9e6cf5b7e8d8e7be5206929934 (patch)
treefcf1603ee7bf1e19eaa899485cecf6cabc981237
parented2dd62702ce5c63b2a6bc31fa5ac95c757489f4 (diff)
downloadelementary-b0089c7017025f9e6cf5b7e8d8e7be5206929934.tar.gz
genlist no longer crashes if a selected item is deleted during deselect_all
-rw-r--r--src/lib/elm_genlist.c20
-rw-r--r--src/lib/elm_widget_genlist.h1
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 */