From 20b61442a71309e5feed9038bf802ed016bd0b3a Mon Sep 17 00:00:00 2001 From: Anil Kumar Nahak Date: Mon, 21 Jul 2014 18:55:55 +0900 Subject: [PATCH] Focus: first item should be focused when there is no focused/selected item Summary: First item of widget should be focused when focus comes to the widget for first time. Test Plan: elementary_test -to "Genlist Focus" elementary_test -to "Gengrid Focus" elementary_test -to "List Focus" elementary_test -to "toolbar Focus" Reviewers: seoz Differential Revision: https://phab.enlightenment.org/D1135 --- config/default/base.src.in | 1 + config/mobile/base.src.in | 1 + config/standard/base.src.in | 1 + src/bin/test_gengrid.c | 17 +++++++++++++++++ src/bin/test_genlist.c | 17 +++++++++++++++++ src/bin/test_list.c | 17 +++++++++++++++++ src/bin/test_toolbar.c | 17 +++++++++++++++++ src/lib/elm_config.c | 17 +++++++++++++++++ src/lib/elm_config.h | 22 ++++++++++++++++++++++ src/lib/elm_gengrid.c | 5 ++--- src/lib/elm_genlist.c | 5 ++--- src/lib/elm_list.c | 7 +++---- src/lib/elm_priv.h | 1 + src/lib/elm_toolbar.c | 8 ++++---- 14 files changed, 122 insertions(+), 14 deletions(-) diff --git a/config/default/base.src.in b/config/default/base.src.in index db264a0..cc3793e 100644 --- a/config/default/base.src.in +++ b/config/default/base.src.in @@ -47,6 +47,7 @@ group "Elm_Config" struct { value "focus_highlight_animate" uchar: 0; value "focus_highlight_clip_disable" uchar: 0; value "item_select_on_focus_disable" uchar: 0; + value "first_item_focus_on_first_focusin" uchar: 1; value "focus_move_policy" uchar: 0; value "toolbar_shrink_mode" int: 3; value "fileselector_expand_enable" uchar: 0; diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in index 58da35d..e09332d 100644 --- a/config/mobile/base.src.in +++ b/config/mobile/base.src.in @@ -47,6 +47,7 @@ group "Elm_Config" struct { value "focus_highlight_animate" uchar: 0; value "focus_highlight_clip_disable" uchar: 0; value "item_select_on_focus_disable" uchar: 0; + value "first_item_focus_on_first_focusin" uchar: 1; value "focus_move_policy" uchar: 0; value "toolbar_shrink_mode" int: 3; value "fileselector_expand_enable" uchar: 0; diff --git a/config/standard/base.src.in b/config/standard/base.src.in index 1f7594d..cb2ae46 100644 --- a/config/standard/base.src.in +++ b/config/standard/base.src.in @@ -47,6 +47,7 @@ group "Elm_Config" struct { value "focus_highlight_animate" uchar: 0; value "focus_highlight_clip_disable" uchar: 1; value "item_select_on_focus_disable" uchar: 0; + value "first_item_focus_on_first_focusin" uchar: 1; value "focus_move_policy" uchar: 0; value "toolbar_shrink_mode" int: 3; value "fileselector_expand_enable" uchar: 1; diff --git a/src/bin/test_gengrid.c b/src/bin/test_gengrid.c index ba69f37..71b3ba6 100644 --- a/src/bin/test_gengrid.c +++ b/src/bin/test_gengrid.c @@ -1445,6 +1445,13 @@ _gg_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); } +static void +_gg_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + void test_gengrid_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, @@ -1568,6 +1575,16 @@ test_gengrid_focus(void *data EINA_UNUSED, elm_box_pack_end(bx_opt, ck); evas_object_show(ck); + ck = elm_check_add(bx_opt); + elm_object_text_set(ck, "First item focus on first focus in"); + elm_check_state_set(ck, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(ck, "changed", + _gg_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, ck); + evas_object_show(ck); + // Focus Autoscroll Mode fr = _focus_autoscroll_mode_frame_create(bx); elm_box_pack_end(bx, fr); diff --git a/src/bin/test_genlist.c b/src/bin/test_genlist.c index bba0086..d553be5 100644 --- a/src/bin/test_genlist.c +++ b/src/bin/test_genlist.c @@ -4032,6 +4032,12 @@ _gl_focus_item_select_on_focus_disable_changed_cb(void *data EINA_UNUSED, Evas_O elm_config_item_select_on_focus_disabled_set(elm_check_state_get(obj)); } +static void +_gl_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} static Eina_Bool _focus_timer_cb(void *data) { @@ -4324,6 +4330,17 @@ test_genlist_focus(void *data EINA_UNUSED, elm_box_pack_end(bx_opt, chk); evas_object_show(chk); + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + _gl_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + + // Focus Autoscroll Mode fr = _focus_autoscroll_mode_frame_create(bx); elm_box_pack_end(bx, fr); diff --git a/src/bin/test_list.c b/src/bin/test_list.c index be96c75..e6a2967 100644 --- a/src/bin/test_list.c +++ b/src/bin/test_list.c @@ -1327,6 +1327,13 @@ test_list_focus_item_select_on_focus_disable_changed(void *data EINA_UNUSED, Eva } static void +test_list_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +static void _item_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) { printf("%s: %p\n", (char *)data, event_info); @@ -1534,6 +1541,16 @@ _test_list_focus(const char *name, const char *title, Eina_Bool horiz) elm_box_pack_end(bx_opt, chk); evas_object_show(chk); + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + evas_object_smart_callback_add(chk, "changed", + test_list_first_item_focus_on_first_focus_in_cb, + NULL); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + // Focus Autoscroll Mode fr = _focus_autoscroll_mode_frame_create(bx); elm_box_pack_end(bx, fr); diff --git a/src/bin/test_toolbar.c b/src/bin/test_toolbar.c index f535958..11c0757 100644 --- a/src/bin/test_toolbar.c +++ b/src/bin/test_toolbar.c @@ -1081,6 +1081,13 @@ _test_toolbar_focus_focus_animate_check_changed(void *data, Evas_Object *obj, } static void +_test_toolbar_first_item_focus_on_first_focus_in_cb(void *data EINA_UNUSED, Evas_Object *obj, + void *event_info EINA_UNUSED) +{ + elm_config_first_item_focus_on_first_focusin_set(elm_check_state_get(obj)); +} + +static void _toolbar_focus_key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { @@ -1223,6 +1230,16 @@ test_toolbar_focus(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *e _test_toolbar_focus_focus_animate_check_changed, win); + chk = elm_check_add(bx_opt); + elm_object_text_set(chk, "First item focus on first focus in"); + elm_check_state_set(chk, elm_config_first_item_focus_on_first_focusin_get()); + evas_object_size_hint_weight_set(chk, EVAS_HINT_EXPAND, 0.0); + elm_box_pack_end(bx_opt, chk); + evas_object_show(chk); + evas_object_smart_callback_add(chk, "changed", + _test_toolbar_first_item_focus_on_first_focus_in_cb, + win); + // Focus Autoscroll Mode fr = _focus_autoscroll_mode_frame_create(bx); elm_box_pack_end(bx, fr); diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c index b308928..96430ce 100644 --- a/src/lib/elm_config.c +++ b/src/lib/elm_config.c @@ -529,6 +529,7 @@ _desc_init(void) ELM_CONFIG_VAL(D, T, focus_move_policy, T_UCHAR); ELM_CONFIG_VAL(D, T, focus_autoscroll_mode, T_UCHAR); ELM_CONFIG_VAL(D, T, item_select_on_focus_disable, T_UCHAR); + ELM_CONFIG_VAL(D, T, first_item_focus_on_first_focus_in, T_UCHAR); ELM_CONFIG_VAL(D, T, toolbar_shrink_mode, T_INT); ELM_CONFIG_VAL(D, T, fileselector_expand_enable, T_UCHAR); ELM_CONFIG_VAL(D, T, fileselector_double_tap_navigation_enable, T_UCHAR); @@ -1546,6 +1547,7 @@ _config_load(void) _elm_config->focus_highlight_animate = EINA_TRUE; _elm_config->focus_highlight_clip_disable = EINA_FALSE; _elm_config->focus_move_policy = ELM_FOCUS_MOVE_POLICY_CLICK; + _elm_config->first_item_focus_on_first_focus_in = EINA_FALSE; _elm_config->item_select_on_focus_disable = EINA_TRUE; _elm_config->toolbar_shrink_mode = 2; _elm_config->fileselector_expand_enable = EINA_FALSE; @@ -2166,6 +2168,9 @@ _env_get(void) s = getenv("ELM_ITEM_SELECT_ON_FOCUS_DISABLE"); if (s) _elm_config->item_select_on_focus_disable = !!atoi(s); + s = getenv("ELM_FIRST_ITEM_FOCUS_ON_FIRST_FOCUS_IN"); + if (s) _elm_config->first_item_focus_on_first_focus_in = !!atoi(s); + s = getenv("ELM_TOOLBAR_SHRINK_MODE"); if (s) _elm_config->toolbar_shrink_mode = atoi(s); @@ -2736,6 +2741,18 @@ elm_config_item_select_on_focus_disabled_set(Eina_Bool disable) } EAPI Eina_Bool +elm_config_first_item_focus_on_first_focusin_get(void) +{ + return _elm_config->first_item_focus_on_first_focus_in; +} + +EAPI void +elm_config_first_item_focus_on_first_focusin_set(Eina_Bool enable) +{ + _elm_config->first_item_focus_on_first_focus_in = !!enable; +} + +EAPI Eina_Bool elm_config_scroll_bounce_enabled_get(void) { return _elm_config->thumbscroll_bounce_enable; diff --git a/src/lib/elm_config.h b/src/lib/elm_config.h index 9d29f37..7cf9a59 100644 --- a/src/lib/elm_config.h +++ b/src/lib/elm_config.h @@ -1343,6 +1343,28 @@ EAPI Eina_Bool elm_config_item_select_on_focus_disabled_get(void); EAPI void elm_config_item_select_on_focus_disabled_set(Eina_Bool enabled); /** + * Get status of first item focus on first focusin feature. + * + * @return The first item focus on first focusin status + * + * @see elm_config_first_item_focus_on_first_focusin_set + * @since 1.11 + * @ingroup Focus + */ +EAPI Eina_Bool elm_config_first_item_focus_on_first_focusin_get(void); + +/** + * Set the first item focus on first focusin feature. + * + * @param enable first_item_focus_on_first_focusin if @c EINA_TRUE, enable otherwise + * + * @see elm_config_first_item_focus_on_first_focusin_get + * @since 1.11 + * @ingroup Focus + */ +EAPI void elm_config_first_item_focus_on_first_focusin_set(Eina_Bool enabled); + +/** * Get the system mirrored mode. This determines the default mirrored mode * of widgets. * diff --git a/src/lib/elm_gengrid.c b/src/lib/elm_gengrid.c index e4c28f9..eb94d5f 100644 --- a/src/lib/elm_gengrid.c +++ b/src/lib/elm_gengrid.c @@ -2949,13 +2949,12 @@ _elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd) it = sd->last_focused_item; else if (sd->last_selected_item) it = sd->last_selected_item; - /* TODO: make it optional on 1.11. Disable this until then - else if (elm_widget_focus_highlight_enabled_get(obj)) + else if (_elm_config->first_item_focus_on_first_focus_in && + elm_widget_focus_highlight_enabled_get(obj)) { it = elm_gengrid_first_item_get(obj); is_sel = EINA_TRUE; } - */ if (it) { diff --git a/src/lib/elm_genlist.c b/src/lib/elm_genlist.c index cdf9456..7857d37 100644 --- a/src/lib/elm_genlist.c +++ b/src/lib/elm_genlist.c @@ -2932,13 +2932,12 @@ _elm_genlist_elm_widget_on_focus(Eo *obj, Elm_Genlist_Data *sd) it = sd->last_focused_item; else if (sd->last_selected_item) it = sd->last_selected_item; - /* TODO: make it optional on 1.11. Disable this until then - else if (elm_widget_focus_highlight_enabled_get(obj)) + else if (_elm_config->first_item_focus_on_first_focus_in && + elm_widget_focus_highlight_enabled_get(obj)) { it = elm_genlist_first_item_get(obj); is_sel = EINA_TRUE; } - */ if (it) { diff --git a/src/lib/elm_list.c b/src/lib/elm_list.c index 09b1649..fa9c03a 100644 --- a/src/lib/elm_list.c +++ b/src/lib/elm_list.c @@ -1223,13 +1223,12 @@ _elm_list_elm_widget_on_focus(Eo *obj, Elm_List_Data *sd) it = sd->last_focused_item; else if (sd->last_selected_item) it = sd->last_selected_item; - /* TODO: make it optional on 1.11 - else if (elm_widget_focus_highlight_enabled_get(obj)) + else if (_elm_config->first_item_focus_on_first_focus_in && + elm_widget_focus_highlight_enabled_get(obj)) { - it = eina_list_data_get(sd->items); + it = elm_list_first_item_get(obj); is_sel = EINA_TRUE; } - */ if (it) { diff --git a/src/lib/elm_priv.h b/src/lib/elm_priv.h index e84bad5..c8d3e97 100644 --- a/src/lib/elm_priv.h +++ b/src/lib/elm_priv.h @@ -230,6 +230,7 @@ struct _Elm_Config unsigned char focus_highlight_clip_disable; /**< This shows disabled status of focus highlight clip feature. This value is false by default so the focus highlight is clipped. */ unsigned char focus_move_policy; /**< This show how the elementary focus is moved to another object. Focus can be moved by click or mouse_in. */ unsigned char item_select_on_focus_disable; /**< This shows the disabled status of select on focus feature. This value is false by default so that select on focus feature is enabled by default.*/ + unsigned char first_item_focus_on_first_focus_in; /**< This sets the first item focus on first focus in feature*/ Elm_Focus_Autoscroll_Mode focus_autoscroll_mode; /**< This shows the focus auto scroll mode. By default, @c ELM_FOCUS_AUTOSCROLL_MODE_SHOW is set. */ int toolbar_shrink_mode; unsigned char fileselector_expand_enable; diff --git a/src/lib/elm_toolbar.c b/src/lib/elm_toolbar.c index fdaa4e0..5467739 100644 --- a/src/lib/elm_toolbar.c +++ b/src/lib/elm_toolbar.c @@ -740,10 +740,10 @@ _elm_toolbar_elm_widget_on_focus(Eo *obj, Elm_Toolbar_Data *sd) { if (sd->last_focused_item) it = sd->last_focused_item; - /* TODO: make it optional on 1.11. Disable this until then - else - it = (Elm_Object_Item *)ELM_TOOLBAR_ITEM_FROM_INLIST(sd->items); - */ + else if (_elm_config->first_item_focus_on_first_focus_in && + elm_widget_focus_highlight_enabled_get(obj)) + it = elm_toolbar_first_item_get(obj); + if (it) { it = _elm_toolbar_nearest_visible_item_get(obj, it); -- 2.7.4