cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b8bf5b31e847194446838d32565a4c654823024b

commit b8bf5b31e847194446838d32565a4c654823024b
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Wed Aug 21 18:30:53 2019 +0200

    efl_ui_widget: fix model listenting logic
    
    if we are walking this method twice (spoiler we do!) then we subscribe
    twice to the event, which leads (depending on the order of executed
    deletion) to the accessing of obj after its deleted.
    
    Reviewed-by: Cedric BAIL <cedric.b...@free.fr>
    Differential Revision: https://phab.enlightenment.org/D9684
---
 src/lib/elementary/efl_ui_widget.c | 10 ++++++----
 src/lib/elementary/elm_widget.h    |  1 +
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/lib/elementary/efl_ui_widget.c 
b/src/lib/elementary/efl_ui_widget.c
index b3644a67ce..e03c67c542 100644
--- a/src/lib/elementary/efl_ui_widget.c
+++ b/src/lib/elementary/efl_ui_widget.c
@@ -5914,6 +5914,7 @@ _efl_ui_widget_model_provider_invalidate(void *data, 
const Efl_Event *event EINA
                                 data);
    efl_replace(&pd->properties.provider, NULL);
    efl_replace(&pd->properties.model, NULL);
+   pd->properties.callback_to_provider = EINA_FALSE;
 }
 
 static void
@@ -5928,10 +5929,11 @@ _efl_ui_widget_model_register(Eo *obj, 
Efl_Ui_Widget_Data *pd)
         efl_replace(&pd->properties.provider,
                     efl_provider_find(obj, EFL_MODEL_PROVIDER_CLASS));
         if (!pd->properties.provider) return ;
-        efl_event_callback_array_add(pd->properties.provider,
-                                     efl_ui_widget_model_provider_callbacks(),
-                                     obj);
-
+        if (!pd->properties.callback_to_provider)
+          efl_event_callback_array_add(pd->properties.provider,
+                                       
efl_ui_widget_model_provider_callbacks(),
+                                       obj);
+        pd->properties.callback_to_provider = EINA_TRUE;
         efl_replace(&pd->properties.model,
                     efl_ui_view_model_get(pd->properties.provider));
 
diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h
index 6350c882bf..4d854eb147 100644
--- a/src/lib/elementary/elm_widget.h
+++ b/src/lib/elementary/elm_widget.h
@@ -386,6 +386,7 @@ typedef struct _Elm_Widget_Smart_Data
       Eina_Hash *model_lookup;
       Eina_Hash *view_lookup;
       Eina_Bool  registered : 1;
+      Eina_Bool  callback_to_provider : 1;
    } properties;
    void                          *shared_win_data;
    Eina_Bool                     scroll_x_locked : 1;

-- 


Reply via email to