jaehwan pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=431492ec497eeaa130f5c2da27ce7a4c7eefe7f9

commit 431492ec497eeaa130f5c2da27ce7a4c7eefe7f9
Author: Jaehwan Kim <jae.hwan....@samsung.com>
Date:   Tue Sep 15 19:41:51 2015 +0900

    focus: add the APIs to set the focus next about item.
    
    Add elm_object_focus_next_item_set/get,
    elm_object_item_focus_next_object_set/get and
    elm_object_item_focus_next_item_set/get.
    
    If the item and object is set at the same time,
    the item is preference to object when the focus moves.
    
    This feature is implemented about gengrid.
    It will be implemented about ohter widgets.
    
    @feature
---
 src/lib/elc_ctxpopup.c           |   6 +-
 src/lib/elc_fileselector.c       |   6 +-
 src/lib/elc_fileselector_entry.c |   6 +-
 src/lib/elc_multibuttonentry.c   |   6 +-
 src/lib/elc_naviframe.c          |   4 +-
 src/lib/elc_popup.c              |   4 +-
 src/lib/elm_access.c             |   4 +-
 src/lib/elm_box.c                |   4 +-
 src/lib/elm_bubble.c             |   4 +-
 src/lib/elm_calendar.c           |   4 +-
 src/lib/elm_clock.c              |   4 +-
 src/lib/elm_colorselector.c      |   4 +-
 src/lib/elm_datetime.c           |   8 +-
 src/lib/elm_diskselector.c       |  12 +-
 src/lib/elm_entry.c              |   2 +-
 src/lib/elm_flip.c               |   6 +-
 src/lib/elm_focus.h              |  45 +++++++-
 src/lib/elm_frame.c              |   4 +-
 src/lib/elm_gengrid.c            | 108 +++++++++++++++---
 src/lib/elm_genlist.c            |  16 ++-
 src/lib/elm_glview.c             |   4 +-
 src/lib/elm_grid.c               |   4 +-
 src/lib/elm_index.c              |   4 +-
 src/lib/elm_inwin.c              |   4 +-
 src/lib/elm_layout.c             |   6 +-
 src/lib/elm_list.c               |  16 ++-
 src/lib/elm_main.c               |  17 +++
 src/lib/elm_map.c                |   4 +-
 src/lib/elm_notify.c             |   4 +-
 src/lib/elm_object_item.h        |   2 +
 src/lib/elm_panel.c              |  10 +-
 src/lib/elm_panes.c              |  10 +-
 src/lib/elm_photocam.c           |   4 +-
 src/lib/elm_plug.c               |   4 +-
 src/lib/elm_prefs.c              |   6 +-
 src/lib/elm_scroller.c           |  21 ++--
 src/lib/elm_segment_control.c    |   4 +-
 src/lib/elm_slider.c             |   4 +-
 src/lib/elm_spinner.c            |   8 +-
 src/lib/elm_table.c              |   4 +-
 src/lib/elm_toolbar.c            |   8 +-
 src/lib/elm_web2.c               |   4 +-
 src/lib/elm_widget.c             | 230 +++++++++++++++++++++++++++++++++------
 src/lib/elm_widget.eo            |  41 ++++++-
 src/lib/elm_widget.h             |  15 ++-
 src/lib/elm_widget_item.eo       |  36 ++++++
 src/lib/elm_win.c                |  12 +-
 47 files changed, 567 insertions(+), 176 deletions(-)

diff --git a/src/lib/elc_ctxpopup.c b/src/lib/elc_ctxpopup.c
index 73954d4..f23f588 100644
--- a/src/lib/elc_ctxpopup.c
+++ b/src/lib/elc_ctxpopup.c
@@ -71,15 +71,15 @@ _elm_ctxpopup_elm_widget_focus_direction_manager_is(Eo *obj 
EINA_UNUSED, Elm_Ctx
 }
 
 EOLIAN static Eina_Bool
-_elm_ctxpopup_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_ctxpopup_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    if (!sd)
      return EINA_FALSE;
 
-   if (!elm_widget_focus_next_get(sd->box, dir, next))
+   if (!elm_widget_focus_next_get(sd->box, dir, next, next_item))
      {
         elm_widget_focused_object_clear(sd->box);
-        elm_widget_focus_next_get(sd->box, dir, next);
+        elm_widget_focus_next_get(sd->box, dir, next, next_item);
      }
 
    return EINA_TRUE;
diff --git a/src/lib/elc_fileselector.c b/src/lib/elc_fileselector.c
index 8dc2e03..74fee66 100644
--- a/src/lib/elc_fileselector.c
+++ b/src/lib/elc_fileselector.c
@@ -2412,7 +2412,7 @@ _elm_fileselector_elm_widget_focus_next_manager_is(Eo 
*obj EINA_UNUSED, Elm_File
 }
 
 EOLIAN static Eina_Bool
-_elm_fileselector_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Fileselector_Data *sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_fileselector_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Fileselector_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, 
Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
 
@@ -2425,9 +2425,9 @@ _elm_fileselector_elm_widget_focus_next(Eo *obj 
EINA_UNUSED, Elm_Fileselector_Da
    if (sd->ok_button) items = eina_list_append(items, sd->ok_button);  
 
    if (_elm_config->access_mode)
-     return elm_widget_focus_list_next_get(obj, items, eina_list_data_get, 
dir, next);
+     return elm_widget_focus_list_next_get(obj, items, eina_list_data_get, 
dir, next, next_item);
 
-   if (!elm_widget_focus_list_next_get(obj, items, eina_list_data_get, dir, 
next))
+   if (!elm_widget_focus_list_next_get(obj, items, eina_list_data_get, dir, 
next, next_item))
      *next = (Evas_Object *)obj;
 
    eina_list_free(items);
diff --git a/src/lib/elc_fileselector_entry.c b/src/lib/elc_fileselector_entry.c
index 40f94a3..ba06a6f 100644
--- a/src/lib/elc_fileselector_entry.c
+++ b/src/lib/elc_fileselector_entry.c
@@ -127,7 +127,7 @@ 
_elm_fileselector_entry_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSE
 }
 
 EOLIAN static Eina_Bool
-_elm_fileselector_entry_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Fileselector_Entry_Data *sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_fileselector_entry_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Fileselector_Entry_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, 
Elm_Object_Item **next_item)
 {
    Evas_Object *chain[2];
    Evas_Object *to_focus;
@@ -149,11 +149,11 @@ _elm_fileselector_entry_elm_widget_focus_next(Eo *obj 
EINA_UNUSED, Elm_Fileselec
 
    i = elm_widget_focus_get(chain[1]);
 
-   if (elm_widget_focus_next_get(chain[i], dir, next)) return EINA_TRUE;
+   if (elm_widget_focus_next_get(chain[i], dir, next, next_item)) return 
EINA_TRUE;
 
    i = !i;
 
-   if (elm_widget_focus_next_get(chain[i], dir, &to_focus))
+   if (elm_widget_focus_next_get(chain[i], dir, &to_focus, next_item))
      {
         *next = to_focus;
         return !!i;
diff --git a/src/lib/elc_multibuttonentry.c b/src/lib/elc_multibuttonentry.c
index 98e1b53..e9c44e5 100644
--- a/src/lib/elc_multibuttonentry.c
+++ b/src/lib/elc_multibuttonentry.c
@@ -321,7 +321,7 @@ _view_update(Elm_Multibuttonentry_Data *sd)
 }
 
 EOLIAN static Eina_Bool
-_elm_multibuttonentry_elm_widget_on_focus(Eo *obj, Elm_Multibuttonentry_Data 
*sd)
+_elm_multibuttonentry_elm_widget_on_focus(Eo *obj, Elm_Multibuttonentry_Data 
*sd, Elm_Object_Item *item EINA_UNUSED)
 {
    if (elm_widget_focus_get(obj))
      {
@@ -1606,7 +1606,7 @@ _elm_multibuttonentry_elm_widget_focus_next_manager_is(Eo 
*obj EINA_UNUSED, Elm_
 }
 
 EOLIAN static Eina_Bool
-_elm_multibuttonentry_elm_widget_focus_next(Eo *obj, Elm_Multibuttonentry_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_multibuttonentry_elm_widget_focus_next(Eo *obj, Elm_Multibuttonentry_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_Bool int_ret = EINA_FALSE;
 
@@ -1651,7 +1651,7 @@ _elm_multibuttonentry_elm_widget_focus_next(Eo *obj, 
Elm_Multibuttonentry_Data *
 
    if (int_ret)
      return elm_widget_focus_list_next_get
-              (obj, items, eina_list_data_get, dir, next);
+              (obj, items, eina_list_data_get, dir, next, next_item);
 
    return EINA_FALSE;
 }
diff --git a/src/lib/elc_naviframe.c b/src/lib/elc_naviframe.c
index b11eda3..f1830ab 100644
--- a/src/lib/elc_naviframe.c
+++ b/src/lib/elc_naviframe.c
@@ -1306,7 +1306,7 @@ _on_obj_size_hints_changed(void *data EINA_UNUSED, Evas 
*e EINA_UNUSED,
 }
 
 EOLIAN static Eina_Bool
-_elm_naviframe_elm_widget_focus_next(Eo *obj, Elm_Naviframe_Data *sd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_naviframe_elm_widget_focus_next(Eo *obj, Elm_Naviframe_Data *sd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item 
**next_item)
 {
    Evas_Object *ao;
 
@@ -1331,7 +1331,7 @@ _elm_naviframe_elm_widget_focus_next(Eo *obj, 
Elm_Naviframe_Data *sd EINA_UNUSED
         if (ao) l = eina_list_append(l, ao);
      }
 
-   int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next);
+   int_ret = elm_widget_focus_list_next_get(obj, l, list_data_get, dir, next, 
next_item);
    eina_list_free(l);
 
 end:
diff --git a/src/lib/elc_popup.c b/src/lib/elc_popup.c
index 7e56946..73a1302 100644
--- a/src/lib/elc_popup.c
+++ b/src/lib/elc_popup.c
@@ -1347,7 +1347,7 @@ _elm_popup_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Popup_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_popup_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_popup_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *ao;
    Eina_List *items = NULL;
@@ -1370,7 +1370,7 @@ _elm_popup_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Popup_Data *sd, Elm_Fo
 
    items = eina_list_merge(items, base_items);
 
-   if (!elm_widget_focus_list_next_get(sd->main_layout, items, 
eina_list_data_get, dir, next))
+   if (!elm_widget_focus_list_next_get(sd->main_layout, items, 
eina_list_data_get, dir, next, next_item))
      *next = sd->main_layout;
    eina_list_free(items);
 
diff --git a/src/lib/elm_access.c b/src/lib/elm_access.c
index f8df21f..47f87b6 100644
--- a/src/lib/elm_access.c
+++ b/src/lib/elm_access.c
@@ -135,7 +135,7 @@ _elm_access_elm_widget_activate(Eo *obj, void *_pd 
EINA_UNUSED, Elm_Activate act
 }
 
 EOLIAN static Eina_Bool
-_elm_access_elm_widget_on_focus(Eo *obj, void *_pd EINA_UNUSED)
+_elm_access_elm_widget_on_focus(Eo *obj, void *_pd EINA_UNUSED, 
Elm_Object_Item *item EINA_UNUSED)
 {
    evas_object_focus_set(obj, elm_widget_focus_get(obj));
 
@@ -522,7 +522,7 @@ _access_highlight_next_get(Evas_Object *obj, 
Elm_Focus_Direction dir)
           }
         else
           {
-             ret = elm_widget_focus_next_get(obj, dir, &target);
+             ret = elm_widget_focus_next_get(obj, dir, &target, NULL);
              if (ret && target)
                _elm_access_highlight_set(target);
           }
diff --git a/src/lib/elm_box.c b/src/lib/elm_box.c
index f89989f..2adc121 100644
--- a/src/lib/elm_box.c
+++ b/src/lib/elm_box.c
@@ -57,7 +57,7 @@ _elm_box_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Box_Data *_pd
 }
 
 EOLIAN static Eina_Bool
-_elm_box_elm_widget_focus_next(Eo *obj, Elm_Box_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_box_elm_widget_focus_next(Eo *obj, Elm_Box_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    const Eina_List *items;
    void *(*list_data_get)(const Eina_List *list);
@@ -78,7 +78,7 @@ _elm_box_elm_widget_focus_next(Eo *obj, Elm_Box_Data *_pd 
EINA_UNUSED, Elm_Focus
         if (!items) return EINA_FALSE;
      }
 
-   return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
+   return elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next, 
next_item);
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elm_bubble.c b/src/lib/elm_bubble.c
index cec3cc7..9fdc9f8 100644
--- a/src/lib/elm_bubble.c
+++ b/src/lib/elm_bubble.c
@@ -76,7 +76,7 @@ _on_mouse_up(void *data,
 /* overriding layout's focus_next() in order to just cycle through the
  * content's tree */
 EOLIAN static Eina_Bool
-_elm_bubble_elm_widget_focus_next(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_bubble_elm_widget_focus_next(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *content;
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
@@ -93,7 +93,7 @@ _elm_bubble_elm_widget_focus_next(Eo *obj, Elm_Bubble_Data 
*_pd EINA_UNUSED, Elm
         if (!content) return EINA_FALSE;
 
         /* attempt to follow focus cycle into sub-object */
-        return elm_widget_focus_next_get(content, dir, next);
+        return elm_widget_focus_next_get(content, dir, next, next_item);
      }
 }
 
diff --git a/src/lib/elm_calendar.c b/src/lib/elm_calendar.c
index 4ecfb49..1749152 100644
--- a/src/lib/elm_calendar.c
+++ b/src/lib/elm_calendar.c
@@ -1156,7 +1156,7 @@ _elm_calendar_elm_widget_focus_direction_manager_is(Eo 
*obj EINA_UNUSED, Elm_Cal
 }
 
 EOLIAN static Eina_Bool
-_elm_calendar_elm_widget_focus_next(Eo *obj, Elm_Calendar_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_calendar_elm_widget_focus_next(Eo *obj, Elm_Calendar_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    int maxdays, day, i;
    Eina_List *items = NULL;
@@ -1189,7 +1189,7 @@ _elm_calendar_elm_widget_focus_next(Eo *obj, 
Elm_Calendar_Data *sd, Elm_Focus_Di
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_clock.c b/src/lib/elm_clock.c
index b7a7139..31f84f9 100644
--- a/src/lib/elm_clock.c
+++ b/src/lib/elm_clock.c
@@ -708,7 +708,7 @@ _elm_clock_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Clock_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_clock_elm_widget_focus_next(Eo *obj, Elm_Clock_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_clock_elm_widget_focus_next(Eo *obj, Elm_Clock_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *ao, *po;
    Eina_List *items = NULL;
@@ -757,7 +757,7 @@ _elm_clock_elm_widget_focus_next(Eo *obj, Elm_Clock_Data 
*sd, Elm_Focus_Directio
      }
 
    return elm_widget_focus_list_next_get
-           (obj, items, eina_list_data_get, dir, next);
+           (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_colorselector.c b/src/lib/elm_colorselector.c
index ee9a96f..f0d230b 100644
--- a/src/lib/elm_colorselector.c
+++ b/src/lib/elm_colorselector.c
@@ -1952,7 +1952,7 @@ _elm_colorselector_elm_widget_focus_next_manager_is(Eo 
*obj EINA_UNUSED, Elm_Col
 }
 
 EOLIAN static Eina_Bool
-_elm_colorselector_elm_widget_focus_next(Eo *obj, Elm_Colorselector_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_colorselector_elm_widget_focus_next(Eo *obj, Elm_Colorselector_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Eina_List *l;
@@ -1985,7 +1985,7 @@ _elm_colorselector_elm_widget_focus_next(Eo *obj, 
Elm_Colorselector_Data *sd, El
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_datetime.c b/src/lib/elm_datetime.c
index ed313a8..ccd14f3 100644
--- a/src/lib/elm_datetime.c
+++ b/src/lib/elm_datetime.c
@@ -429,7 +429,7 @@ _elm_datetime_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Datetime
 }
 
 EOLIAN static Eina_Bool
-_elm_datetime_elm_widget_focus_next(Eo *obj, Elm_Datetime_Data *_pd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_datetime_elm_widget_focus_next(Eo *obj, Elm_Datetime_Data *_pd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item 
**next_item)
 {
    const Eina_List *items;
    Eina_List *(*list_free)(Eina_List *list);
@@ -450,18 +450,18 @@ _elm_datetime_elm_widget_focus_next(Eo *obj, 
Elm_Datetime_Data *_pd EINA_UNUSED,
         if (!items) return EINA_FALSE;
      }
 
-   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next);
+   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next, next_item);
    if (list_free) list_free((Eina_List *)items);
 
    return int_ret;
 }
 
 EOLIAN static Eina_Bool
-_elm_datetime_elm_widget_on_focus(Eo *obj, Elm_Datetime_Data *sd)
+_elm_datetime_elm_widget_on_focus(Eo *obj, Elm_Datetime_Data *sd, 
Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (!elm_widget_focus_get(obj))
diff --git a/src/lib/elm_diskselector.c b/src/lib/elm_diskselector.c
index 54fe8c5..34cc99b 100644
--- a/src/lib/elm_diskselector.c
+++ b/src/lib/elm_diskselector.c
@@ -896,12 +896,12 @@ _elm_diskselector_elm_widget_sub_object_del(Eo *obj, 
Elm_Diskselector_Data *sd,
 }
 
 EOLIAN static Eina_Bool
-_elm_diskselector_elm_widget_on_focus(Eo *obj, Elm_Diskselector_Data *_pd 
EINA_UNUSED)
+_elm_diskselector_elm_widget_on_focus(Eo *obj, Elm_Diskselector_Data *_pd 
EINA_UNUSED, Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj))
@@ -929,7 +929,7 @@ _elm_diskselector_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Disk
 }
 
 EOLIAN static Eina_Bool
-_elm_diskselector_elm_widget_focus_next(Eo *obj, Elm_Diskselector_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_diskselector_elm_widget_focus_next(Eo *obj, Elm_Diskselector_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Eina_List *elist = NULL;
@@ -941,15 +941,15 @@ _elm_diskselector_elm_widget_focus_next(Eo *obj, 
Elm_Diskselector_Data *sd, Elm_
    if (!sd->round)
      {
         return elm_widget_focus_list_next_get
-              (obj, items, eina_list_data_get, dir, next);
+              (obj, items, eina_list_data_get, dir, next, next_item);
      }
 
    if (!elm_widget_focus_list_next_get
-          (obj, items, eina_list_data_get, dir, next))
+          (obj, items, eina_list_data_get, dir, next, next_item))
      {
         elm_widget_focused_object_clear((Evas_Object *)obj);
         elm_widget_focus_list_next_get
-          (obj, items, eina_list_data_get, dir, next);
+          (obj, items, eina_list_data_get, dir, next, next_item);
      }
    return EINA_TRUE;
 }
diff --git a/src/lib/elm_entry.c b/src/lib/elm_entry.c
index 0ba453b..6243501 100644
--- a/src/lib/elm_entry.c
+++ b/src/lib/elm_entry.c
@@ -1134,7 +1134,7 @@ _return_key_enabled_check(Evas_Object *obj)
 }
 
 EOLIAN static Eina_Bool
-_elm_entry_elm_widget_on_focus(Eo *obj, Elm_Entry_Data *sd)
+_elm_entry_elm_widget_on_focus(Eo *obj, Elm_Entry_Data *sd, Elm_Object_Item 
*item EINA_UNUSED)
 {
    Evas_Object *top;
    Eina_Bool top_is_win = EINA_FALSE;
diff --git a/src/lib/elm_flip.c b/src/lib/elm_flip.c
index 8608817..eab8b1e 100644
--- a/src/lib/elm_flip.c
+++ b/src/lib/elm_flip.c
@@ -112,14 +112,14 @@ _elm_flip_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Flip_Data *_
 }
 
 EOLIAN static Eina_Bool
-_elm_flip_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Flip_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_flip_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Flip_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
 
    /* attempt to cycle focus on in sub-items */
    if (sd->state)
-     return elm_widget_focus_next_get(sd->front.content, dir, next);
+     return elm_widget_focus_next_get(sd->front.content, dir, next, next_item);
    else
-     return elm_widget_focus_next_get(sd->back.content, dir, next);
+     return elm_widget_focus_next_get(sd->back.content, dir, next, next_item);
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elm_focus.h b/src/lib/elm_focus.h
index 5bb4f89..6f076ba 100644
--- a/src/lib/elm_focus.h
+++ b/src/lib/elm_focus.h
@@ -38,7 +38,7 @@
  *
  * @ingroup Focus
  */
-typedef enum
+typedef enum _Elm_Focus_Direction
 {
    ELM_FOCUS_PREVIOUS, /**< previous direction */
    ELM_FOCUS_NEXT,     /**< next direction */
@@ -48,7 +48,7 @@ typedef enum
    ELM_FOCUS_LEFT,      /**< left direction */
    ELM_FOCUS_MOUSE,      /**< direction is from mouse */
    ELM_FOCUS_REVERT      /**< direction is from focus revert */
-} Elm_Focus_Direction;
+} Elm_Focus_Dicretion;
 
 /**
  * Focus region show mode.
@@ -249,6 +249,47 @@ EAPI Evas_Object *        
elm_object_focus_next_object_get(const Evas_Object *ob
 EAPI void                 elm_object_focus_next_object_set(Evas_Object *obj, 
Evas_Object *next, Elm_Focus_Direction dir);
 
 /**
+ * Get next object item which was set with specific focus direction.
+ *
+ * Get next object item which was set by elm_object_focus_next_item_set
+ * with specific focus direction.
+ *
+ * @param obj The Elementary object
+ * @param dir Focus direction
+ * @return Focus next object item or @c NULL, if there is no focus next
+ * object item.
+ *
+ * @see elm_object_focus_next_item_set(), elm_object_focus_next()
+ *
+ * @since 1.16
+ *
+ * @ingroup Focus
+ */
+EAPI Elm_Object_Item *    elm_object_focus_next_item_get(const Evas_Object 
*obj, Elm_Focus_Direction dir);
+
+/**
+ * Set next object item with specific focus direction.
+ *
+ * When focus next object item is set with specific focus direction,
+ * this object item will be the first candidate when finding
+ * next focusable object or item.
+ * If the focus next object item is set, it is preference to focus next object.
+ * Focus next object item can be registered with six directions that are
+ * previous, next, up, down, right, and left.
+ *
+ * @param obj The Elementary object
+ * @param next_item Focus next object item
+ * @param dir Focus direction
+ *
+ * @see elm_object_focus_next_item_get(), elm_object_focus_next()
+ *
+ * @since 1.16
+ *
+ * @ingroup Focus
+ */
+EAPI void                 elm_object_focus_next_item_set(Evas_Object *obj, 
Elm_Object_Item *next_item, Elm_Focus_Direction dir);
+
+/**
  * Get focused object in object tree.
  *
  * This function returns current focused object in one object sub-tree.
diff --git a/src/lib/elm_frame.c b/src/lib/elm_frame.c
index d5ebc1f..674653b 100644
--- a/src/lib/elm_frame.c
+++ b/src/lib/elm_frame.c
@@ -58,7 +58,7 @@ _elm_frame_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Frame_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_frame_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Frame_Data *_pd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_frame_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Frame_Data *_pd 
EINA_UNUSED, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item 
**next_item)
 {
    Evas_Object *content;
 
@@ -69,7 +69,7 @@ _elm_frame_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Frame_Data *_pd EINA_U
    else
      {
         /* attempt to follow focus cycle into sub-object */
-        return elm_widget_focus_next_get(content, dir, next);
+        return elm_widget_focus_next_get(content, dir, next, next_item);
      }
 }
 
diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c
index d351b53..d6786f1 100644
--- a/src/lib/elm_gengrid.c
+++ b/src/lib/elm_gengrid.c
@@ -3078,6 +3078,25 @@ _key_action_move(Evas_Object *obj, const char *params)
 
              return EINA_TRUE;
           }
+        else
+          {
+             Evas_Object *next = NULL;
+             Elm_Object_Item *next_item = NULL;
+             next_item = elm_object_item_focus_next_item_get(sd->focused_item,
+                                                             ELM_FOCUS_LEFT);
+             if (next_item)
+               {
+                  elm_object_item_focus_set(next_item, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+             next = elm_object_item_focus_next_object_get(sd->focused_item,
+                                                          ELM_FOCUS_LEFT);
+             if (next)
+               {
+                  elm_object_focus_set(next, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+          }
         if (sd->horizontal)
           {
              if (_elm_gengrid_item_edge_check(sd->focused_item, 
ELM_FOCUS_LEFT))
@@ -3157,6 +3176,25 @@ _key_action_move(Evas_Object *obj, const char *params)
 
              return EINA_TRUE;
           }
+        else
+          {
+             Evas_Object *next = NULL;
+             Elm_Object_Item *next_item = NULL;
+             next_item = elm_object_item_focus_next_item_get(sd->focused_item,
+                                                             ELM_FOCUS_RIGHT);
+             if (next_item)
+               {
+                  elm_object_item_focus_set(next_item, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+             next = elm_object_item_focus_next_object_get(sd->focused_item,
+                                                          ELM_FOCUS_RIGHT);
+             if (next)
+               {
+                  elm_object_focus_set(next, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+          }
         if (sd->horizontal)
           {
              if (sd->focused_item && 
_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_RIGHT))
@@ -3230,6 +3268,25 @@ _key_action_move(Evas_Object *obj, const char *params)
 
              return EINA_TRUE;
           }
+        else
+          {
+             Evas_Object *next = NULL;
+             Elm_Object_Item *next_item = NULL;
+             next_item = elm_object_item_focus_next_item_get(sd->focused_item,
+                                                             ELM_FOCUS_UP);
+             if (next_item)
+               {
+                  elm_object_item_focus_set(next_item, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+             next = elm_object_item_focus_next_object_get(sd->focused_item,
+                                                          ELM_FOCUS_UP);
+             if (next)
+               {
+                  elm_object_focus_set(next, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+          }
         if (sd->horizontal)
           {
              if (sd->focused_item && 
_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_UP))
@@ -3287,6 +3344,25 @@ _key_action_move(Evas_Object *obj, const char *params)
 
              return EINA_TRUE;
           }
+        else
+          {
+             Evas_Object *next = NULL;
+             Elm_Object_Item *next_item = NULL;
+             next_item = elm_object_item_focus_next_item_get(sd->focused_item,
+                                                             ELM_FOCUS_DOWN);
+             if (next_item)
+               {
+                  elm_object_item_focus_set(next_item, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+             next = elm_object_item_focus_next_object_get(sd->focused_item,
+                                                          ELM_FOCUS_DOWN);
+             if (next)
+               {
+                  elm_object_focus_set(next, EINA_TRUE);
+                  return EINA_TRUE;
+               }
+          }
         if (sd->horizontal)
           {
              if (sd->focused_item && 
_elm_gengrid_item_edge_check(sd->focused_item, ELM_FOCUS_DOWN))
@@ -3561,14 +3637,14 @@ _elm_gengrid_direction_item_get(Evas_Object *obj, 
Elm_Focus_Direction dir)
 }
 
 EOLIAN static Eina_Bool
-_elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd)
+_elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd, 
Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
    Elm_Object_Item *eo_it = NULL;
    Eina_Bool is_sel = EINA_FALSE;
    Elm_Focus_Direction focus_origin;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj) && (sd->selected) &&
@@ -3580,17 +3656,21 @@ _elm_gengrid_elm_widget_on_focus(Eo *obj, 
Elm_Gengrid_Data *sd)
 
    if (elm_widget_focus_get(obj) && !sd->mouse_down)
      {
-        focus_origin = elm_widget_focus_origin_get(obj);
-        if (focus_origin >= ELM_FOCUS_UP && focus_origin <= ELM_FOCUS_LEFT)
-          eo_it = _elm_gengrid_direction_item_get(obj, focus_origin);
-        else if (sd->last_focused_item)
-          eo_it = sd->last_focused_item;
-        else if (sd->last_selected_item)
-          eo_it = sd->last_selected_item;
-        else if (_elm_config->first_item_focus_on_first_focus_in)
+        if (item) eo_it = item;
+        else
           {
-             eo_it = elm_gengrid_first_item_get(obj);
-             is_sel = EINA_TRUE;
+             focus_origin = elm_widget_focus_origin_get(obj);
+             if (focus_origin >= ELM_FOCUS_UP && focus_origin <= 
ELM_FOCUS_LEFT)
+               eo_it = _elm_gengrid_direction_item_get(obj, focus_origin);
+             else if (sd->last_focused_item)
+               eo_it = sd->last_focused_item;
+             else if (sd->last_selected_item)
+               eo_it = sd->last_selected_item;
+             else if (_elm_config->first_item_focus_on_first_focus_in)
+               {
+                  eo_it = elm_gengrid_first_item_get(obj);
+                  is_sel = EINA_TRUE;
+               }
           }
         if (eo_it)
           {
@@ -3651,7 +3731,7 @@ _elm_gengrid_elm_widget_focus_direction_manager_is(Eo 
*obj EINA_UNUSED, Elm_Geng
 }
 
 EOLIAN static Eina_Bool
-_elm_gengrid_elm_widget_focus_next(Eo *obj, Elm_Gengrid_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_gengrid_elm_widget_focus_next(Eo *obj, Elm_Gengrid_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Elm_Gen_Item *it;
@@ -3663,7 +3743,7 @@ _elm_gengrid_elm_widget_focus_next(Eo *obj, 
Elm_Gengrid_Data *sd, Elm_Focus_Dire
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c
index a839fc1..6ebba7f 100644
--- a/src/lib/elm_genlist.c
+++ b/src/lib/elm_genlist.c
@@ -2770,9 +2770,13 @@ _elm_genlist_item_content_focus_set(Elm_Gen_Item *it, 
Elm_Focus_Direction dir)
    if (focused_obj && (dir != ELM_FOCUS_PREVIOUS))
      {
         Evas_Object *nextfocus;
-        if (elm_widget_focus_next_get(focused_obj, dir, &nextfocus))
+        Elm_Object_Item *nextfocus_item;
+        if (elm_widget_focus_next_get(focused_obj, dir, &nextfocus, 
&nextfocus_item))
           {
-             elm_object_focus_set(nextfocus, EINA_TRUE);
+             if (nextfocus_item)
+               elm_object_item_focus_set(nextfocus_item, EINA_TRUE);
+             else
+               elm_object_focus_set(nextfocus, EINA_TRUE);
              return;
           }
      }
@@ -3179,13 +3183,13 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, 
Elm_Object_Item *eo_it)
 }
 
 EOLIAN static Eina_Bool
-_elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd)
+_elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd, 
Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
    Elm_Object_Item *eo_it = NULL;
    Eina_Bool is_sel = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj) && (sd->items) && (sd->selected) &&
@@ -3254,7 +3258,7 @@ _elm_genlist_elm_widget_focus_direction_manager_is(Eo 
*obj EINA_UNUSED, Elm_Genl
 }
 
 EOLIAN static Eina_Bool
-_elm_genlist_elm_widget_focus_next(Eo *obj, Elm_Genlist_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_genlist_elm_widget_focus_next(Eo *obj, Elm_Genlist_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Coord x, y, w, h;
    Evas_Coord sx, sy, sw, sh;
@@ -3297,7 +3301,7 @@ _elm_genlist_elm_widget_focus_next(Eo *obj, 
Elm_Genlist_Data *sd, Elm_Focus_Dire
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_glview.c b/src/lib/elm_glview.c
index 2bc87f1..51af23b 100644
--- a/src/lib/elm_glview.c
+++ b/src/lib/elm_glview.c
@@ -28,12 +28,12 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = 
{
 };
 
 EOLIAN static Eina_Bool
-_elm_glview_elm_widget_on_focus(Eo *obj, Elm_Glview_Data *_pd EINA_UNUSED)
+_elm_glview_elm_widget_on_focus(Eo *obj, Elm_Glview_Data *_pd EINA_UNUSED, 
Elm_Object_Item *item EINA_UNUSED)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj))
diff --git a/src/lib/elm_grid.c b/src/lib/elm_grid.c
index ba712f6..95edb60 100644
--- a/src/lib/elm_grid.c
+++ b/src/lib/elm_grid.c
@@ -20,7 +20,7 @@ _elm_grid_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, void *_pd EINA_U
 }
 
 EOLIAN static Eina_Bool
-_elm_grid_elm_widget_focus_next(Eo *obj, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_grid_elm_widget_focus_next(Eo *obj, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    const Eina_List *items;
    Eina_List *(*list_free)(Eina_List *list);
@@ -46,7 +46,7 @@ _elm_grid_elm_widget_focus_next(Eo *obj, void *_pd 
EINA_UNUSED, Elm_Focus_Direct
         if (!items) return EINA_FALSE;
      }
 
-   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next);
+   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next, next_item);
 
    if (list_free) list_free((Eina_List *)items);
 
diff --git a/src/lib/elm_index.c b/src/lib/elm_index.c
index ed736bd..0b574a6 100644
--- a/src/lib/elm_index.c
+++ b/src/lib/elm_index.c
@@ -1126,7 +1126,7 @@ _elm_index_elm_widget_focus_direction_manager_is(Eo *obj 
EINA_UNUSED, Elm_Index_
 }
 
 EOLIAN static Eina_Bool
-_elm_index_elm_widget_focus_next(Eo *obj, Elm_Index_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_index_elm_widget_focus_next(Eo *obj, Elm_Index_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_Bool int_ret = EINA_FALSE;
 
@@ -1152,7 +1152,7 @@ _elm_index_elm_widget_focus_next(Eo *obj, Elm_Index_Data 
*sd, Elm_Focus_Directio
      }
 
    int_ret = elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 
    // to hide index item, if there is nothing to focus on autohide disable mode
    if ((!sd->autohide_disabled) && (!int_ret))
diff --git a/src/lib/elm_inwin.c b/src/lib/elm_inwin.c
index 69c0f05..febe1a6 100644
--- a/src/lib/elm_inwin.c
+++ b/src/lib/elm_inwin.c
@@ -46,7 +46,7 @@ _elm_inwin_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, void *_pd EINA_
 }
 
 EOLIAN static Eina_Bool
-_elm_inwin_elm_widget_focus_next(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_inwin_elm_widget_focus_next(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *content;
 
@@ -55,7 +55,7 @@ _elm_inwin_elm_widget_focus_next(Eo *obj EINA_UNUSED, void 
*_pd EINA_UNUSED, Elm
    /* attempt to follow focus cycle into sub-object */
    if (content)
      {
-        elm_widget_focus_next_get(content, dir, next);
+        elm_widget_focus_next_get(content, dir, next, next_item);
         if (*next) return EINA_TRUE;
      }
 
diff --git a/src/lib/elm_layout.c b/src/lib/elm_layout.c
index 250ef4e..6576964 100644
--- a/src/lib/elm_layout.c
+++ b/src/lib/elm_layout.c
@@ -399,7 +399,7 @@ _elm_layout_list_data_get(const Eina_List *list)
 }
 
 EOLIAN static Eina_Bool
-_elm_layout_elm_widget_on_focus(Eo *obj, Elm_Layout_Smart_Data *_pd 
EINA_UNUSED)
+_elm_layout_elm_widget_on_focus(Eo *obj, Elm_Layout_Smart_Data *_pd 
EINA_UNUSED, Elm_Object_Item *item EINA_UNUSED)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
@@ -472,7 +472,7 @@ _access_focus_list_sort(Eina_List *origin)
  * child objects, but still inheriting from elm_layout, just set its
  * focus_next smart function back to NULL */
 EOLIAN static Eina_Bool
-_elm_layout_elm_widget_focus_next(Eo *obj, Elm_Layout_Smart_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_layout_elm_widget_focus_next(Eo *obj, Elm_Layout_Smart_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    const Eina_List *items;
    void *(*list_data_get)(const Eina_List *list);
@@ -491,7 +491,7 @@ _elm_layout_elm_widget_focus_next(Eo *obj, 
Elm_Layout_Smart_Data *sd, Elm_Focus_
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, list_data_get, dir, next);
+            (obj, items, list_data_get, dir, next, next_item);
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elm_list.c b/src/lib/elm_list.c
index 498a79e..7086486 100644
--- a/src/lib/elm_list.c
+++ b/src/lib/elm_list.c
@@ -289,9 +289,13 @@ _elm_list_item_content_focus_set(Elm_List_Item_Data *it, 
Elm_Focus_Direction dir
    if (dir != ELM_FOCUS_PREVIOUS)
      {
         Evas_Object *nextfocus;
-        if (elm_widget_focus_next_get(focused, dir, &nextfocus))
+        Elm_Object_Item *nextfocus_item;
+        if (elm_widget_focus_next_get(focused, dir, &nextfocus, 
&nextfocus_item))
           {
-             elm_object_focus_set(nextfocus, EINA_TRUE);
+             if (nextfocus_item)
+               elm_object_item_focus_set(nextfocus_item, EINA_TRUE);
+             else
+               elm_object_focus_set(nextfocus, EINA_TRUE);
              return EINA_TRUE;
           }
 
@@ -1257,13 +1261,13 @@ _elm_list_nearest_visible_item_get(Evas_Object *obj, 
Elm_List_Item_Data *it)
 }
 
 EOLIAN static Eina_Bool
-_elm_list_elm_widget_on_focus(Eo *obj, Elm_List_Data *sd)
+_elm_list_elm_widget_on_focus(Eo *obj, Elm_List_Data *sd, Elm_Object_Item 
*item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
    Elm_Object_Item *eo_it = NULL;
    Eina_Bool is_sel = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj) && sd->selected && !sd->last_selected_item)
@@ -2369,7 +2373,7 @@ _elm_list_elm_widget_focus_direction_manager_is(Eo *obj 
EINA_UNUSED, Elm_List_Da
 }
 
 EOLIAN static Eina_Bool
-_elm_list_elm_widget_focus_next(Eo *obj, Elm_List_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_list_elm_widget_focus_next(Eo *obj, Elm_List_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Eina_List *elist = NULL;
@@ -2386,7 +2390,7 @@ _elm_list_elm_widget_focus_next(Eo *obj, Elm_List_Data 
*sd, Elm_Focus_Direction
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 EOLIAN static void
diff --git a/src/lib/elm_main.c b/src/lib/elm_main.c
index dcd22b4..d436274 100644
--- a/src/lib/elm_main.c
+++ b/src/lib/elm_main.c
@@ -1463,6 +1463,23 @@ elm_object_focus_next_object_set(Evas_Object        *obj,
    elm_widget_focus_next_object_set(obj, next, dir);
 }
 
+EAPI Elm_Object_Item *
+elm_object_focus_next_item_get(const Evas_Object  *obj,
+                               Elm_Focus_Direction dir)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
+   return elm_widget_focus_next_item_get(obj, dir);
+}
+
+EAPI void
+elm_object_focus_next_item_set(Evas_Object     *obj,
+                               Elm_Object_Item *next_item,
+                               Elm_Focus_Direction dir)
+{
+   EINA_SAFETY_ON_NULL_RETURN(obj);
+   elm_widget_focus_next_item_set(obj, next_item, dir);
+}
+
 EAPI Evas_Object *
 elm_object_focused_object_get(const Evas_Object *obj)
 {
diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c
index 1017270..064652a 100644
--- a/src/lib/elm_map.c
+++ b/src/lib/elm_map.c
@@ -3865,12 +3865,12 @@ _elm_map_pan_evas_object_smart_move(Eo *obj, 
Elm_Map_Pan_Data *_pd EINA_UNUSED,
 }
 
 EOLIAN static Eina_Bool
-_elm_map_elm_widget_on_focus(Eo *obj, Elm_Map_Data *_pd EINA_UNUSED)
+_elm_map_elm_widget_on_focus(Eo *obj, Elm_Map_Data *_pd EINA_UNUSED, 
Elm_Object_Item *item EINA_UNUSED)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj))
diff --git a/src/lib/elm_notify.c b/src/lib/elm_notify.c
index 6fd4166..19f06de 100644
--- a/src/lib/elm_notify.c
+++ b/src/lib/elm_notify.c
@@ -352,7 +352,7 @@ _elm_notify_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Notify_Dat
 }
 
 EOLIAN static Eina_Bool
-_elm_notify_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_notify_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *cur;
 
@@ -361,7 +361,7 @@ _elm_notify_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Notify_Data *sd, Elm_
    cur = sd->content;
 
    /* Try to cycle focus on content */
-   return elm_widget_focus_next_get(cur, dir, next);
+   return elm_widget_focus_next_get(cur, dir, next, next_item);
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elm_object_item.h b/src/lib/elm_object_item.h
index db19862..db788f6 100644
--- a/src/lib/elm_object_item.h
+++ b/src/lib/elm_object_item.h
@@ -5,6 +5,8 @@
  */
 typedef Eo Elm_Object_Item;
 
+typedef enum _Elm_Focus_Direction Elm_Focus_Direction;
+
 /**
  * @typedef Elm_Object_Item_Signal_Cb
  *
diff --git a/src/lib/elm_panel.c b/src/lib/elm_panel.c
index 67ef1f0..bea0c3f 100644
--- a/src/lib/elm_panel.c
+++ b/src/lib/elm_panel.c
@@ -262,7 +262,7 @@ _elm_panel_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Panel_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_panel_elm_widget_focus_next(Eo *obj, Elm_Panel_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_panel_elm_widget_focus_next(Eo *obj, Elm_Panel_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *cur;
    Eina_List *items = NULL;
@@ -283,19 +283,19 @@ _elm_panel_elm_widget_focus_next(Eo *obj, Elm_Panel_Data 
*sd, Elm_Focus_Directio
              items = eina_list_append(items, sd->content);
 
              ret = elm_widget_focus_list_next_get
-                (obj, items, eina_list_data_get, dir, next);
+                (obj, items, eina_list_data_get, dir, next, next_item);
              eina_list_free(items);
 
              return ret;
           }
 
-        return elm_widget_focus_next_get(sd->content, dir, next);
+        return elm_widget_focus_next_get(sd->content, dir, next, next_item);
      }
 
    cur = sd->content;
 
    /* Try to Focus cycle in subitem */
-   if (!sd->hidden) return elm_widget_focus_next_get(cur, dir, next);
+   if (!sd->hidden) return elm_widget_focus_next_get(cur, dir, next, 
next_item);
 
    /* access */
    if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
@@ -488,7 +488,7 @@ _panel_toggle(void *data EINA_UNUSED,
              if (sd->content && elm_widget_focus_get(sd->content))
                {
                   elm_widget_focused_object_clear(obj);
-                  elm_widget_focus_steal(obj);
+                  elm_widget_focus_steal(obj, NULL);
                }
           }
 
diff --git a/src/lib/elm_panes.c b/src/lib/elm_panes.c
index 335fe95..87dd4a7 100644
--- a/src/lib/elm_panes.c
+++ b/src/lib/elm_panes.c
@@ -82,13 +82,14 @@ _elm_panes_elm_widget_theme_apply(Eo *obj, Elm_Panes_Data 
*sd)
 }
 
 EOLIAN static Eina_Bool
-_elm_panes_elm_widget_focus_next(Eo *obj, Elm_Panes_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_panes_elm_widget_focus_next(Eo *obj, Elm_Panes_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    double w, h;
    unsigned char i;
    Evas_Object *to_focus;
    Evas_Object *chain[2];
    Evas_Object *left, *right;
+   Elm_Object_Item *to_focus_item;
 
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
@@ -100,7 +101,7 @@ _elm_panes_elm_widget_focus_next(Eo *obj, Elm_Panes_Data 
*sd, Elm_Focus_Directio
 
    if (((sd->horizontal) && (h == 0.0)) || ((!sd->horizontal) && (w == 0.0)))
      {
-       return elm_widget_focus_next_get(right, dir, next);
+       return elm_widget_focus_next_get(right, dir, next, next_item);
      }
 
    /* Direction */
@@ -118,13 +119,14 @@ _elm_panes_elm_widget_focus_next(Eo *obj, Elm_Panes_Data 
*sd, Elm_Focus_Directio
 
    i = elm_widget_focus_get(chain[1]);
 
-   if (elm_widget_focus_next_get(chain[i], dir, next)) return EINA_TRUE;
+   if (elm_widget_focus_next_get(chain[i], dir, next, next_item)) return 
EINA_TRUE;
 
    i = !i;
 
-   if (elm_widget_focus_next_get(chain[i], dir, &to_focus))
+   if (elm_widget_focus_next_get(chain[i], dir, &to_focus, &to_focus_item))
      {
         *next = to_focus;
+        *next_item = to_focus_item;
         return !!i;
      }
 
diff --git a/src/lib/elm_photocam.c b/src/lib/elm_photocam.c
index 2456425..d5a27c2 100644
--- a/src/lib/elm_photocam.c
+++ b/src/lib/elm_photocam.c
@@ -853,12 +853,12 @@ _mouse_up_cb(void *data,
 }
 
 EOLIAN static Eina_Bool
-_elm_photocam_elm_widget_on_focus(Eo *obj, Elm_Photocam_Data *_pd EINA_UNUSED)
+_elm_photocam_elm_widget_on_focus(Eo *obj, Elm_Photocam_Data *_pd EINA_UNUSED, 
Elm_Object_Item *item EINA_UNUSED)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj))
diff --git a/src/lib/elm_plug.c b/src/lib/elm_plug.c
index c3c31aa..3b132f2 100644
--- a/src/lib/elm_plug.c
+++ b/src/lib/elm_plug.c
@@ -59,13 +59,13 @@ _elm_plug_resized(Ecore_Evas *ee)
 }
 
 EOLIAN static Eina_Bool
-_elm_plug_elm_widget_on_focus(Eo *obj, void *sd EINA_UNUSED)
+_elm_plug_elm_widget_on_focus(Eo *obj, void *sd EINA_UNUSED, Elm_Object_Item 
*item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
 
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (elm_widget_focus_get(obj))
diff --git a/src/lib/elm_prefs.c b/src/lib/elm_prefs.c
index 5b22fd4..068678a 100644
--- a/src/lib/elm_prefs.c
+++ b/src/lib/elm_prefs.c
@@ -473,7 +473,7 @@ _elm_prefs_evas_object_smart_del(Eo *obj, Elm_Prefs_Data 
*sd)
 }
 
 EOLIAN static Eina_Bool
-_elm_prefs_elm_widget_focus_next(Eo *obj, Elm_Prefs_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_prefs_elm_widget_focus_next(Eo *obj, Elm_Prefs_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    const Eina_List *items;
 
@@ -483,12 +483,12 @@ _elm_prefs_elm_widget_focus_next(Eo *obj, Elm_Prefs_Data 
*sd, Elm_Focus_Directio
    if (items)
      {
         return elm_widget_focus_list_next_get
-           (obj, items, eina_list_data_get, dir, next);
+           (obj, items, eina_list_data_get, dir, next, next_item);
      }
 
    if (sd->root && sd->root->w_obj)
      {
-        return elm_widget_focus_next_get(sd->root->w_obj, dir, next);
+        return elm_widget_focus_next_get(sd->root->w_obj, dir, next, 
next_item);
      }
 
    if (next) *next = NULL;
diff --git a/src/lib/elm_scroller.c b/src/lib/elm_scroller.c
index 22e0684..59c9a4a 100644
--- a/src/lib/elm_scroller.c
+++ b/src/lib/elm_scroller.c
@@ -100,6 +100,7 @@ _key_action_move(Evas_Object *obj, const char *params)
    Evas_Object *current_focus = NULL;
    Eina_List *can_focus_list = NULL;
    Evas_Object *new_focus = NULL;
+   Elm_Object_Item *new_focus_item = NULL;
    Evas_Coord f_x = 0;
    Evas_Coord f_y = 0;
    Evas_Coord f_w = 0;
@@ -145,7 +146,7 @@ _key_action_move(Evas_Object *obj, const char *params)
                     cur_weight += ((f_y - c_y) - y) * ((f_y - c_y) - y);
                   if (cur_weight == 0.0)
                     {
-                       elm_widget_focus_steal(cur);
+                       elm_widget_focus_steal(cur, NULL);
                        eina_list_free(can_focus_list);
                        return EINA_TRUE;
                     }
@@ -159,7 +160,7 @@ _key_action_move(Evas_Object *obj, const char *params)
           }
         if (new_focus)
           {
-             elm_widget_focus_steal(new_focus);
+             elm_widget_focus_steal(new_focus, NULL);
              eina_list_free(can_focus_list);
              return EINA_TRUE;
           }
@@ -169,13 +170,13 @@ _key_action_move(Evas_Object *obj, const char *params)
         Eina_Bool r = EINA_FALSE;
 
         if (!strcmp(dir, "left"))
-          r = elm_widget_focus_next_get(obj, ELM_FOCUS_LEFT, &new_focus);
+          r = elm_widget_focus_next_get(obj, ELM_FOCUS_LEFT, &new_focus, 
&new_focus_item);
         else if (!strcmp(dir, "right"))
-          r = elm_widget_focus_next_get(obj, ELM_FOCUS_RIGHT, &new_focus);
+          r = elm_widget_focus_next_get(obj, ELM_FOCUS_RIGHT, &new_focus, 
&new_focus_item);
         else if (!strcmp(dir, "up"))
-          r = elm_widget_focus_next_get(obj, ELM_FOCUS_UP, &new_focus);
+          r = elm_widget_focus_next_get(obj, ELM_FOCUS_UP, &new_focus, 
&new_focus_item);
         else if (!strcmp(dir, "down"))
-          r = elm_widget_focus_next_get(obj, ELM_FOCUS_DOWN, &new_focus);
+          r = elm_widget_focus_next_get(obj, ELM_FOCUS_DOWN, &new_focus, 
&new_focus_item);
 
         if (r && new_focus)
           {
@@ -192,7 +193,7 @@ _key_action_move(Evas_Object *obj, const char *params)
 
              if (ELM_RECTS_INTERSECT(x, y, v_w, v_h, l_x, l_y, l_w, l_h))
                {
-                  elm_widget_focus_steal(new_focus);
+                  elm_widget_focus_steal(new_focus, new_focus_item);
                   eina_list_free(can_focus_list);
                   return EINA_TRUE;
                }
@@ -413,7 +414,7 @@ _elm_scroller_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Scroller
 }
 
 EOLIAN static Eina_Bool
-_elm_scroller_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Scroller_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_scroller_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Scroller_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *cur;
 
@@ -427,7 +428,7 @@ _elm_scroller_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Scroller_Data *sd,
         if ((elm_widget_can_focus_get(cur)) ||
             (elm_widget_child_can_focus_get(cur)))
           {
-             return elm_widget_focus_next_get(cur, dir, next);
+             return elm_widget_focus_next_get(cur, dir, next, next_item);
           }
 
         return EINA_FALSE;
@@ -439,7 +440,7 @@ _elm_scroller_elm_widget_focus_next(Eo *obj EINA_UNUSED, 
Elm_Scroller_Data *sd,
         if ((elm_widget_can_focus_get(cur)) ||
             (elm_widget_child_can_focus_get(cur)))
           {
-             return elm_widget_focus_next_get(cur, dir, next);
+             return elm_widget_focus_next_get(cur, dir, next, next_item);
           }
      }
 
diff --git a/src/lib/elm_segment_control.c b/src/lib/elm_segment_control.c
index a011936..53319e4 100644
--- a/src/lib/elm_segment_control.c
+++ b/src/lib/elm_segment_control.c
@@ -644,7 +644,7 @@ _elm_segment_control_elm_widget_focus_next_manager_is(Eo 
*obj EINA_UNUSED, Elm_S
 }
 
 EOLIAN static Eina_Bool
-_elm_segment_control_elm_widget_focus_next(Eo *obj, Elm_Segment_Control_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next)
+_elm_segment_control_elm_widget_focus_next(Eo *obj, Elm_Segment_Control_Data 
*sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Eina_List *l;
@@ -659,7 +659,7 @@ _elm_segment_control_elm_widget_focus_next(Eo *obj, 
Elm_Segment_Control_Data *sd
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 EOLIAN static Eina_Bool
diff --git a/src/lib/elm_slider.c b/src/lib/elm_slider.c
index d81ed57..bffab0a 100644
--- a/src/lib/elm_slider.c
+++ b/src/lib/elm_slider.c
@@ -1196,11 +1196,11 @@ _elm_slider_elm_widget_focus_direction_manager_is(Eo 
*obj EINA_UNUSED, Elm_Slide
 }
 
 EOLIAN static Eina_Bool
-_elm_slider_elm_widget_on_focus(Eo *obj, Elm_Slider_Data *sd EINA_UNUSED)
+_elm_slider_elm_widget_on_focus(Eo *obj, Elm_Slider_Data *sd EINA_UNUSED, 
Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
 
    if ((sd->indicator_visible_mode == 
ELM_SLIDER_INDICATOR_VISIBLE_MODE_ON_FOCUS) && elm_widget_focus_get(obj))
      _popup_show(obj, NULL, NULL, NULL);
diff --git a/src/lib/elm_spinner.c b/src/lib/elm_spinner.c
index f0a8d2f..46533c3 100644
--- a/src/lib/elm_spinner.c
+++ b/src/lib/elm_spinner.c
@@ -760,10 +760,10 @@ _elm_spinner_elm_layout_sizing_eval(Eo *obj, 
Elm_Spinner_Data *_pd EINA_UNUSED)
 }
 
 EOLIAN static Eina_Bool
-_elm_spinner_elm_widget_on_focus(Eo *obj, Elm_Spinner_Data *sd)
+_elm_spinner_elm_widget_on_focus(Eo *obj, Elm_Spinner_Data *sd, 
Elm_Object_Item *item EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
 
    if (!elm_widget_focus_get(obj))
@@ -1213,7 +1213,7 @@ _access_object_get(const Evas_Object *obj, const char* 
part)
 }
 
 EOLIAN static Eina_Bool
-_elm_spinner_elm_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_spinner_elm_widget_focus_next(Eo *obj, Elm_Spinner_Data *_pd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Evas_Object *ao;
    Eina_List *items = NULL;
@@ -1236,7 +1236,7 @@ _elm_spinner_elm_widget_focus_next(Eo *obj, 
Elm_Spinner_Data *_pd, Elm_Focus_Dir
 
      }
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 EOLIAN static void
diff --git a/src/lib/elm_table.c b/src/lib/elm_table.c
index 78a38a2..5181518 100644
--- a/src/lib/elm_table.c
+++ b/src/lib/elm_table.c
@@ -21,7 +21,7 @@ _elm_table_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, void *_pd EINA_
 }
 
 EOLIAN static Eina_Bool
-_elm_table_elm_widget_focus_next(Eo *obj, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_table_elm_widget_focus_next(Eo *obj, void *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_Bool int_ret;
 
@@ -48,7 +48,7 @@ _elm_table_elm_widget_focus_next(Eo *obj, void *_pd 
EINA_UNUSED, Elm_Focus_Direc
         if (!items) return EINA_FALSE;
      }
 
-   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next);
+   int_ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, 
next, next_item);
 
    if (list_free) list_free((Eina_List *)items);
 
diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c
index 163bd31..708f32f 100644
--- a/src/lib/elm_toolbar.c
+++ b/src/lib/elm_toolbar.c
@@ -742,13 +742,13 @@ _elm_toolbar_nearest_visible_item_get(Evas_Object *obj, 
Elm_Object_Item *eo_it)
 }
 
 EOLIAN static Eina_Bool
-_elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data *sd)
+_elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data *sd, 
Elm_Object_Item *item EINA_UNUSED)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
    Eina_Bool int_ret = EINA_FALSE;
    Elm_Object_Item *eo_it = NULL;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_FALSE;
    if (!sd->items) return EINA_FALSE;
 
@@ -2854,7 +2854,7 @@ _elm_toolbar_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Toolbar_D
 }
 
 EOLIAN static Eina_Bool
-_elm_toolbar_elm_widget_focus_next(Eo *obj, Elm_Toolbar_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_toolbar_elm_widget_focus_next(Eo *obj, Elm_Toolbar_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *items = NULL;
    Eina_List *list;
@@ -2875,7 +2875,7 @@ _elm_toolbar_elm_widget_focus_next(Eo *obj, 
Elm_Toolbar_Data *sd, Elm_Focus_Dire
      }
 
    return elm_widget_focus_list_next_get
-            (obj, items, eina_list_data_get, dir, next);
+            (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
 static void
diff --git a/src/lib/elm_web2.c b/src/lib/elm_web2.c
index bfd116c..e3e9bfb 100644
--- a/src/lib/elm_web2.c
+++ b/src/lib/elm_web2.c
@@ -633,7 +633,7 @@ _elm_web_elm_widget_theme_apply(Eo *obj, Elm_Web_Data *sd 
EINA_UNUSED)
 }
 
 EOLIAN static Eina_Bool
-_elm_web_elm_widget_on_focus(Eo *obj, Elm_Web_Data *sd)
+_elm_web_elm_widget_on_focus(Eo *obj, Elm_Web_Data *sd, Elm_Object_Item *item 
EINA_UNUSED)
 {
 #ifdef HAVE_ELEMENTARY_WEB
    Evas_Object *top;
@@ -641,7 +641,7 @@ _elm_web_elm_widget_on_focus(Eo *obj, Elm_Web_Data *sd)
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_TRUE);
    Eina_Bool int_ret = EINA_FALSE;
 
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_TRUE;
 
    top = elm_widget_top_get(obj);
diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
index 49fe1ac..3b93522 100644
--- a/src/lib/elm_widget.c
+++ b/src/lib/elm_widget.c
@@ -410,7 +410,7 @@ _if_focused_revert(Evas_Object *obj,
                   if (!sd2) return;
 
                   if (!elm_widget_focus_get(newest))
-                    elm_widget_focus_steal(newest);
+                    elm_widget_focus_steal(newest, NULL);
                   else
                     {
                        if (sd2->resize_obj && 
elm_widget_focus_get(sd2->resize_obj))
@@ -814,7 +814,7 @@ _elm_widget_focus_highlight_style_get(Eo *obj EINA_UNUSED, 
Elm_Widget_Smart_Data
 }
 
 static void
-_parent_focus(Evas_Object *obj)
+_parent_focus(Evas_Object *obj, Elm_Object_Item *item)
 {
    API_ENTRY return;
 
@@ -823,7 +823,7 @@ _parent_focus(Evas_Object *obj)
    Evas_Object *o = elm_widget_parent_get(obj);
    sd->focus_order_on_calc = EINA_TRUE;
 
-   if (o) _parent_focus(o);
+   if (o) _parent_focus(o, item);
 
    if (!sd->focus_order_on_calc)
      return;  /* we don't want to override it if by means of any of the
@@ -836,7 +836,7 @@ _parent_focus(Evas_Object *obj)
    if (sd->top_win_focused)
      {
         sd->focused = EINA_TRUE;
-        eo_do(obj, elm_obj_widget_on_focus());
+        eo_do(obj, elm_obj_widget_on_focus(item));
      }
    sd->focus_order_on_calc = EINA_FALSE;
 
@@ -1845,11 +1845,11 @@ EOLIAN static void
 _elm_widget_focus_cycle(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir)
 {
    Evas_Object *target = NULL;
-
+   Elm_Object_Item *target_item = NULL;
    if (!_elm_widget_is(obj))
      return;
    focus_origin = dir;
-   elm_widget_focus_next_get(obj, dir, &target);
+   elm_widget_focus_next_get(obj, dir, &target, &target_item);
    if (target)
      {
         /* access */
@@ -1859,12 +1859,12 @@ _elm_widget_focus_cycle(Eo *obj, Elm_Widget_Smart_Data 
*_pd EINA_UNUSED, Elm_Foc
                 the ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE message,
                 target will steal focus, or focus its own job. */
              if (!_elm_access_auto_highlight_get())
-               elm_widget_focus_steal(target);
+               elm_widget_focus_steal(target, target_item);
 
              _elm_access_highlight_set(target);
              elm_widget_focus_region_show(target);
           }
-        else elm_widget_focus_steal(target);
+        else elm_widget_focus_steal(target, target_item);
      }
 }
 
@@ -1899,7 +1899,7 @@ _elm_widget_focus_direction_go(Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_UNUSED,
    if (elm_widget_focus_direction_get
          (obj, current_focused, degree, &target, &weight))
      {
-        elm_widget_focus_steal(target);
+        elm_widget_focus_steal(target, NULL);
         return EINA_TRUE;
      }
 
@@ -2359,7 +2359,7 @@ _elm_widget_focus_list_direction_get(const Eo *obj 
EINA_UNUSED, Elm_Widget_Smart
  * @ingroup Widget
  */
 EOLIAN static Eina_Bool
-_elm_widget_focus_next_get(const Eo *obj, Elm_Widget_Smart_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_widget_focus_next_get(const Eo *obj, Elm_Widget_Smart_Data *sd, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Elm_Access_Info *ac;
 
@@ -2387,22 +2387,39 @@ _elm_widget_focus_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *sd, Elm_Focus_D
    if (_elm_widget_focus_chain_manager_is(obj))
      {
         Eina_Bool int_ret = EINA_FALSE;
-        eo_do((Eo *)obj, int_ret = elm_obj_widget_focus_next(dir, next));
+        eo_do((Eo *)obj, int_ret = elm_obj_widget_focus_next(dir, next, 
next_item));
         if (!int_ret && elm_widget_focus_get(obj))
           {
              Evas_Object *o = NULL;
              if (dir == ELM_FOCUS_PREVIOUS)
-               o = sd->focus_previous;
+               *next_item = sd->item_focus_previous;
              else if (dir == ELM_FOCUS_NEXT)
-               o = sd->focus_next;
+               *next_item = sd->item_focus_next;
              else if (dir == ELM_FOCUS_UP)
-               o = sd->focus_up;
+               *next_item = sd->item_focus_up;
              else if (dir == ELM_FOCUS_DOWN)
-               o = sd->focus_down;
+               *next_item = sd->item_focus_down;
              else if (dir == ELM_FOCUS_RIGHT)
-               o = sd->focus_right;
+               *next_item = sd->item_focus_right;
              else if (dir == ELM_FOCUS_LEFT)
-               o = sd->focus_left;
+               *next_item = sd->item_focus_left;
+             o = elm_object_item_widget_get(*next_item);
+
+             if (!o)
+               {
+                  if (dir == ELM_FOCUS_PREVIOUS)
+                    o = sd->focus_previous;
+                  else if (dir == ELM_FOCUS_NEXT)
+                    o = sd->focus_next;
+                  else if (dir == ELM_FOCUS_UP)
+                    o = sd->focus_up;
+                  else if (dir == ELM_FOCUS_DOWN)
+                    o = sd->focus_down;
+                  else if (dir == ELM_FOCUS_RIGHT)
+                    o = sd->focus_right;
+                  else if (dir == ELM_FOCUS_LEFT)
+                    o = sd->focus_left;
+               }
 
              if (o)
                {
@@ -2430,17 +2447,34 @@ _elm_widget_focus_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *sd, Elm_Focus_D
    if (elm_widget_focus_get(obj))
      {
         if (dir == ELM_FOCUS_PREVIOUS)
-          *next = sd->focus_previous;
+          *next_item = sd->item_focus_previous;
         else if (dir == ELM_FOCUS_NEXT)
-          *next = sd->focus_next;
+          *next_item = sd->item_focus_next;
         else if (dir == ELM_FOCUS_UP)
-          *next = sd->focus_up;
+          *next_item = sd->item_focus_up;
         else if (dir == ELM_FOCUS_DOWN)
-          *next = sd->focus_down;
+          *next_item = sd->item_focus_down;
         else if (dir == ELM_FOCUS_RIGHT)
-          *next = sd->focus_right;
+          *next_item = sd->item_focus_right;
         else if (dir == ELM_FOCUS_LEFT)
-          *next = sd->focus_left;
+          *next_item = sd->item_focus_left;
+        *next = elm_object_item_widget_get(*next_item);
+
+        if (!(*next))
+          {
+             if (dir == ELM_FOCUS_PREVIOUS)
+               *next = sd->focus_previous;
+             else if (dir == ELM_FOCUS_NEXT)
+               *next = sd->focus_next;
+             else if (dir == ELM_FOCUS_UP)
+               *next = sd->focus_up;
+             else if (dir == ELM_FOCUS_DOWN)
+               *next = sd->focus_down;
+             else if (dir == ELM_FOCUS_RIGHT)
+               *next = sd->focus_right;
+             else if (dir == ELM_FOCUS_LEFT)
+               *next = sd->focus_left;
+          }
 
         if (*next) return EINA_TRUE;
      }
@@ -2470,7 +2504,7 @@ _elm_widget_focus_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *sd, Elm_Focus_D
  * @ingroup Widget
  */
 EOLIAN static Eina_Bool
-_elm_widget_focus_list_next_get(const Eo *obj, Elm_Widget_Smart_Data *_pd 
EINA_UNUSED, const Eina_List *items, list_data_get_func_type list_data_get, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_widget_focus_list_next_get(const Eo *obj, Elm_Widget_Smart_Data *_pd 
EINA_UNUSED, const Eina_List *items, list_data_get_func_type list_data_get, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    Eina_List *(*list_next)(const Eina_List *list) = NULL;
    Evas_Object *focused_object = NULL;
@@ -2494,7 +2528,11 @@ _elm_widget_focus_list_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_U
            || (dir == ELM_FOCUS_RIGHT)
            || (dir == ELM_FOCUS_LEFT))
           {
-             *next = elm_widget_focus_next_object_get(focused_object, dir);
+             *next_item = elm_widget_focus_next_item_get(focused_object, dir);
+             if (*next_item)
+               *next = elm_object_item_widget_get(*next_item);
+             else
+               *next = elm_widget_focus_next_object_get(focused_object, dir);
              if (*next) return EINA_TRUE;
              else
                {
@@ -2550,12 +2588,14 @@ _elm_widget_focus_list_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_U
 
    const Eina_List *start = l;
    Evas_Object *to_focus = NULL;
+   Elm_Object_Item *to_focus_item = NULL;
 
    /* Iterate sub items */
    /* Go to the end of list */
    for (; l; l = list_next(l))
      {
         Evas_Object *tmp = NULL;
+        Elm_Object_Item *tmp_item = NULL;
         Evas_Object *cur = list_data_get(l);
 
         if (!cur) continue;
@@ -2564,9 +2604,10 @@ _elm_widget_focus_list_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_U
           continue;
 
         /* Try Focus cycle in subitem */
-        if (elm_widget_focus_next_get(cur, dir, &tmp))
+        if (elm_widget_focus_next_get(cur, dir, &tmp, &tmp_item))
           {
              *next = tmp;
+             *next_item = tmp_item;
              return EINA_TRUE;
           }
         else if ((dir == ELM_FOCUS_UP)
@@ -2577,11 +2618,15 @@ _elm_widget_focus_list_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_U
              if (tmp && elm_widget_focus_get(cur))
                {
                   *next = tmp;
+                  *next_item = tmp_item;
                   return EINA_FALSE;
                }
           }
         else if ((tmp) && (!to_focus))
-          to_focus = tmp;
+          {
+             to_focus = tmp;
+             to_focus_item = tmp_item;
+          }
      }
 
    l = items;
@@ -2590,21 +2635,24 @@ _elm_widget_focus_list_next_get(const Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_U
    for (; l != start; l = list_next(l))
      {
         Evas_Object *tmp = NULL;
+        Elm_Object_Item *tmp_item = NULL;
         Evas_Object *cur = list_data_get(l);
 
         if (elm_widget_parent_get(cur) != obj)
           continue;
 
         /* Try Focus cycle in subitem */
-        elm_widget_focus_next_get(cur, dir, &tmp);
+        elm_widget_focus_next_get(cur, dir, &tmp, &tmp_item);
         if (tmp)
           {
              *next = tmp;
+             *next_item = tmp_item;
              return EINA_FALSE;
           }
      }
 
    *next = to_focus;
+   *next_item = to_focus_item;
    return EINA_FALSE;
 }
 
@@ -2677,6 +2725,44 @@ _elm_widget_focus_next_object_set(Eo *obj EINA_UNUSED, 
Elm_Widget_Smart_Data *sd
      sd->focus_left = next;
 }
 
+EOLIAN static Elm_Object_Item*
+_elm_widget_focus_next_item_get(const Eo *obj EINA_UNUSED, 
Elm_Widget_Smart_Data *sd, Elm_Focus_Direction dir)
+{
+   Elm_Object_Item *ret = NULL;
+
+   if (dir == ELM_FOCUS_PREVIOUS)
+     ret = sd->item_focus_previous;
+   else if (dir == ELM_FOCUS_NEXT)
+     ret = sd->item_focus_next;
+   else if (dir == ELM_FOCUS_UP)
+     ret = sd->item_focus_up;
+   else if (dir == ELM_FOCUS_DOWN)
+     ret = sd->item_focus_down;
+   else if (dir == ELM_FOCUS_RIGHT)
+     ret = sd->item_focus_right;
+   else if (dir == ELM_FOCUS_LEFT)
+     ret = sd->item_focus_left;
+
+   return ret;
+}
+
+EOLIAN static void
+_elm_widget_focus_next_item_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data 
*sd, Elm_Object_Item *next_item, Elm_Focus_Direction dir)
+{
+   if (dir == ELM_FOCUS_PREVIOUS)
+     sd->item_focus_previous = next_item;
+   else if (dir == ELM_FOCUS_NEXT)
+     sd->item_focus_next = next_item;
+   else if (dir == ELM_FOCUS_UP)
+     sd->item_focus_up = next_item;
+   else if (dir == ELM_FOCUS_DOWN)
+     sd->item_focus_down = next_item;
+   else if (dir == ELM_FOCUS_RIGHT)
+     sd->item_focus_right = next_item;
+   else if (dir == ELM_FOCUS_LEFT)
+     sd->item_focus_left = next_item;
+}
+
 EOLIAN static void
 _elm_widget_parent_highlight_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool 
highlighted)
 {
@@ -2744,7 +2830,7 @@ _elm_widget_focus_set(Eo *obj, Elm_Widget_Smart_Data *sd, 
Eina_Bool focus)
         focus_order++;
         sd->focus_order = focus_order;
         sd->focused = EINA_TRUE;
-        eo_do(obj, elm_obj_widget_on_focus());
+        eo_do(obj, elm_obj_widget_on_focus(NULL));
      }
 
    if (focus)
@@ -2818,11 +2904,11 @@ _elm_widget_focused_object_clear(Eo *obj, 
Elm_Widget_Smart_Data *sd)
           }
      }
    sd->focused = EINA_FALSE;
-   eo_do(obj, elm_obj_widget_on_focus());
+   eo_do(obj, elm_obj_widget_on_focus(NULL));
 }
 
 EOLIAN static void
-_elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd)
+_elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item 
*item)
 {
    Evas_Object *parent, *parent2, *o;
 
@@ -2871,7 +2957,7 @@ _elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data 
*sd)
                }
           }
      }
-   _parent_focus(obj);
+   _parent_focus(obj, item);
    elm_widget_focus_region_show(obj);
    return;
 }
@@ -3847,7 +3933,7 @@ _elm_widget_focus_mouse_up_handle(Eo *obj, 
Elm_Widget_Smart_Data *_pd EINA_UNUSE
    if (!_is_focusable(obj)) return;
    top = elm_widget_top_get(obj);
    if (top && eo_isa(top, ELM_WIN_CLASS)) _elm_win_focus_auto_hide(top);
-   elm_widget_focus_steal(obj);
+   elm_widget_focus_steal(obj, NULL);
 }
 
 EOLIAN static void
@@ -5444,6 +5530,82 @@ _elm_widget_item_access_object_get(const Eo *eo_item 
EINA_UNUSED, Elm_Widget_Ite
    return item->access_obj;
 }
 
+EOLIAN static Evas_Object *
+_elm_widget_item_focus_next_object_get(const Eo *eo_item EINA_UNUSED, 
Elm_Widget_Item_Data *item, Elm_Focus_Direction dir)
+{
+   Evas_Object *ret = NULL;
+
+   if (dir == ELM_FOCUS_PREVIOUS)
+     ret = item->focus_previous;
+   else if (dir == ELM_FOCUS_NEXT)
+     ret = item->focus_next;
+   else if (dir == ELM_FOCUS_UP)
+     ret = item->focus_up;
+   else if (dir == ELM_FOCUS_DOWN)
+     ret = item->focus_down;
+   else if (dir == ELM_FOCUS_RIGHT)
+     ret = item->focus_right;
+   else if (dir == ELM_FOCUS_LEFT)
+     ret = item->focus_left;
+
+   return ret;
+}
+
+EOLIAN static void
+_elm_widget_item_focus_next_object_set(Eo *eo_item EINA_UNUSED, 
Elm_Widget_Item_Data *item, Evas_Object *next, Elm_Focus_Direction dir)
+{
+   if (dir == ELM_FOCUS_PREVIOUS)
+     item->focus_previous = next;
+   else if (dir == ELM_FOCUS_NEXT)
+     item->focus_next = next;
+   else if (dir == ELM_FOCUS_UP)
+     item->focus_up = next;
+   else if (dir == ELM_FOCUS_DOWN)
+     item->focus_down = next;
+   else if (dir == ELM_FOCUS_RIGHT)
+     item->focus_right = next;
+   else if (dir == ELM_FOCUS_LEFT)
+     item->focus_left = next;
+}
+
+EOLIAN static Elm_Object_Item*
+_elm_widget_item_focus_next_item_get(const Eo *eo_item EINA_UNUSED, 
Elm_Widget_Item_Data *item, Elm_Focus_Direction dir)
+{
+   Elm_Object_Item *ret = NULL;
+
+   if (dir == ELM_FOCUS_PREVIOUS)
+     ret = item->item_focus_previous;
+   else if (dir == ELM_FOCUS_NEXT)
+     ret = item->item_focus_next;
+   else if (dir == ELM_FOCUS_UP)
+     ret = item->item_focus_up;
+   else if (dir == ELM_FOCUS_DOWN)
+     ret = item->item_focus_down;
+   else if (dir == ELM_FOCUS_RIGHT)
+     ret = item->item_focus_right;
+   else if (dir == ELM_FOCUS_LEFT)
+     ret = item->item_focus_left;
+
+   return ret;
+}
+
+EOLIAN static void
+_elm_widget_item_focus_next_item_set(Eo *eo_item EINA_UNUSED, 
Elm_Widget_Item_Data *item, Elm_Object_Item *next_item, Elm_Focus_Direction dir)
+{
+   if (dir == ELM_FOCUS_PREVIOUS)
+     item->item_focus_previous = next_item;
+   else if (dir == ELM_FOCUS_NEXT)
+     item->item_focus_next = next_item;
+   else if (dir == ELM_FOCUS_UP)
+     item->item_focus_up = next_item;
+   else if (dir == ELM_FOCUS_DOWN)
+     item->item_focus_down = next_item;
+   else if (dir == ELM_FOCUS_RIGHT)
+     item->item_focus_right = next_item;
+   else if (dir == ELM_FOCUS_LEFT)
+     item->item_focus_left = next_item;
+}
+
 /* happy debug functions */
 #ifdef ELM_DEBUG
 static void
@@ -5583,7 +5745,7 @@ _elm_widget_eo_base_destructor(Eo *obj, 
Elm_Widget_Smart_Data *sd)
 }
 
 EOLIAN static Eina_Bool
-_elm_widget_on_focus(Eo *obj, Elm_Widget_Smart_Data *sd)
+_elm_widget_on_focus(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *item 
EINA_UNUSED)
 {
    if (elm_widget_can_focus_get(obj))
      {
diff --git a/src/lib/elm_widget.eo b/src/lib/elm_widget.eo
index 808a348..94633e1 100644
--- a/src/lib/elm_widget.eo
+++ b/src/lib/elm_widget.eo
@@ -406,15 +406,39 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
          }
       }
       focus_next_object_set {
+         [[Set the next object with specific focus direction.
+
+           @since 1.8]]
          params {
-            @in next: Evas.Object * @nullable;
-            @in dir: Elm_Focus_Direction;
+            @in next: Evas.Object * @nullable; [[Focus next object]]
+            @in dir: Elm_Focus_Direction; [[Focus direction]]
          }
       }
       focus_next_object_get @const {
-         return: Evas.Object *;
+         [[Get the next object with specific focus direction.
+
+           @since 1.8]]
+         return: Evas.Object *; [[Focus next object]]
          params {
-            @in dir: Elm_Focus_Direction;
+            @in dir: Elm_Focus_Direction; [[Focus direction]]
+         }
+      }
+      focus_next_item_set {
+         [[Set the next object item with specific focus direction.
+
+           @since 1.16]]
+         params {
+            @in next_item: Elm_Object_Item * @nullable; [[Focus next object 
item]]
+            @in dir: Elm_Focus_Direction; [[Focus direction]]
+         }
+      }
+      focus_next_item_get @const {
+         [[Get the next object item with specific focus direction.
+
+           @since 1.16]]
+         return: Elm_Object_Item *; [[Focus next object item]]
+         params {
+            @in dir: Elm_Focus_Direction; [[Focus direction]]
          }
       }
       focus_tree_unfocusable_handle {
@@ -497,6 +521,9 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
       }
       on_focus {
          [['Virtual' function handling focus in/out events on the widget.  
return true if this widget can handle focus, false otherwise]]
+         params {
+            @in item: Elm_Object_Item * @nullable;
+         }
          return: bool;
       }
       on_focus_region {
@@ -599,6 +626,7 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
          params {
             @in dir: Elm_Focus_Direction;
             @out next: Evas.Object *;
+            @out next_item: Elm_Object_Item *;
          }
       }
       translatable_part_text_get @const {
@@ -626,6 +654,9 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
       focus_custom_chain_unset {
       }
       focus_steal {
+         params {
+            @in item: Elm_Object_Item * @nullable;
+         }
       }
       focus_hide_handle {
       }
@@ -634,6 +665,7 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
          params {
             @in dir: Elm_Focus_Direction;
             @out next: Evas.Object *;
+            @out next_item: Elm_Object_Item *;
          }
          return: bool;
       }
@@ -644,6 +676,7 @@ abstract Elm.Widget (Evas.Object_Smart, 
Elm_Interface_Atspi_Accessible, Elm_Inte
             @in list_data_get: list_data_get_func_type;
             @in dir: Elm_Focus_Direction;
             @out next: Evas.Object *;
+            @out next_item: Elm_Object_Item *;
          }
       }
       focus_mouse_up_handle {
diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h
index 112f935..1e1ce9b 100644
--- a/src/lib/elm_widget.h
+++ b/src/lib/elm_widget.h
@@ -380,6 +380,8 @@ typedef struct _Elm_Widget_Smart_Data
    Eina_List                    *tooltips, *cursors;
    Evas_Object                  *focus_previous, *focus_next;
    Evas_Object                  *focus_up, *focus_down, *focus_right, 
*focus_left;
+   Elm_Object_Item              *item_focus_previous, *item_focus_next;
+   Elm_Object_Item              *item_focus_up, *item_focus_down, 
*item_focus_right, *item_focus_left;
 
    /* "show region" coordinates. all widgets got those because this
     * info may be set and queried recursively through the widget
@@ -608,6 +610,11 @@ struct _Elm_Widget_Item_Data
    /**< widget delete callback function. don't expose this callback call */
    Elm_Widget_Del_Pre_Cb          del_pre_func;
 
+   Evas_Object                   *focus_previous, *focus_next;
+   Evas_Object                   *focus_up, *focus_down, *focus_right, 
*focus_left;
+   Elm_Object_Item               *item_focus_previous, *item_focus_next;
+   Elm_Object_Item               *item_focus_up, *item_focus_down, 
*item_focus_right, *item_focus_left;
+
    Evas_Object                   *access_obj;
    const char                    *access_info;
    Eina_List                     *access_order;
@@ -673,11 +680,13 @@ EAPI void             
elm_widget_focus_custom_chain_prepend(Evas_Object *obj, Ev
 EAPI void             elm_widget_focus_cycle(Evas_Object *obj, 
Elm_Focus_Direction dir);
 EAPI Eina_Bool        elm_widget_focus_direction_go(Evas_Object *obj, double 
degree);
 EAPI Eina_Bool        elm_widget_focus_direction_get(const Evas_Object *obj, 
const Evas_Object *base, double degree, Evas_Object **direction, double 
*weight);
-EAPI Eina_Bool        elm_widget_focus_next_get(const Evas_Object *obj, 
Elm_Focus_Direction dir, Evas_Object **next);
+EAPI Eina_Bool        elm_widget_focus_next_get(const Evas_Object *obj, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item);
 EAPI Eina_Bool        elm_widget_focus_list_direction_get(const Evas_Object  
*obj, const Evas_Object *base, const Eina_List *items, void 
*(*list_data_get)(const Eina_List *list), double degree, Evas_Object 
**direction, double *weight);
-EAPI Eina_Bool        elm_widget_focus_list_next_get(const Evas_Object *obj, 
const Eina_List *items, void *(*list_data_get)(const Eina_List *list), 
Elm_Focus_Direction dir, Evas_Object **next);
+EAPI Eina_Bool        elm_widget_focus_list_next_get(const Evas_Object *obj, 
const Eina_List *items, void *(*list_data_get)(const Eina_List *list), 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item);
 EAPI Evas_Object     *elm_widget_focus_next_object_get(const Evas_Object *obj, 
Elm_Focus_Direction dir);
 EAPI void             elm_widget_focus_next_object_set(Evas_Object *obj, 
Evas_Object *next, Elm_Focus_Direction dir);
+EAPI Elm_Object_Item *elm_widget_focus_next_item_get(const Evas_Object *obj, 
Elm_Focus_Direction dir);
+EAPI void             elm_widget_focus_next_item_set(Evas_Object *obj, 
Elm_Object_Item *next_item, Elm_Focus_Direction dir);
 EAPI Eina_Bool        elm_widget_focus_highlight_style_set(Evas_Object *obj, 
const char *style);
 EAPI const char      *elm_widget_focus_highlight_style_get(const Evas_Object 
*obj);
 EAPI void             elm_widget_parent_highlight_set(Evas_Object *obj, 
Eina_Bool highlighted);
@@ -686,7 +695,7 @@ EAPI void             
elm_widget_focused_object_clear(Evas_Object *obj);
 EAPI Evas_Object     *elm_widget_parent_get(const Evas_Object *obj);
 EAPI Evas_Object     *elm_widget_parent2_get(const Evas_Object *obj);
 EAPI void             elm_widget_parent2_set(Evas_Object *obj, Evas_Object 
*parent);
-EAPI void             elm_widget_focus_steal(Evas_Object *obj);
+EAPI void             elm_widget_focus_steal(Evas_Object *obj, Elm_Object_Item 
*next_item);
 EAPI Evas_Object     *elm_widget_newest_focus_order_get(const Evas_Object 
*obj, unsigned int *newest_focus_order, Eina_Bool can_focus_only);
 EAPI void             elm_widget_display_mode_set(Evas_Object *obj, 
Evas_Display_Mode dispmode);
 EAPI Eina_Bool        elm_widget_focus_highlight_enabled_get(const Evas_Object 
*obj);
diff --git a/src/lib/elm_widget_item.eo b/src/lib/elm_widget_item.eo
index 021b4c0..d4fd187 100644
--- a/src/lib/elm_widget_item.eo
+++ b/src/lib/elm_widget_item.eo
@@ -489,6 +489,42 @@ class Elm.Widget_Item(Eo.Base, 
Elm_Interface_Atspi_Accessible,
                 legacy: null;
                 return: bool;
            }
+           focus_next_object_get @const {
+                [[Get the next object with specific focus direction.
+
+                  @since 1.16]]
+                params {
+                     dir: Elm_Focus_Direction; [[Focus direction]]
+                }
+                return: Evas.Object *; [[Focus next object]]
+           }
+           focus_next_object_set {
+                [[Set the next object with specific focus direction.
+
+                  @since 1.16]]
+                params {
+                     next: Evas.Object * @nullable; [[Focus next object]]
+                     dir: Elm_Focus_Direction; [[Focus direction]]
+                }
+           }
+           focus_next_item_get @const {
+                [[Get the next object item with specific focus direction.
+
+                  @since 1.16]]
+                params {
+                     dir: Elm_Focus_Direction; [[Focus direction]]
+                }
+                return: Elm_Object_Item *; [[Focus next object item]]
+           }
+           focus_next_item_set {
+                [[Set the next object item with specific focus direction.
+
+                  @since 1.16]]
+                params {
+                     next_item: Elm_Object_Item * @nullable; [[Focus next 
object item]]
+                     dir: Elm_Focus_Direction; [[Focus direction]]
+                }
+           }
       }
       implements {
            Eo.Base.constructor;
diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c
index 0ced87a..9d4fecc 100644
--- a/src/lib/elm_win.c
+++ b/src/lib/elm_win.c
@@ -1081,7 +1081,7 @@ _elm_win_focus_in(Ecore_Evas *ee)
         if (!elm_widget_focus_order_get(obj)
             || (obj == elm_widget_newest_focus_order_get(obj, &order, 
EINA_TRUE)))
           {
-             elm_widget_focus_steal(obj);
+             elm_widget_focus_steal(obj, NULL);
           }
         else
           {
@@ -1439,7 +1439,7 @@ _elm_win_elm_widget_focus_next_manager_is(Eo *obj 
EINA_UNUSED, Elm_Win_Data *_pd
 }
 
 EOLIAN static Eina_Bool
-_elm_win_elm_widget_focus_next(Eo *obj, Elm_Win_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next)
+_elm_win_elm_widget_focus_next(Eo *obj, Elm_Win_Data *_pd EINA_UNUSED, 
Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EINA_FALSE);
 
@@ -1457,7 +1457,7 @@ _elm_win_elm_widget_focus_next(Eo *obj, Elm_Win_Data *_pd 
EINA_UNUSED, Elm_Focus
           }
         list_data_get = eina_list_data_get;
 
-        elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
+        elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next, 
next_item);
 
         if (*next) return EINA_TRUE;
      }
@@ -1495,10 +1495,10 @@ _elm_win_elm_widget_focus_direction(Eo *obj, 
Elm_Win_Data *_pd EINA_UNUSED, cons
 }
 
 EOLIAN static Eina_Bool
-_elm_win_elm_widget_on_focus(Eo *obj, Elm_Win_Data *sd)
+_elm_win_elm_widget_on_focus(Eo *obj, Elm_Win_Data *sd, Elm_Object_Item *item 
EINA_UNUSED)
 {
    Eina_Bool int_ret = EINA_FALSE;
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus());
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_on_focus(NULL));
    if (!int_ret) return EINA_TRUE;
 
    if (sd->img_obj)
@@ -1819,7 +1819,7 @@ _win_img_focus_in(void *data,
                   Evas_Object *obj EINA_UNUSED,
                   void *event_info EINA_UNUSED)
 {
-   elm_widget_focus_steal(data);
+   elm_widget_focus_steal(data, NULL);
 }
 
 static void

-- 


Reply via email to