diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-21 18:30:53 +0200 |
---|---|---|
committer | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2019-08-21 18:30:53 +0200 |
commit | 3cade716ed607ac4dfde3b0cce83a36cfcbc28e2 (patch) | |
tree | d0579cd127ad8cbd778399c80554f3f7a6a714ab | |
parent | d4c3aa5cb7ef2acd87970a3e92678263d669b7c7 (diff) | |
download | efl-devs/bu5hm4n/work.tar.gz |
efl_ui_widget: fix model listenting logicdevs/bu5hm4n/work
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.
-rw-r--r-- | src/lib/elementary/efl_ui_widget.c | 10 | ||||
-rw-r--r-- | 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 3dc4c1a69d..7ad2a23f89 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; |