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
This commit is contained in:
Jaehwan Kim 2015-09-15 19:41:51 +09:00
parent fcb26c4b91
commit 0dedfc9248
47 changed files with 567 additions and 176 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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:

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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))

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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.
*

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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))

View File

@ -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);

View File

@ -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))

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -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))

View File

@ -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

View File

@ -5,6 +5,8 @@
*/
typedef Eo Elm_Object_Item;
typedef enum _Elm_Focus_Direction Elm_Focus_Direction;
/**
* @typedef Elm_Object_Item_Signal_Cb
*

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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))

View File

@ -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))

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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))
{

View File

@ -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 {

View File

@ -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);

View File

@ -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;

View File

@ -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