diff --git a/src/lib/elementary/efl_ui_focus_composition.c b/src/lib/elementary/efl_ui_focus_composition.c index 051777d020..b9f94847cb 100644 --- a/src/lib/elementary/efl_ui_focus_composition.c +++ b/src/lib/elementary/efl_ui_focus_composition.c @@ -14,20 +14,27 @@ typedef struct { Eina_List *order, *targets_ordered; Eina_List *register_target, *registered_targets; Eina_List *adapters; - Efl_Ui_Focus_Manager *registered; + Efl_Ui_Focus_Manager *registered, *custom_manager; Eina_Bool dirty; } Efl_Ui_Focus_Composition_Data; static void _state_apply(Eo *obj, Efl_Ui_Focus_Composition_Data *pd) { + Efl_Ui_Focus_Manager *manager; + + if (pd->custom_manager) + manager = pd->custom_manager; + else + manager = pd->registered; + if (!pd->registered && pd->registered_targets) { Efl_Ui_Focus_Object *o; //remove all of them EINA_LIST_FREE(pd->registered_targets, o) { - efl_ui_focus_manager_calc_unregister(pd->registered, o); + efl_ui_focus_manager_calc_unregister(manager, o); } } else if (pd->registered) @@ -37,16 +44,16 @@ _state_apply(Eo *obj, Efl_Ui_Focus_Composition_Data *pd) //remove all of them EINA_LIST_FREE(pd->registered_targets, o) { - efl_ui_focus_manager_calc_unregister(pd->registered, o); + efl_ui_focus_manager_calc_unregister(manager, o); } EINA_LIST_FOREACH(pd->register_target, n, o) { - efl_ui_focus_manager_calc_register(pd->registered, o, obj, NULL); + efl_ui_focus_manager_calc_register(manager, o, obj, NULL); pd->registered_targets = eina_list_append(pd->registered_targets, o); } - efl_ui_focus_manager_calc_update_order(pd->registered, obj, eina_list_clone(pd->targets_ordered)); + efl_ui_focus_manager_calc_update_order(manager, obj, eina_list_clone(pd->targets_ordered)); } } @@ -155,6 +162,19 @@ _efl_ui_focus_composition_efl_ui_focus_object_prepare_logical(Eo *obj, Efl_Ui_Fo pd->dirty = EINA_FALSE; } +EOLIAN static void +_efl_ui_focus_composition_custom_manager_set(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Composition_Data *pd, Efl_Ui_Focus_Manager *custom_manager) +{ + pd->custom_manager = custom_manager; +} + +EOLIAN static Efl_Ui_Focus_Manager* +_efl_ui_focus_composition_custom_manager_get(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Composition_Data *pd) +{ + return pd->custom_manager; +} + + #include "efl_ui_focus_composition.eo.c" typedef struct { diff --git a/src/lib/elementary/efl_ui_focus_composition.eo b/src/lib/elementary/efl_ui_focus_composition.eo index 5d0f23b200..57f5d3818a 100644 --- a/src/lib/elementary/efl_ui_focus_composition.eo +++ b/src/lib/elementary/efl_ui_focus_composition.eo @@ -29,6 +29,12 @@ mixin Efl.Ui.Focus.Composition (Efl.Interface, Elm.Widget ) { You can use this function to call composition_elements. ]] } + @property custom_manager @protected { + [[Every widget will be registered in this manager]] + values { + custom_manager : Efl.Ui.Focus.Manager; + } + } } implements { Elm.Widget.focus_state_apply; diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c index e9d9a1c123..8c69e640a7 100644 --- a/src/lib/elementary/elm_toolbar.c +++ b/src/lib/elementary/elm_toolbar.c @@ -2966,6 +2966,8 @@ _elm_toolbar_efl_object_constructor(Eo *obj, Elm_Toolbar_Data *_pd EINA_UNUSED) evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks); elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_TOOL_BAR); + efl_ui_focus_composition_custom_manager_set(obj, obj); + return obj; }