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 */

-- 


Reply via email to