summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2019-08-06 10:52:32 -0400
committerMike Blumenkrantz <zmike@samsung.com>2019-08-06 10:52:32 -0400
commit912dfe270ea57721ee0e091c3a30ee9e5d53a6dc (patch)
tree5f674ad18576d33d090511a89d99e2e4a8620392
parent63d3af3ce938c1efc8b44075075f2caa55a63a49 (diff)
downloadefl-912dfe270ea57721ee0e091c3a30ee9e5d53a6dc.tar.gz
efl_ui_focus_manager_root_focus: perform focus switch delayed
Summary: Delaying the unregistering here ensures that there is not focus set call while a object is beeing registered in the focus manager. ref T8081 Reviewers: zmike, cedric Reviewed By: zmike Subscribers: #reviewers, #committers Tags: #efl Maniphest Tasks: T8081 Differential Revision: https://phab.enlightenment.org/D9513
-rw-r--r--src/lib/elementary/efl_ui_focus_manager_root_focus.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/lib/elementary/efl_ui_focus_manager_root_focus.c b/src/lib/elementary/efl_ui_focus_manager_root_focus.c
index f47fe3d3fe..29507001fb 100644
--- a/src/lib/elementary/efl_ui_focus_manager_root_focus.c
+++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.c
@@ -19,8 +19,22 @@ typedef struct {
Eina_Bool rect_registered;
Eina_List *iterator_list;
+ Eina_Future *focus_transfer;
} Efl_Ui_Focus_Manager_Root_Focus_Data;
+static Eina_Value
+_unregister_rect(Eo *obj, void *data EINA_UNUSED, const Eina_Value v EINA_UNUSED)
+{
+ Efl_Ui_Focus_Manager_Root_Focus_Data *pd = efl_data_scope_get(obj, MY_CLASS);
+
+ efl_ui_focus_manager_calc_unregister(obj, pd->rect);
+ pd->rect_registered = EINA_FALSE;
+ efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, NULL);
+ efl_ui_focus_composition_adapter_focus_manager_object_set(pd->rect, NULL);
+ pd->focus_transfer = NULL;
+ return EINA_VALUE_EMPTY;
+}
+
static Efl_Ui_Focus_Object*
_trap(Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *obj)
{
@@ -46,15 +60,17 @@ _state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
if (sub && pd->rect_registered)
{
- efl_ui_focus_manager_calc_unregister(obj, pd->rect);
- pd->rect_registered = EINA_FALSE;
- efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, NULL);
- efl_ui_focus_composition_adapter_focus_manager_object_set(pd->rect, NULL);
+ pd->focus_transfer = efl_loop_job(efl_main_loop_get());
+ efl_future_then(obj, pd->focus_transfer, _unregister_rect);
}
else if (!sub && !pd->rect_registered)
{
Efl_Ui_Focus_Object *root;
+ if (pd->focus_transfer)
+ eina_future_cancel(pd->focus_transfer);
+ pd->focus_transfer = NULL;
+
root = efl_ui_focus_manager_root_get(obj);
efl_ui_focus_manager_calc_register(obj, pd->rect, root, NULL);
efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, root);