From 05d4f0b25623243a01b00956060409a1dcd1c3cc Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Wed, 9 May 2018 21:10:47 +0200 Subject: [PATCH] efl_ui_focus_manager_root_focus: support a custom canvas object --- .../efl_ui_focus_manager_root_focus.c | 74 +++++++++++++++---- .../efl_ui_focus_manager_root_focus.eo | 14 ++++ 2 files changed, 72 insertions(+), 16 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 aa0a588db4..639487b9d9 100644 --- a/src/lib/elementary/efl_ui_focus_manager_root_focus.c +++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.c @@ -13,7 +13,7 @@ #define MY_CLASS EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS typedef struct { - Efl_Ui_Focus_Object *root; + Efl_Ui_Focus_Object *replacement_object; Evas_Object *rect; Eina_Bool rect_registered; @@ -24,7 +24,7 @@ typedef struct { static Efl_Ui_Focus_Object* _trap(Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *obj) { - if (pd->rect == obj) return pd->root; + if (pd->rect == obj) return pd->replacement_object; return obj; } @@ -51,10 +51,10 @@ _state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd) } else { - efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL); + efl_ui_focus_manager_calc_register(obj, pd->rect, pd->replacement_object, NULL); pd->rect_registered = EINA_TRUE; - efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, pd->root); + efl_ui_focus_composition_adapter_focus_manager_parent_set(pd->rect, pd->replacement_object); efl_ui_focus_composition_adapter_focus_manager_object_set(pd->rect, obj); if (focused) @@ -153,24 +153,66 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_move(Eo *obj, Efl_Ui_Focus return _trap(pd, efl_ui_focus_manager_move(efl_super(obj, MY_CLASS), direction)); } +EOLIAN static Efl_Canvas_Object* +_efl_ui_focus_manager_root_focus_canvas_object_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Root_Focus_Data *pd) +{ + return pd->replacement_object; +} + +EOLIAN static void +_efl_ui_focus_manager_root_focus_canvas_object_set(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Canvas_Object *canvas_object) +{ + + //if canvas object is NULL trigger it as root + if (!canvas_object) + canvas_object = efl_ui_focus_manager_root_get(obj); + + if (canvas_object == pd->replacement_object) return; + + if (pd->replacement_object) + { + pd->iterator_list = eina_list_remove(pd->iterator_list, pd->replacement_object); + pd->replacement_object = NULL; + } + + pd->replacement_object = canvas_object; + if (pd->replacement_object) + { + efl_ui_focus_composition_adapter_canvas_object_set(pd->rect, pd->replacement_object); + pd->iterator_list = eina_list_append(pd->iterator_list, pd->replacement_object); + + } +} + + +EOLIAN static Efl_Object* +_efl_ui_focus_manager_root_focus_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd) +{ + pd->rect = efl_add_ref(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(pd->rect, NULL); + + return efl_constructor(efl_super(obj, MY_CLASS)); +} + +EOLIAN static void +_efl_ui_focus_manager_root_focus_efl_object_destructor(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd) +{ + efl_unref(pd->rect); + pd->rect = NULL; + + efl_destructor(efl_super(obj, MY_CLASS)); +} + EOLIAN static Efl_Object* _efl_ui_focus_manager_root_focus_efl_object_finalize(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd) { - Efl_Object *ret; - - ret = efl_finalize(efl_super(obj, MY_CLASS)); - - pd->root = efl_ui_focus_manager_root_get(obj); - - pd->rect = efl_add(EFL_UI_FOCUS_COMPOSITION_ADAPTER_CLASS, pd->root); - efl_ui_focus_composition_adapter_canvas_object_set(pd->rect, pd->root); - EINA_SAFETY_ON_NULL_RETURN_VAL(pd->rect, NULL); - - pd->iterator_list = eina_list_append(pd->iterator_list, pd->root); + //set it to NULL so the root manager is passed to the manager + if (!pd->replacement_object) + efl_ui_focus_manager_root_focus_canvas_object_set(obj, NULL); _state_eval(obj, pd); - return ret; + return efl_finalize(efl_super(obj, MY_CLASS)); } #include "efl_ui_focus_manager_root_focus.eo.c" diff --git a/src/lib/elementary/efl_ui_focus_manager_root_focus.eo b/src/lib/elementary/efl_ui_focus_manager_root_focus.eo index 4b3fe8f533..81bd312abf 100644 --- a/src/lib/elementary/efl_ui_focus_manager_root_focus.eo +++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.eo @@ -1,5 +1,17 @@ class Efl.Ui.Focus.Manager_Root_Focus(Efl.Ui.Focus.Manager_Calc) { [[ This class ensures that the root is at least focusable, if nothing else is focusable]] + methods { + @property canvas_object { + [[ + The default replacement object for the case that there is no focusable object inside the manager is the root object. + However, you can change this by setting this value to something else. + $null is triggered as the same value as Efl.Ui.Focus.Manager.root.get + ]] + values { + canvas_object : Efl.Canvas.Object; [[Canvas object]] + } + } + } implements { Efl.Ui.Focus.Manager_Calc.register_logical; Efl.Ui.Focus.Manager_Calc.register; @@ -10,6 +22,8 @@ class Efl.Ui.Focus.Manager_Root_Focus(Efl.Ui.Focus.Manager_Calc) { Efl.Ui.Focus.Manager.border_elements {get;} Efl.Ui.Focus.Manager.request_move; Efl.Ui.Focus.Manager.move; + Efl.Object.constructor; + Efl.Object.destructor; Efl.Object.finalize; } }