redirect : Efl.Ui.Focus.Manager; [[Redirect manager]]
}
+struct Efl.Ui.Focus.Manager.Logical_End_Detail {
+ is_regular_end : bool;
+ element : Efl.Ui.Focus.Object;
+}
+
interface Efl.Ui.Focus.Manager {
[[Calculates the directions of Efl.Ui.Focus.Direction
The returned object is the last object that would be returned if you start at the root and move the direction into next.
]]
- return : Efl.Ui.Focus.Object; [[Last object]]
+ return : Efl.Ui.Focus.Manager.Logical_End_Detail; [[Last object]]
}
reset_history {
[[Reset the history stack of this manager object.
_focus_log_domain = -1;
}
-EOLIAN static Efl_Ui_Focus_Object*
+EOLIAN static Efl_Ui_Focus_Manager_Logical_End_Detail
_efl_ui_focus_manager_calc_efl_ui_focus_manager_logical_end(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_Calc_Data *pd)
{
Node *child = pd->root;
-
- EINA_SAFETY_ON_NULL_RETURN_VAL(child, NULL);
+ Efl_Ui_Focus_Manager_Logical_End_Detail ret = { 0, NULL};
+ EINA_SAFETY_ON_NULL_RETURN_VAL(child, ret);
//we need to return the most lower right element
- while(T(child).children)
+ while(T(child).children && !child->redirect_manager)
child = eina_list_last_data_get(T(child).children);
- while (child->type != NODE_TYPE_NORMAL)
+ while (child->type != NODE_TYPE_NORMAL && !child->redirect_manager)
child = _prev(child);
- return child ? child->focusable : NULL;
+ ret.is_regular_end = child->type == NODE_TYPE_NORMAL;
+ ret.element = child ? child->focusable : NULL;
+ return ret;
}
EOLIAN static void
}
-EOLIAN static Efl_Ui_Focus_Object *
+EOLIAN static Efl_Ui_Focus_Manager_Logical_End_Detail
_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)));
+ Efl_Ui_Focus_Manager_Logical_End_Detail res;
+
+ res = efl_ui_focus_manager_logical_end(efl_super(obj, MY_CLASS));
+
+ res.element = _trap(pd, res.element);
+ return res;
}
EOLIAN static Eina_Iterator *
if (!o && focus_dir == EFL_UI_FOCUS_DIRECTION_PREV)
{
- Efl_Ui_Focus_Object *last;
+ Efl_Ui_Focus_Manager_Logical_End_Detail last;
+ Efl_Ui_Focus_Manager *rec_manager = obj;
- last = efl_ui_focus_manager_logical_end(obj);
- efl_ui_focus_manager_focus_set(obj, last);
+ do {
+ last = efl_ui_focus_manager_logical_end(rec_manager);
+ efl_ui_focus_manager_focus_set(obj, last.element);
+
+ rec_manager = efl_ui_focus_manager_redirect_get(rec_manager);
+ } while (!last.is_regular_end);
}
return EINA_TRUE;