From 0dedfc9248f3ad59cc853afa887ee2deadc03ebf Mon Sep 17 00:00:00 2001 From: Jaehwan Kim Date: Tue, 15 Sep 2015 19:41:51 +0900 Subject: [PATCH] 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 --- legacy/elementary/src/lib/elc_ctxpopup.c | 6 +- legacy/elementary/src/lib/elc_fileselector.c | 6 +- .../src/lib/elc_fileselector_entry.c | 6 +- .../elementary/src/lib/elc_multibuttonentry.c | 6 +- legacy/elementary/src/lib/elc_naviframe.c | 4 +- legacy/elementary/src/lib/elc_popup.c | 4 +- legacy/elementary/src/lib/elm_access.c | 4 +- legacy/elementary/src/lib/elm_box.c | 4 +- legacy/elementary/src/lib/elm_bubble.c | 4 +- legacy/elementary/src/lib/elm_calendar.c | 4 +- legacy/elementary/src/lib/elm_clock.c | 4 +- legacy/elementary/src/lib/elm_colorselector.c | 4 +- legacy/elementary/src/lib/elm_datetime.c | 8 +- legacy/elementary/src/lib/elm_diskselector.c | 12 +- legacy/elementary/src/lib/elm_entry.c | 2 +- legacy/elementary/src/lib/elm_flip.c | 6 +- legacy/elementary/src/lib/elm_focus.h | 45 +++- legacy/elementary/src/lib/elm_frame.c | 4 +- legacy/elementary/src/lib/elm_gengrid.c | 108 ++++++-- legacy/elementary/src/lib/elm_genlist.c | 16 +- legacy/elementary/src/lib/elm_glview.c | 4 +- legacy/elementary/src/lib/elm_grid.c | 4 +- legacy/elementary/src/lib/elm_index.c | 4 +- legacy/elementary/src/lib/elm_inwin.c | 4 +- legacy/elementary/src/lib/elm_layout.c | 6 +- legacy/elementary/src/lib/elm_list.c | 16 +- legacy/elementary/src/lib/elm_main.c | 17 ++ legacy/elementary/src/lib/elm_map.c | 4 +- legacy/elementary/src/lib/elm_notify.c | 4 +- legacy/elementary/src/lib/elm_object_item.h | 2 + legacy/elementary/src/lib/elm_panel.c | 10 +- legacy/elementary/src/lib/elm_panes.c | 10 +- legacy/elementary/src/lib/elm_photocam.c | 4 +- legacy/elementary/src/lib/elm_plug.c | 4 +- legacy/elementary/src/lib/elm_prefs.c | 6 +- legacy/elementary/src/lib/elm_scroller.c | 21 +- .../elementary/src/lib/elm_segment_control.c | 4 +- legacy/elementary/src/lib/elm_slider.c | 4 +- legacy/elementary/src/lib/elm_spinner.c | 8 +- legacy/elementary/src/lib/elm_table.c | 4 +- legacy/elementary/src/lib/elm_toolbar.c | 8 +- legacy/elementary/src/lib/elm_web2.c | 4 +- legacy/elementary/src/lib/elm_widget.c | 230 +++++++++++++++--- legacy/elementary/src/lib/elm_widget.eo | 41 +++- legacy/elementary/src/lib/elm_widget.h | 15 +- legacy/elementary/src/lib/elm_widget_item.eo | 36 +++ legacy/elementary/src/lib/elm_win.c | 12 +- 47 files changed, 567 insertions(+), 176 deletions(-) diff --git a/legacy/elementary/src/lib/elc_ctxpopup.c b/legacy/elementary/src/lib/elc_ctxpopup.c index 73954d4db9..f23f5880ae 100644 --- a/legacy/elementary/src/lib/elc_ctxpopup.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elc_fileselector.c b/legacy/elementary/src/lib/elc_fileselector.c index 8dc2e039c1..74fee6662e 100644 --- a/legacy/elementary/src/lib/elc_fileselector.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elc_fileselector_entry.c b/legacy/elementary/src/lib/elc_fileselector_entry.c index 40f94a37a0..ba06a6f1c9 100644 --- a/legacy/elementary/src/lib/elc_fileselector_entry.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elc_multibuttonentry.c b/legacy/elementary/src/lib/elc_multibuttonentry.c index 98e1b53325..e9c44e50a2 100644 --- a/legacy/elementary/src/lib/elc_multibuttonentry.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elc_naviframe.c b/legacy/elementary/src/lib/elc_naviframe.c index b11eda3e9d..f1830ab417 100644 --- a/legacy/elementary/src/lib/elc_naviframe.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elc_popup.c b/legacy/elementary/src/lib/elc_popup.c index 7e56946888..73a130287c 100644 --- a/legacy/elementary/src/lib/elc_popup.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_access.c b/legacy/elementary/src/lib/elm_access.c index f8df21fe7f..47f87b6fd9 100644 --- a/legacy/elementary/src/lib/elm_access.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_box.c b/legacy/elementary/src/lib/elm_box.c index f89989fb2d..2adc12120d 100644 --- a/legacy/elementary/src/lib/elm_box.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_bubble.c b/legacy/elementary/src/lib/elm_bubble.c index cec3cc7bfb..9fdc9f8523 100644 --- a/legacy/elementary/src/lib/elm_bubble.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_calendar.c b/legacy/elementary/src/lib/elm_calendar.c index 4ecfb49865..1749152303 100644 --- a/legacy/elementary/src/lib/elm_calendar.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_clock.c b/legacy/elementary/src/lib/elm_clock.c index b7a7139a3e..31f84f9b98 100644 --- a/legacy/elementary/src/lib/elm_clock.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_colorselector.c b/legacy/elementary/src/lib/elm_colorselector.c index ee9a96f1cd..f0d230bfa2 100644 --- a/legacy/elementary/src/lib/elm_colorselector.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_datetime.c b/legacy/elementary/src/lib/elm_datetime.c index ed313a8a70..ccd14f3252 100644 --- a/legacy/elementary/src/lib/elm_datetime.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_diskselector.c b/legacy/elementary/src/lib/elm_diskselector.c index 54fe8c5fff..34cc99bb7d 100644 --- a/legacy/elementary/src/lib/elm_diskselector.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_entry.c b/legacy/elementary/src/lib/elm_entry.c index 0ba453bde0..6243501eba 100644 --- a/legacy/elementary/src/lib/elm_entry.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_flip.c b/legacy/elementary/src/lib/elm_flip.c index 86088170f4..eab8b1e24f 100644 --- a/legacy/elementary/src/lib/elm_flip.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_focus.h b/legacy/elementary/src/lib/elm_focus.h index 5bb4f896e6..6f076bacc3 100644 --- a/legacy/elementary/src/lib/elm_focus.h +++ b/legacy/elementary/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. @@ -248,6 +248,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. * diff --git a/legacy/elementary/src/lib/elm_frame.c b/legacy/elementary/src/lib/elm_frame.c index d5ebc1fde7..674653b155 100644 --- a/legacy/elementary/src/lib/elm_frame.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_gengrid.c b/legacy/elementary/src/lib/elm_gengrid.c index d351b53d8c..d6786f1c1f 100644 --- a/legacy/elementary/src/lib/elm_gengrid.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_genlist.c b/legacy/elementary/src/lib/elm_genlist.c index a839fc1087..6ebba7f68b 100644 --- a/legacy/elementary/src/lib/elm_genlist.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_glview.c b/legacy/elementary/src/lib/elm_glview.c index 2bc87f1fbc..51af23bed4 100644 --- a/legacy/elementary/src/lib/elm_glview.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_grid.c b/legacy/elementary/src/lib/elm_grid.c index ba712f63e9..95edb60887 100644 --- a/legacy/elementary/src/lib/elm_grid.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_index.c b/legacy/elementary/src/lib/elm_index.c index ed736bdcf9..0b574a6177 100644 --- a/legacy/elementary/src/lib/elm_index.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_inwin.c b/legacy/elementary/src/lib/elm_inwin.c index 69c0f05167..febe1a66e8 100644 --- a/legacy/elementary/src/lib/elm_inwin.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_layout.c b/legacy/elementary/src/lib/elm_layout.c index 250ef4ec33..657696484a 100644 --- a/legacy/elementary/src/lib/elm_layout.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_list.c b/legacy/elementary/src/lib/elm_list.c index 498a79e491..708648676b 100644 --- a/legacy/elementary/src/lib/elm_list.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_main.c b/legacy/elementary/src/lib/elm_main.c index dcd22b4bba..d436274571 100644 --- a/legacy/elementary/src/lib/elm_main.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_map.c b/legacy/elementary/src/lib/elm_map.c index 10172703d7..064652a986 100644 --- a/legacy/elementary/src/lib/elm_map.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_notify.c b/legacy/elementary/src/lib/elm_notify.c index 6fd416633f..19f06de488 100644 --- a/legacy/elementary/src/lib/elm_notify.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_object_item.h b/legacy/elementary/src/lib/elm_object_item.h index db19862229..db788f67c9 100644 --- a/legacy/elementary/src/lib/elm_object_item.h +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_panel.c b/legacy/elementary/src/lib/elm_panel.c index 67ef1f0a9a..bea0c3f2e3 100644 --- a/legacy/elementary/src/lib/elm_panel.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_panes.c b/legacy/elementary/src/lib/elm_panes.c index 335fe95b41..87dd4a7ab1 100644 --- a/legacy/elementary/src/lib/elm_panes.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_photocam.c b/legacy/elementary/src/lib/elm_photocam.c index 2456425a63..d5a27c226b 100644 --- a/legacy/elementary/src/lib/elm_photocam.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_plug.c b/legacy/elementary/src/lib/elm_plug.c index c3c31aa81d..3b132f2396 100644 --- a/legacy/elementary/src/lib/elm_plug.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_prefs.c b/legacy/elementary/src/lib/elm_prefs.c index 5b22fd416a..068678ad50 100644 --- a/legacy/elementary/src/lib/elm_prefs.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_scroller.c b/legacy/elementary/src/lib/elm_scroller.c index 22e0684f93..59c9a4a369 100644 --- a/legacy/elementary/src/lib/elm_scroller.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_segment_control.c b/legacy/elementary/src/lib/elm_segment_control.c index a011936495..53319e4548 100644 --- a/legacy/elementary/src/lib/elm_segment_control.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_slider.c b/legacy/elementary/src/lib/elm_slider.c index d81ed572fb..bffab0a3df 100644 --- a/legacy/elementary/src/lib/elm_slider.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_spinner.c b/legacy/elementary/src/lib/elm_spinner.c index f0a8d2ffd3..46533c39d1 100644 --- a/legacy/elementary/src/lib/elm_spinner.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_table.c b/legacy/elementary/src/lib/elm_table.c index 78a38a21da..51815188e2 100644 --- a/legacy/elementary/src/lib/elm_table.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_toolbar.c b/legacy/elementary/src/lib/elm_toolbar.c index 163bd314ea..708f32f1d7 100644 --- a/legacy/elementary/src/lib/elm_toolbar.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_web2.c b/legacy/elementary/src/lib/elm_web2.c index bfd116c70e..e3e9bfb94e 100644 --- a/legacy/elementary/src/lib/elm_web2.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index 49fe1ac5ff..3b93522bb3 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_widget.eo b/legacy/elementary/src/lib/elm_widget.eo index 808a348cb5..94633e1078 100644 --- a/legacy/elementary/src/lib/elm_widget.eo +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_widget.h b/legacy/elementary/src/lib/elm_widget.h index 112f93525c..1e1ce9bfb3 100644 --- a/legacy/elementary/src/lib/elm_widget.h +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_widget_item.eo b/legacy/elementary/src/lib/elm_widget_item.eo index 021b4c0015..d4fd187d96 100644 --- a/legacy/elementary/src/lib/elm_widget_item.eo +++ b/legacy/elementary/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/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c index 0ced87af53..9d4fecc471 100644 --- a/legacy/elementary/src/lib/elm_win.c +++ b/legacy/elementary/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