From e29b0b64b4e665c6cf3c96e33e7134a58b328dd3 Mon Sep 17 00:00:00 2001 From: Tiago Rezende Campos Falcao Date: Fri, 1 Oct 2010 19:02:58 +0000 Subject: [PATCH] Adding focus cycle hook to Inwin and Frame. SVN revision: 52960 --- legacy/elementary/src/bin/test_focus.c | 47 +++++++++++++++++--------- legacy/elementary/src/lib/elm_frame.c | 28 +++++++++++++++ legacy/elementary/src/lib/elm_win.c | 20 ++++++++++- 3 files changed, 78 insertions(+), 17 deletions(-) diff --git a/legacy/elementary/src/bin/test_focus.c b/legacy/elementary/src/bin/test_focus.c index 8cbad69b9b..cfa0ca5476 100644 --- a/legacy/elementary/src/bin/test_focus.c +++ b/legacy/elementary/src/bin/test_focus.c @@ -260,22 +260,37 @@ test_focus(void *data, Evas_Object *obj, void *event_info) } {//Third Col - Evas_Object *tb = elm_table_add(win); - evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_box_pack_end(mainbx, tb); - my_show(tb); - for (j = 0; j < 3; j++) - for (i = 0; i < 3; i++) - { - Evas_Object *bt; - bt = elm_button_add(win); - elm_button_label_set(bt, "Button"); - evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, - EVAS_HINT_FILL); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_table_pack(tb, bt, i, j, 1, 1); - my_show(bt); - } + Evas_Object *bx = elm_box_add(win); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, + EVAS_HINT_EXPAND); + elm_box_pack_end(mainbx, bx); + my_show(bx); + + { + Evas_Object *fr = elm_frame_add(win); + elm_frame_label_set(fr, "Frame"); + elm_box_pack_end(bx, fr); + evas_object_show(fr); + + { + Evas_Object *tb = elm_table_add(win); + evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_frame_content_set(fr, tb); + my_show(tb); + for (j = 0; j < 3; j++) + for (i = 0; i < 3; i++) + { + Evas_Object *bt; + bt = elm_button_add(win); + elm_button_label_set(bt, "Table"); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, + EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_table_pack(tb, bt, i, j, 1, 1); + my_show(bt); + } + } + } } { //Panel diff --git a/legacy/elementary/src/lib/elm_frame.c b/legacy/elementary/src/lib/elm_frame.c index 9ef0bb3e49..7d4e8567f4 100644 --- a/legacy/elementary/src/lib/elm_frame.c +++ b/legacy/elementary/src/lib/elm_frame.c @@ -46,6 +46,33 @@ _theme_hook(Evas_Object *obj) _sizing_eval(obj); } +static Eina_Bool +_elm_frame_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool circular) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *cur; + + if ((!wd) || (!wd->content)) + return EINA_FALSE; + + cur = wd->content; + + /* Try Focus cycle in subitem */ + if (elm_widget_focus_cycle(cur, dir, circular)) + return EINA_TRUE; + /* Ignore focused subitem */ + if (elm_widget_focus_get(cur) && (!circular)) + return EINA_FALSE; + /* Try give the focus to sub item*/ + if (elm_widget_can_focus_get(cur)) + { + elm_widget_focus_steal(cur); + return EINA_TRUE; + } + + return EINA_FALSE; +} + static void _sizing_eval(Evas_Object *obj) { @@ -107,6 +134,7 @@ elm_frame_add(Evas_Object *parent) elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); elm_widget_theme_hook_set(obj, _theme_hook); + elm_widget_focus_cycle_hook_set(obj, _elm_frame_focus_cycle_hook); elm_widget_can_focus_set(obj, EINA_FALSE); wd->frm = edje_object_add(e); diff --git a/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c index 241ac60062..0c62155dbe 100644 --- a/legacy/elementary/src/lib/elm_win.c +++ b/legacy/elementary/src/lib/elm_win.c @@ -133,7 +133,7 @@ _elm_win_focus_out(Ecore_Evas *ee) } static Eina_Bool -_elm_win_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool circular) +_elm_win_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool circular __UNUSED__) { Elm_Win *wd = elm_widget_data_get(obj); Eina_List *items; @@ -143,6 +143,8 @@ _elm_win_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool c if ((!wd) || (!wd->subobjs)) return EINA_FALSE; + circular = EINA_TRUE; + /* Focus chain */ /* TODO: Change this to use other chain */ items = wd->subobjs; @@ -2055,6 +2057,21 @@ _theme_hook(Evas_Object *obj) _sizing_eval(obj); } +static Eina_Bool +_elm_inwin_focus_cycle_hook(Evas_Object *obj, Elm_Focus_Direction dir, Eina_Bool circular __UNUSED__) +{ + Widget_Data *wd = elm_widget_data_get(obj); + Evas_Object *cur; + + if ((!wd) || (!wd->content)) + return EINA_FALSE; + + cur = wd->content; + + /* Try Focus cycle in subitem */ + return elm_widget_focus_cycle(cur, dir, EINA_TRUE); +} + static void _sizing_eval(Evas_Object *obj) { @@ -2114,6 +2131,7 @@ elm_win_inwin_add(Evas_Object *obj) elm_widget_data_set(obj2, wd); elm_widget_del_hook_set(obj2, _del_hook); elm_widget_theme_hook_set(obj2, _theme_hook); + elm_widget_focus_cycle_hook_set(obj2, _elm_inwin_focus_cycle_hook); elm_widget_can_focus_set(obj2, EINA_FALSE); wd->frm = edje_object_add(win->evas);