elm_widget_item_static_focus: fix ERR prints
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Wed, 12 Dec 2018 11:49:37 +0000 (12:49 +0100)
committerWonki Kim <wonki_.kim@samsung.com>
Tue, 18 Dec 2018 07:13:58 +0000 (16:13 +0900)
There is the case that the deletion of the adapter can cause another
registeration, which then calls another time prepare, which then deletes
the adapter, before the actaul deletion of the first efl_del happened,
which means it will throw an error. To avoid this we track if we are in
process of a unrealization, and if so, do not delete the item there.

Reviewed-by: YeongJong Lee <yj34.lee@samsung.com>
Differential Revision: https://phab.enlightenment.org/D7453

src/lib/elementary/elm_widget_item_static_focus.c

index 00408fa..be07a78 100644 (file)
@@ -15,6 +15,7 @@
 typedef struct {
    Eo *adapter;
    Eina_Bool realized;
+   Eina_Bool in_unrealize;
 } Elm_Widget_Item_Static_Focus_Data;
 
 static void
@@ -73,7 +74,9 @@ _unrealized_cb(void *data, const Efl_Event *ev EINA_UNUSED)
         //only delete the adapter when not focused, this will lead to awfull artifacts
         if (!efl_ui_focus_object_focus_get(pd->adapter))
           {
+             pd->in_unrealize = EINA_TRUE;
              efl_del(pd->adapter);
+             pd->in_unrealize = EINA_FALSE;
           }
         pd->realized = EINA_FALSE;
      }
@@ -130,9 +133,12 @@ _elm_widget_item_static_focus_efl_ui_focus_object_prepare_logical_none_recursive
      }
    else if (logical_child && logical_child != pd->adapter)
      {
-        efl_ui_focus_manager_calc_unregister(wpd->widget, pd->adapter);
-        efl_del(pd->adapter);
-        pd->adapter = NULL;
+        if (!pd->in_unrealize)
+          {
+             efl_del(pd->adapter);
+             pd->adapter = NULL;
+          }
+
      }
 
    //genlist sometimes changes views when doing quick scrolls so reset the view in every possible call