bu5hm4n pushed a commit to branch master.

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

commit a7fb6e92b27c01a9b68ea8bfd0b46ff82398395b
Author: Marcel Hollerbach <[email protected]>
Date:   Thu May 25 16:37:01 2017 +0200

    introduce efl_ui_focus_manager_root_focus
    
    add a class that fills a dummy element for the case of no element added
    at all.
---
 src/Makefile_Elementary.am                         |   2 +
 src/lib/elementary/Elementary.h                    |   2 +
 .../elementary/efl_ui_focus_manager_root_focus.c   | 138 +++++++++++++++++++++
 .../elementary/efl_ui_focus_manager_root_focus.eo  |  15 +++
 4 files changed, 157 insertions(+)

diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index b9a89a81f4..e83ea8857c 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -119,6 +119,7 @@ elm_public_eolian_files = \
        lib/elementary/efl_ui_image_factory.eo \
        lib/elementary/efl_ui_focus_manager.eo \
        lib/elementary/efl_ui_focus_manager_sub.eo \
+       lib/elementary/efl_ui_focus_manager_root_focus.eo \
        lib/elementary/efl_ui_focus_object.eo \
        lib/elementary/efl_ui_focus_user.eo \
        $(NULL)
@@ -675,6 +676,7 @@ lib_elementary_libelementary_la_SOURCES = \
        lib/elementary/efl_ui_focus_manager.c \
        lib/elementary/efl_ui_focus_manager_sub.c \
        lib/elementary/efl_ui_focus_object.c \
+       lib/elementary/efl_ui_focus_manager_root_focus.c \
        $(NULL)
 
 
diff --git a/src/lib/elementary/Elementary.h b/src/lib/elementary/Elementary.h
index 2b840cf77d..4ec11f3c2c 100644
--- a/src/lib/elementary/Elementary.h
+++ b/src/lib/elementary/Elementary.h
@@ -147,11 +147,13 @@ EAPI extern Elm_Version *elm_version;
 # include "efl_ui_focus_object.eo.h"
 # include "efl_ui_focus_manager.eo.h"
 # include "efl_ui_focus_manager_sub.eo.h"
+# include "efl_ui_focus_manager_root_focus.eo.h"
 # include "efl_ui_focus_user.eo.h"
 #else
 # include "efl_ui_focus_object.eo.legacy.h"
 # include "efl_ui_focus_manager.eo.legacy.h"
 # include "efl_ui_focus_manager_sub.eo.legacy.h"
+# include "efl_ui_focus_manager_root_focus.eo.legacy.h"
 # include "efl_ui_focus_user.eo.legacy.h"
 #endif
 
diff --git a/src/lib/elementary/efl_ui_focus_manager_root_focus.c 
b/src/lib/elementary/efl_ui_focus_manager_root_focus.c
new file mode 100644
index 0000000000..fcfbd9047c
--- /dev/null
+++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.c
@@ -0,0 +1,138 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+#include "elm_priv.h"
+
+#define MY_CLASS EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS
+
+typedef struct {
+   Efl_Ui_Focus_Object *root;
+   Eina_List *none_logicals;
+
+   Evas_Object *rect;
+   Eina_Bool rect_registered;
+
+   Eina_List *iterator_list;
+} Efl_Ui_Focus_Manager_Root_Focus_Data;
+
+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;
+   return obj;
+}
+
+static void
+_state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
+{
+   if (!pd->none_logicals && pd->rect_registered)
+     {
+         efl_ui_focus_manager_unregister(obj, pd->rect);
+         pd->rect_registered = EINA_FALSE;
+     }
+   else if (pd->none_logicals && !pd->rect_registered)
+     {
+         efl_ui_focus_manager_register(obj, pd->rect, pd->root, NULL);
+         pd->rect_registered = EINA_TRUE;
+     }
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_register(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child, 
Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect)
+{
+   if (efl_ui_focus_manager_register(efl_super(obj, MY_CLASS), child, parent, 
redirect))
+     {
+        pd->none_logicals = eina_list_append(pd->none_logicals, child);
+        return EINA_TRUE;
+     }
+   if (child != pd->rect)
+     _state_eval(obj, pd);
+   return EINA_FALSE;
+}
+
+EOLIAN static void
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_unregister(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child)
+{
+   efl_ui_focus_manager_unregister(efl_super(obj, MY_CLASS), child);
+
+   pd->none_logicals = eina_list_remove(pd->none_logicals, child);
+
+   if (child != pd->rect)
+     _state_eval(obj, pd);
+}
+
+
+EOLIAN static void
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_focus(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *focus)
+{
+   efl_ui_focus_manager_focus(efl_super(obj, MY_CLASS), _trap(pd, focus));
+}
+
+
+EOLIAN static Efl_Ui_Focus_Object*
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_focused(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
+{
+   return _trap(pd, efl_ui_focus_manager_focused(efl_super(obj, MY_CLASS)));
+}
+
+
+EOLIAN static Efl_Ui_Focus_Relations *
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_fetch(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child)
+{
+   return efl_ui_focus_manager_fetch(efl_super(obj, MY_CLASS), _trap(pd, 
child));
+}
+
+
+EOLIAN static Efl_Ui_Focus_Object *
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_logical_end(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
+{
+   return _trap(pd, efl_ui_focus_manager_logical_end(efl_super(obj, 
MY_CLASS)));
+}
+
+EOLIAN static Eina_Iterator *
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_border_elements_get(Eo 
*obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
+{
+   if (!!pd->none_logicals)
+     {
+        return efl_ui_focus_manager_border_elements_get(efl_super(obj, 
MY_CLASS));;
+     }
+   else
+     {
+        return eina_list_iterator_new(pd->iterator_list);
+     }
+}
+
+
+EOLIAN static Efl_Ui_Focus_Object*
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_request_move(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Direction direction)
+{
+   return _trap(pd, efl_ui_focus_manager_request_move(efl_super(obj, 
MY_CLASS), direction));
+}
+
+
+EOLIAN static Efl_Ui_Focus_Object*
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_move(Eo *obj, 
Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Direction direction)
+{
+   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)
+{
+   Efl_Object *ret;
+
+   ret = efl_finalize(efl_super(obj, MY_CLASS));
+
+   pd->root = efl_ui_focus_manager_root_get(obj);
+   pd->rect = evas_object_rectangle_add(evas_object_evas_get(pd->root));
+   pd->iterator_list = eina_list_append(pd->iterator_list, pd->root);
+
+   _state_eval(obj, pd);
+
+   return ret;
+}
+
+
+#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
new file mode 100644
index 0000000000..3a3dd46ff8
--- /dev/null
+++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.eo
@@ -0,0 +1,15 @@
+class Efl.Ui.Focus.Manager.Root_Focus(Efl.Ui.Focus.Manager) {
+  [[ This class ensures that the root is at least focusable, if nothing else 
is focusable]]
+  implements {
+    Efl.Ui.Focus.Manager.register;
+    Efl.Ui.Focus.Manager.unregister;
+    Efl.Ui.Focus.Manager.focus;
+    Efl.Ui.Focus.Manager.focused;
+    Efl.Ui.Focus.Manager.fetch;
+    Efl.Ui.Focus.Manager.logical_end;
+    Efl.Ui.Focus.Manager.border_elements {get;}
+    Efl.Ui.Focus.Manager.request_move;
+    Efl.Ui.Focus.Manager.move;
+    Efl.Object.finalize;
+  }
+}

-- 


Reply via email to