From af858d1d935f3507cb72f9d4a0f67fdfbb5b7463 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Thu, 8 Jun 2017 23:52:37 +0200 Subject: [PATCH] elm_widget: add factory method to the widget with this function you can trap the creation of the mangers, and change the behaviour as you need it. For example returning a custom manager. --- src/lib/elementary/efl_ui_win.c | 16 +++++++++++++--- src/lib/elementary/efl_ui_win.eo | 1 + src/lib/elementary/elm_hover.c | 16 +++++++++++++--- src/lib/elementary/elm_hover.eo | 1 + src/lib/elementary/elm_interface_scrollable.c | 15 +++++++++++++-- src/lib/elementary/elm_interface_scrollable.eo | 3 ++- src/lib/elementary/elm_inwin.c | 18 +++++++++++++++--- src/lib/elementary/elm_inwin.eo | 1 + src/lib/elementary/elm_menu.c | 26 ++++++++++++++++---------- src/lib/elementary/elm_menu.eo | 1 + src/lib/elementary/elm_widget.c | 8 ++++++++ src/lib/elementary/elm_widget.eo | 10 ++++++++++ 12 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 37f55f3..62005bb 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -5276,15 +5276,25 @@ _efl_ui_win_efl_canvas_object_legacy_ctor(Eo *obj, Efl_Ui_Win_Data *sd) efl_canvas_object_legacy_ctor(efl_super(obj, MY_CLASS)); } +EOLIAN static Efl_Ui_Focus_Manager* +_efl_ui_win_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) +{ + Efl_Ui_Focus_Manager *manager; + + manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + return manager; +} + EOLIAN static Eo * _efl_ui_win_efl_object_constructor(Eo *obj, Efl_Ui_Win_Data *pd) { /* Do nothing. */ /* XXX: We are calling the constructor chain from the finalizer. It's * really bad and hacky. Needs fixing. */ - pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, obj, - efl_ui_focus_manager_root_set(efl_added, obj) - ); + pd->manager = elm_obj_widget_focus_manager_factory(obj, obj); efl_composite_attach(obj, pd->manager); diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 86a529a..e520830 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo @@ -937,6 +937,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window, Elm.Widget.theme_apply; Elm.Widget.on_focus; Elm.Widget.widget_event; + Elm.Widget.focus_manager_factory; Elm.Interface.Atspi_Accessible.parent { get; } Elm.Interface.Atspi_Accessible.state_set { get; } Elm.Interface.Atspi_Accessible.name { get; } diff --git a/src/lib/elementary/elm_hover.c b/src/lib/elementary/elm_hover.c index 22f40a3..c8eae13 100644 --- a/src/lib/elementary/elm_hover.c +++ b/src/lib/elementary/elm_hover.c @@ -687,6 +687,18 @@ elm_hover_add(Evas_Object *parent) return obj; } +EOLIAN static Efl_Ui_Focus_Manager* +_elm_hover_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Hover_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) +{ + Efl_Ui_Focus_Manager *manager; + + manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + return manager; +} + EOLIAN static Eo * _elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd) { @@ -695,9 +707,7 @@ _elm_hover_efl_object_constructor(Eo *obj, Elm_Hover_Data *pd) evas_object_smart_callbacks_descriptions_set(obj, _smart_callbacks); elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_POPUP_MENU); - pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, - efl_ui_focus_manager_root_set(efl_added, obj) - ); + pd->manager = elm_obj_widget_focus_manager_factory(obj, obj); efl_composite_attach(obj, pd->manager); diff --git a/src/lib/elementary/elm_hover.eo b/src/lib/elementary/elm_hover.eo index d8a3635..8321a38 100644 --- a/src/lib/elementary/elm_hover.eo +++ b/src/lib/elementary/elm_hover.eo @@ -70,6 +70,7 @@ class Elm.Hover (Elm.Layout, Efl.Ui.Clickable, Elm.Interface.Atspi_Widget_Action Elm.Widget.focus_direction_manager_is; Elm.Widget.focus_next_manager_is; Elm.Widget.sub_object_del; + Elm.Widget.focus_manager_factory; Elm.Layout.sizing_eval; Elm.Layout.content_aliases { get; } Elm.Interface.Atspi_Widget_Action.elm_actions { get; } diff --git a/src/lib/elementary/elm_interface_scrollable.c b/src/lib/elementary/elm_interface_scrollable.c index f008d0b..961ad4e 100644 --- a/src/lib/elementary/elm_interface_scrollable.c +++ b/src/lib/elementary/elm_interface_scrollable.c @@ -4654,11 +4654,22 @@ _focused_element(void *data, const Efl_Event *event) elm_interface_scrollable_region_bring_in(obj, geom.x, geom.y, geom.w, geom.h); } +EOLIAN static Efl_Ui_Focus_Manager* +_elm_interface_scrollable_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) +{ + Efl_Ui_Focus_Manager *manager; + + manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + return manager; +} + EOLIAN static Efl_Object* _elm_interface_scrollable_efl_object_constructor(Eo *obj, Elm_Scrollable_Smart_Interface_Data *pd EINA_UNUSED) { - pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj, - efl_ui_focus_manager_root_set(efl_added, obj)); + pd->manager = elm_obj_widget_focus_manager_factory(obj, obj); efl_composite_attach(obj, pd->manager); diff --git a/src/lib/elementary/elm_interface_scrollable.eo b/src/lib/elementary/elm_interface_scrollable.eo index 6f9520b..fd05fcc 100644 --- a/src/lib/elementary/elm_interface_scrollable.eo +++ b/src/lib/elementary/elm_interface_scrollable.eo @@ -42,7 +42,7 @@ enum Elm.Scroller.Movement_Block } -mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus.Manager) +mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus.Manager, Elm.Widget) { [[Elm scrollable mixin]] eo_prefix: elm_interface_scrollable; @@ -682,6 +682,7 @@ mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Canvas.Group, Efl.Ui.Focus Efl.Object.constructor; Efl.Ui.Focus.Manager.border_elements { get; } Efl.Ui.Focus.Manager.focus; + Elm.Widget.focus_manager_factory; } events { changed; [[Called when content changed]] diff --git a/src/lib/elementary/elm_inwin.c b/src/lib/elementary/elm_inwin.c index d19788a..d671ec8 100644 --- a/src/lib/elementary/elm_inwin.c +++ b/src/lib/elementary/elm_inwin.c @@ -108,6 +108,20 @@ elm_win_inwin_add(Evas_Object *parent) return obj; } + +EOLIAN static Efl_Ui_Focus_Manager* +_elm_inwin_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Inwin_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) +{ + Efl_Ui_Focus_Manager *manager; + + manager = efl_add(EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + return manager; +} + + EOLIAN static Eo * _elm_inwin_efl_object_constructor(Eo *obj, Elm_Inwin_Data *pd EINA_UNUSED) { @@ -125,9 +139,7 @@ _elm_inwin_efl_object_constructor(Eo *obj, Elm_Inwin_Data *pd EINA_UNUSED) efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY); elm_interface_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_GLASS_PANE); - pd->manager = efl_add(EFL_UI_FOCUS_MANAGER_ROOT_FOCUS_CLASS, NULL, - efl_ui_focus_manager_root_set(efl_added, obj) - ); + pd->manager = elm_obj_widget_focus_manager_factory(obj, obj); efl_composite_attach(obj, pd->manager); diff --git a/src/lib/elementary/elm_inwin.eo b/src/lib/elementary/elm_inwin.eo index dd831a9..0a1e2b6 100644 --- a/src/lib/elementary/elm_inwin.eo +++ b/src/lib/elementary/elm_inwin.eo @@ -24,6 +24,7 @@ class Elm.Inwin (Elm.Layout, Efl.Ui.Focus.Manager) Elm.Widget.widget_parent { set; } Elm.Widget.focus_next_manager_is; Elm.Widget.focus_next; + Elm.Widget.focus_manager_factory; Elm.Layout.content_aliases { get; } Elm.Layout.sizing_eval; Efl.Gfx.visible { set; } diff --git a/src/lib/elementary/elm_menu.c b/src/lib/elementary/elm_menu.c index 8a79866..e6d2702 100644 --- a/src/lib/elementary/elm_menu.c +++ b/src/lib/elementary/elm_menu.c @@ -801,21 +801,27 @@ elm_menu_add(Evas_Object *parent) return efl_add(MY_CLASS, parent); } +EOLIAN static Efl_Ui_Focus_Manager* +_elm_menu_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Menu_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root) +{ + Efl_Ui_Focus_Manager *manager; + + manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + return manager; +} + EOLIAN static Eo * _elm_menu_efl_object_constructor(Eo *obj, Elm_Menu_Data *sd) { Eo *parent = NULL; + Efl_Ui_Focus_Manager *manager; - { - Efl_Ui_Focus_Manager *manager; - - manager = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, - efl_ui_focus_manager_root_set(efl_added, obj) - ); - - efl_composite_attach(obj, manager); - _efl_ui_focus_manager_redirect_events_add(manager, obj); - } + manager = elm_obj_widget_focus_manager_factory(obj, obj); + efl_composite_attach(obj, manager); + _efl_ui_focus_manager_redirect_events_add(manager, obj); obj = efl_constructor(efl_super(obj, MY_CLASS)); efl_canvas_object_type_set(obj, MY_CLASS_NAME_LEGACY); diff --git a/src/lib/elementary/elm_menu.eo b/src/lib/elementary/elm_menu.eo index 314b87d..de428b0 100644 --- a/src/lib/elementary/elm_menu.eo +++ b/src/lib/elementary/elm_menu.eo @@ -54,6 +54,7 @@ class Elm.Menu (Elm.Widget, Efl.Ui.Clickable, Efl.Ui.Menu, Elm.Widget.widget_parent { get; set; } Elm.Widget.theme_apply; Elm.Widget.translate; + Elm.Widget.focus_manager_factory; Elm.Interface.Atspi_Accessible.children { get; } Elm.Interface.Atspi.Selection.selected_children_count { get; } Elm.Interface.Atspi.Selection.selected_child { get; } diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index 57c2d25..b8606c6 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -6504,6 +6504,14 @@ _elm_widget_efl_ui_focus_object_focus_set(Eo *obj, Elm_Widget_Smart_Data *pd, Ei efl_ui_focus_object_focus_set(efl_super(obj, MY_CLASS), focus); } +EOLIAN static Efl_Ui_Focus_Manager* +_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED, Efl_Ui_Focus_Object *root EINA_UNUSED) +{ + ERR("No manager presented"); + return NULL; +} + + /* Internal EO APIs and hidden overrides */ #define ELM_WIDGET_EXTRA_OPS \ diff --git a/src/lib/elementary/elm_widget.eo b/src/lib/elementary/elm_widget.eo index bb1cf07..4b9dcb8 100644 --- a/src/lib/elementary/elm_widget.eo +++ b/src/lib/elementary/elm_widget.eo @@ -799,6 +799,16 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible, Elm.Inter } return : bool; [[return if it registered fully or not]] } + focus_manager_factory { + [[If the widget needs a manager, this function is called + + It can be used and overriden to inject your own manager or set custom options on the manager + ]] + params { + root : Efl.Ui.Focus.Object; [[the logical root to use in the manager.]] + } + return : Efl.Ui.Focus.Manager; + } } implements { class.constructor; -- 2.7.4