bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=05d4f0b25623243a01b00956060409a1dcd1c3cc

commit 05d4f0b25623243a01b00956060409a1dcd1c3cc
Author: Marcel Hollerbach <mar...@osg.samsung.com>
Date:   Wed May 9 21:10:47 2018 +0200

    efl_ui_focus_manager_root_focus:  support a custom canvas object
---
 .../elementary/efl_ui_focus_manager_root_focus.c   | 68 +++++++++++++++++-----
 .../elementary/efl_ui_focus_manager_root_focus.eo  | 14 +++++
 2 files changed, 69 insertions(+), 13 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_Object*
-_efl_ui_focus_manager_root_focus_efl_object_finalize(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
+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)
 {
-   Efl_Object *ret;
 
-   ret = efl_finalize(efl_super(obj, MY_CLASS));
+   //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);
+
+     }
+}
 
-   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);
+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);
 
-   pd->iterator_list = eina_list_append(pd->iterator_list, pd->root);
+   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)
+{
+   //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;
   }
 }

-- 


Reply via email to