From 17afe580d536e7f1dbe1e2428e6c3780874459bb Mon Sep 17 00:00:00 2001 From: WooHyun Jung Date: Mon, 31 Oct 2016 19:50:05 +0900 Subject: [PATCH] mobile_lib/ctxpopup: do refactoring for focus movement Change-Id: Iff7ea2351292f37cecf96f7524fc0f77a146228c --- src/mobile_lib/elc_ctxpopup.c | 93 +++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/src/mobile_lib/elc_ctxpopup.c b/src/mobile_lib/elc_ctxpopup.c index 14bcbd1..f85a4e9 100644 --- a/src/mobile_lib/elc_ctxpopup.c +++ b/src/mobile_lib/elc_ctxpopup.c @@ -76,22 +76,6 @@ _access_object_get(const Evas_Object *obj, const char* part) return ao; } -// FIXME: There are applications which do not use elm_win as top widget. -// This is workaround! Those could not use focus! -static Eina_Bool _focus_enabled(Evas_Object *obj) -{ - if (!elm_widget_focus_get(obj)) return EINA_FALSE; - - const Evas_Object *win = elm_widget_top_get(obj); - const char *type = evas_object_type_get(win); - - if (type && !strcmp(type, "elm_win")) - { - return elm_win_focus_highlight_enabled_get(win); - } - return EINA_FALSE; -} - 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_Object_Item **next_item) { @@ -143,8 +127,6 @@ _elm_ctxpopup_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Ctx EOLIAN static Eina_Bool _elm_ctxpopup_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight) { - Eina_Bool int_ret; - Eina_List *l = NULL; void *(*list_data_get)(const Eina_List *list); @@ -155,11 +137,11 @@ _elm_ctxpopup_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data l = eina_list_append(l, sd->box); - int_ret = elm_widget_focus_list_direction_get - (obj, base, l, list_data_get, degree, direction, direction_item, weight); + elm_widget_focus_list_direction_get + (obj, base, l, list_data_get, degree, direction, direction_item, weight); eina_list_free(l); - return int_ret; + return EINA_TRUE; } static Eina_Bool @@ -1214,48 +1196,63 @@ _elm_ctxpopup_elm_widget_event(Eo *obj, Elm_Ctxpopup_Data *sd, Evas_Object *src if (elm_widget_disabled_get(obj)) return EINA_FALSE; if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE; - if (!_focus_enabled(obj)) return EINA_FALSE; //FIXME: for this key event, _elm_ctxpopup_smart_focus_next should be done first - if ((!strcmp(ev->keyname, "Tab")) || - (!strcmp(ev->keyname, "ISO_Left_Tab"))) + if ((!strcmp(ev->key, "Tab")) || + (!strcmp(ev->key, "ISO_Left_Tab"))) { + Eina_Bool ret; + Evas_Object *target = NULL; + Elm_Object_Item *target_item = NULL; + Elm_Focus_Direction dir; + + if (evas_key_modifier_is_set(ev->modifiers, "Control") || + evas_key_modifier_is_set(ev->modifiers, "Alt")) + return EINA_FALSE; + if (evas_key_modifier_is_set(ev->modifiers, "Shift")) + dir = ELM_FOCUS_PREVIOUS; + else + dir = ELM_FOCUS_NEXT; + + ret = elm_widget_focus_next_get(sd->box, dir, &target, &target_item); + if (ret) elm_widget_focus_steal(target, target_item); + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; return EINA_TRUE; } ///// - if (((!strcmp(ev->keyname, "Left")) || - (!strcmp(ev->keyname, "KP_Left")) || - (!strcmp(ev->keyname, "Right")) || - (!strcmp(ev->keyname, "KP_Right")) || - (!strcmp(ev->keyname, "Up")) || - (!strcmp(ev->keyname, "KP_Up")) || - (!strcmp(ev->keyname, "Down")) || - (!strcmp(ev->keyname, "KP_Down"))) && (!ev->string)) + if (((!strcmp(ev->key, "Left")) || + (!strcmp(ev->key, "KP_Left")) || + (!strcmp(ev->key, "Right")) || + (!strcmp(ev->key, "KP_Right")) || + (!strcmp(ev->key, "Up")) || + (!strcmp(ev->key, "KP_Up")) || + (!strcmp(ev->key, "Down")) || + (!strcmp(ev->key, "KP_Down"))) && (!ev->string)) { double degree = 0.0; - if ((!strcmp(ev->keyname, "Left")) || - (!strcmp(ev->keyname, "KP_Left"))) + if ((!strcmp(ev->key, "Left")) || + (!strcmp(ev->key, "KP_Left"))) degree = 270.0; - else if ((!strcmp(ev->keyname, "Right")) || - (!strcmp(ev->keyname, "KP_Right"))) + else if ((!strcmp(ev->key, "Right")) || + (!strcmp(ev->key, "KP_Right"))) degree = 90.0; - else if ((!strcmp(ev->keyname, "Up")) || - (!strcmp(ev->keyname, "KP_Up"))) + else if ((!strcmp(ev->key, "Up")) || + (!strcmp(ev->key, "KP_Up"))) degree = 0.0; - else if ((!strcmp(ev->keyname, "Down")) || - (!strcmp(ev->keyname, "KP_Down"))) + else if ((!strcmp(ev->key, "Down")) || + (!strcmp(ev->key, "KP_Down"))) degree = 180.0; elm_widget_focus_direction_go(sd->box, degree); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; return EINA_TRUE; } - else if (((!strcmp(ev->keyname, "Home")) || - (!strcmp(ev->keyname, "KP_Home")) || - (!strcmp(ev->keyname, "Prior")) || - (!strcmp(ev->keyname, "KP_Prior"))) && (!ev->string)) + else if (((!strcmp(ev->key, "Home")) || + (!strcmp(ev->key, "KP_Home")) || + (!strcmp(ev->key, "Prior")) || + (!strcmp(ev->key, "KP_Prior"))) && (!ev->string)) { Elm_Ctxpopup_Item_Data *it = eina_list_data_get(sd->items); Evas_Object *btn = it->btn; @@ -1263,10 +1260,10 @@ _elm_ctxpopup_elm_widget_event(Eo *obj, Elm_Ctxpopup_Data *sd, Evas_Object *src ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; return EINA_TRUE; } - else if (((!strcmp(ev->keyname, "End")) || - (!strcmp(ev->keyname, "KP_End")) || - (!strcmp(ev->keyname, "Next")) || - (!strcmp(ev->keyname, "KP_Next"))) && (!ev->string)) + else if (((!strcmp(ev->key, "End")) || + (!strcmp(ev->key, "KP_End")) || + (!strcmp(ev->key, "Next")) || + (!strcmp(ev->key, "KP_Next"))) && (!ev->string)) { Elm_Ctxpopup_Item_Data *it = eina_list_data_get(eina_list_last(sd->items)); Evas_Object *btn = it->btn; -- 2.7.4