From b8b16305b6b2d4bfebd6ede6f21594493cc565ea 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 Conflicts: src/lib/elm_scroller.c src/lib/elm_widget.c src/lib/elm_widget.eo Change-Id: I63152070d3ed92651599f1e073e706eb2d7d0be6 origin: upstream --- 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 | 229 +++++++++++++++++++++++++++++++++------ src/lib/elm_widget.eo | 28 ++++- src/lib/elm_widget.h | 15 ++- src/lib/elm_widget_item.eo | 48 ++++++++ src/lib/elm_win.c | 12 +- 47 files changed, 567 insertions(+), 174 deletions(-) diff --git a/src/lib/elc_ctxpopup.c b/src/lib/elc_ctxpopup.c index cf2758d..2d64c39 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 c5d9a19..0793e24 100644 --- a/src/lib/elc_fileselector.c +++ b/src/lib/elc_fileselector.c @@ -2334,7 +2334,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; @@ -2347,9 +2347,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 3983750..841b828 100644 --- a/src/lib/elc_fileselector_entry.c +++ b/src/lib/elc_fileselector_entry.c @@ -118,7 +118,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; @@ -140,11 +140,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 bfd3e35..7d105a8 100644 --- a/src/lib/elc_multibuttonentry.c +++ b/src/lib/elc_multibuttonentry.c @@ -301,7 +301,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)) { @@ -1536,7 +1536,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; @@ -1581,7 +1581,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 48e1519..e232bd3 100644 --- a/src/lib/elc_naviframe.c +++ b/src/lib/elc_naviframe.c @@ -1278,7 +1278,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; @@ -1303,7 +1303,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 e7f9b69..78c6bd5 100644 --- a/src/lib/elc_popup.c +++ b/src/lib/elc_popup.c @@ -1265,7 +1265,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; @@ -1288,7 +1288,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 3ca73c9..98a1805 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 41d536b..0a0e21c 100644 --- a/src/lib/elm_box.c +++ b/src/lib/elm_box.c @@ -55,7 +55,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); @@ -76,7 +76,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 54e4d7d..70f261c 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 6810790..9cece91 100644 --- a/src/lib/elm_calendar.c +++ b/src/lib/elm_calendar.c @@ -1078,7 +1078,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; @@ -1111,7 +1111,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 066360d..e798f26 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 4a29693..ac71661 100644 --- a/src/lib/elm_colorselector.c +++ b/src/lib/elm_colorselector.c @@ -1835,7 +1835,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; @@ -1860,7 +1860,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 6948e45..3778d99 100644 --- a/src/lib/elm_datetime.c +++ b/src/lib/elm_datetime.c @@ -423,7 +423,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); @@ -444,18 +444,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 828b28a..9c42d76 100644 --- a/src/lib/elm_diskselector.c +++ b/src/lib/elm_diskselector.c @@ -889,12 +889,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)) @@ -922,7 +922,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; @@ -934,15 +934,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 485bcd5..ebe8af7 100644 --- a/src/lib/elm_entry.c +++ b/src/lib/elm_entry.c @@ -1074,7 +1074,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 99f7458..b1236f7 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 9552cdb..607c3cf 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 7720656..4a6f9b5 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 d1519ac..09e19dd 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -2685,6 +2685,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)) @@ -2772,6 +2791,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)) @@ -2846,6 +2884,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)) @@ -2903,6 +2960,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)) @@ -3177,14 +3253,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) && @@ -3196,17 +3272,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) { @@ -3267,7 +3347,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; @@ -3279,7 +3359,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 4d85549..d282b17 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -2688,9 +2688,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; } } @@ -3096,13 +3100,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) && @@ -3163,7 +3167,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; @@ -3206,7 +3210,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 ffb2c8c..2548d64 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 7c70351..f839742 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 139a903..16394a8 100644 --- a/src/lib/elm_index.c +++ b/src/lib/elm_index.c @@ -1013,7 +1013,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; @@ -1039,7 +1039,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 f6abc2c..237878b 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 2abb206..d7aceeb 100644 --- a/src/lib/elm_layout.c +++ b/src/lib/elm_layout.c @@ -395,7 +395,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); @@ -462,7 +462,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); @@ -481,7 +481,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 831c1e8..7d0a875 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; } @@ -1258,13 +1262,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) @@ -2402,7 +2406,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; @@ -2419,7 +2423,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 2d8a779..06904b3 100644 --- a/src/lib/elm_main.c +++ b/src/lib/elm_main.c @@ -1462,6 +1462,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 ea574e9..70173b2 100644 --- a/src/lib/elm_map.c +++ b/src/lib/elm_map.c @@ -3845,12 +3845,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 c48d41b..06b5817 100644 --- a/src/lib/elm_notify.c +++ b/src/lib/elm_notify.c @@ -340,7 +340,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; @@ -349,7 +349,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 ebe43c9..2d1af0b 100644 --- a/src/lib/elm_panel.c +++ b/src/lib/elm_panel.c @@ -275,7 +275,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; @@ -296,19 +296,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) @@ -493,7 +493,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 0f8d2a4..8479bd3 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 d20a252..83d030a 100644 --- a/src/lib/elm_photocam.c +++ b/src/lib/elm_photocam.c @@ -905,12 +905,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 68bcd8b..144259b 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 822f7c9..1c0d176 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 9472541..6afeb11 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; @@ -143,7 +144,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); return EINA_TRUE; } cur_weight = 1.0 / cur_weight; @@ -156,7 +157,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); return EINA_TRUE; } } @@ -165,13 +166,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) { @@ -188,7 +189,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); return EINA_TRUE; } } @@ -405,7 +406,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; @@ -419,7 +420,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; @@ -431,7 +432,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 3d0810d..836a3b6 100644 --- a/src/lib/elm_segment_control.c +++ b/src/lib/elm_segment_control.c @@ -642,7 +642,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; @@ -657,7 +657,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 0064d79..2f173be 100644 --- a/src/lib/elm_slider.c +++ b/src/lib/elm_slider.c @@ -1191,11 +1191,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 541bd72..b491fe0 100644 --- a/src/lib/elm_spinner.c +++ b/src/lib/elm_spinner.c @@ -743,10 +743,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)) @@ -1196,7 +1196,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; @@ -1219,7 +1219,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 33e69ab..1075884 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 b7b4bb7..ad4fc14 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -739,13 +739,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; @@ -2892,7 +2892,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; @@ -2912,7 +2912,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 4106693..ce38921 100644 --- a/src/lib/elm_web2.c +++ b/src/lib/elm_web2.c @@ -618,7 +618,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; @@ -626,7 +626,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 26944b2..8b82d79 100644 --- a/src/lib/elm_widget.c +++ b/src/lib/elm_widget.c @@ -437,7 +437,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)) @@ -836,7 +836,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; @@ -845,7 +845,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 @@ -858,7 +858,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)); elm_widget_focus_region_show(obj); } sd->focus_order_on_calc = EINA_FALSE; @@ -1863,10 +1863,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 */ @@ -1876,12 +1877,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); } } @@ -1916,7 +1917,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; } @@ -2376,7 +2377,7 @@ _elm_widget_focus_list_direction_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data * @ingroup Widget */ EOLIAN static Eina_Bool -_elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Direction dir, Evas_Object **next) +_elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item) { Elm_Access_Info *ac; @@ -2404,22 +2405,39 @@ _elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Directi 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) { @@ -2447,17 +2465,34 @@ _elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Directi 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; } @@ -2487,7 +2522,7 @@ _elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Directi * @ingroup Widget */ EOLIAN static Eina_Bool -_elm_widget_focus_list_next_get(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(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; @@ -2511,7 +2546,11 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, || (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 { @@ -2567,12 +2606,14 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, 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; @@ -2581,9 +2622,10 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, 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) @@ -2594,11 +2636,15 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, 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; @@ -2607,21 +2653,24 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, 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; } @@ -2694,6 +2743,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(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) { @@ -2761,7 +2848,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) @@ -2835,11 +2922,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; @@ -2888,7 +2975,7 @@ _elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd) } } } - _parent_focus(obj); + _parent_focus(obj, item); return; } @@ -3852,7 +3939,7 @@ _elm_widget_focus_mouse_up_handle(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSE { if (!obj) return; if (!_is_focusable(obj)) return; - elm_widget_focus_steal(obj); + elm_widget_focus_steal(obj, NULL); } EOLIAN static void @@ -5385,6 +5472,82 @@ _elm_widget_item_access_object_get(Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data return item->access_obj; } +EOLIAN static Evas_Object * +_elm_widget_item_focus_next_object_get(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(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 @@ -5531,7 +5694,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 e6996fa..8350dd8 100644 --- a/src/lib/elm_widget.eo +++ b/src/lib/elm_widget.eo @@ -481,19 +481,33 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte } } focus_next_object_set { - /*@ No description supplied by the EAPI. */ + /*Set the next object with specific focus direction.*/ params { @in Evas_Object *next; @in Elm_Focus_Direction dir; } } focus_next_object_get @const { - /*@ No description supplied by the EAPI. */ + /*Get the next object with specific focus direction.*/ return: Evas_Object *; params { @in Elm_Focus_Direction dir; } } + focus_next_item_set { + /*Set the next object item with specific focus direction.*/ + params { + @in Elm_Object_Item *next_item; + @in Elm_Focus_Direction dir; + } + } + focus_next_item_get @const { + /*Get the next object item with specific focus direction.*/ + return: Elm_Object_Item *; + params { + @in Elm_Focus_Direction dir; + } + } focus_tree_unfocusable_handle { /*@ No description supplied by the EAPI. */ } @@ -581,6 +595,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 EINA_TRUE if this widget can handle focus, EINA_FALSE otherwise */ + params { + @in Elm_Object_Item *item; + } return: bool; } on_focus_region { @@ -695,6 +712,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte params { @in Elm_Focus_Direction dir; @out Evas_Object *next; + @out Elm_Object_Item *next_item; } } translatable_part_text_get @const { @@ -732,7 +750,9 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte /*@ No description supplied by the EAPI. */ } focus_steal { - /*@ No description supplied by the EAPI. */ + params { + @in Elm_Object_Item *item; + } } focus_hide_handle { /*@ No description supplied by the EAPI. */ @@ -742,6 +762,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte params { @in Elm_Focus_Direction dir; @out Evas_Object *next; + @out Elm_Object_Item *next_item; } return: bool; } @@ -753,6 +774,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte @in list_data_get_func_type list_data_get; @in Elm_Focus_Direction dir; @out Evas_Object *next; + @out Elm_Object_Item *next_item; } } focus_mouse_up_handle { diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h index ca8bf55..b9cddd1 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 @@ -615,6 +617,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; @@ -679,11 +686,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); @@ -692,7 +701,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 431d237..c322298 100644 --- a/src/lib/elm_widget_item.eo +++ b/src/lib/elm_widget_item.eo @@ -722,6 +722,54 @@ 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. + + @ingroup General + @since 1.16 + */ + params { + Elm_Focus_Direction dir; + } + return: Evas_Object *; + } + focus_next_object_set { + /** + Set the next object with specific focus direction. + + @ingroup General + @since 1.16 + */ + params { + Evas_Object *next; + Elm_Focus_Direction dir; + } + } + focus_next_item_get @const { + /** + Get the next object item with specific focus direction. + + @ingroup General + @since 1.16 + */ + params { + Elm_Focus_Direction dir; + } + return: Elm_Object_Item *; + } + focus_next_item_set { + /** + Set the next object item with specific focus direction. + + @ingroup General + @since 1.16 + */ + params { + Elm_Object_Item *next_item; + Elm_Focus_Direction dir; + } + } } implements { Eo.Base.constructor; diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index d41b509..7c62abc 100644 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -1045,7 +1045,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 elm_widget_focus_restore(obj); @@ -1332,7 +1332,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); @@ -1350,7 +1350,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; } @@ -1388,10 +1388,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) @@ -1702,7 +1702,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 -- 2.7.4