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; + } +} --
