diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2018-08-08 09:39:22 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2018-08-08 09:39:22 -0400 |
commit | d3f8ca29025af91655d61302eaa589ba6563a315 (patch) | |
tree | f69b48d449ab6cf01e572c684b5a5f027a8fedec | |
parent | 08b9eeef281b0a42de83d1467d83e37b68a9567b (diff) | |
download | efl-d3f8ca29025af91655d61302eaa589ba6563a315.tar.gz |
efl_ui_composition: remove all registered children on unregister
Summary:
ensure that all the children are gone once we unregister the widget
itself. This helps widgets that are not cleaning up theire children /
items on invalidation.
ref T7213.
Reviewers: CHAN, YOhoho, zmike
Reviewed By: zmike
Subscribers: cedric, #committers, zmike
Tags: #efl
Maniphest Tasks: T7213
Differential Revision: https://phab.enlightenment.org/D6754
-rw-r--r-- | src/lib/elementary/efl_ui_focus_composition.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/lib/elementary/efl_ui_focus_composition.c b/src/lib/elementary/efl_ui_focus_composition.c index a35e71f99a..57c45ad35b 100644 --- a/src/lib/elementary/efl_ui_focus_composition.c +++ b/src/lib/elementary/efl_ui_focus_composition.c @@ -15,7 +15,7 @@ typedef struct { Eina_List *order, *targets_ordered; Eina_List *register_target, *registered_targets; Eina_List *adapters; - Efl_Ui_Focus_Manager *registered, *custom_manager; + Efl_Ui_Focus_Manager *registered, *custom_manager, *old_manager; Eina_Bool dirty; Eina_Bool logical; } Efl_Ui_Focus_Composition_Data; @@ -39,6 +39,7 @@ _state_apply(Eo *obj, Efl_Ui_Focus_Composition_Data *pd) Eina_List *safed = NULL; Efl_Ui_Focus_Object *o; + pd->old_manager = manager; //remove all of them EINA_LIST_FREE(pd->registered_targets, o) { @@ -75,6 +76,21 @@ _state_apply(Eo *obj, Efl_Ui_Focus_Composition_Data *pd) efl_ui_focus_manager_calc_update_order(manager, obj, eina_list_clone(pd->targets_ordered)); } + else + { + Efl_Ui_Focus_Object *o; + + EINA_LIST_FREE(pd->registered_targets, o) + { + efl_ui_focus_manager_calc_unregister(pd->old_manager, o); + + if (efl_isa(o, EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS)) + { + efl_ui_focus_composition_adapter_focus_manager_parent_set(o, NULL); + efl_ui_focus_composition_adapter_focus_manager_object_set(o, NULL); + } + } + } } static void _del(void *data, const Efl_Event *ev) |