mobile_lib/ctxpopup: do refactoring for focus movement 40/94540/2
authorWooHyun Jung <wh0705.jung@samsung.com>
Mon, 31 Oct 2016 10:50:05 +0000 (19:50 +0900)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Tue, 1 Nov 2016 00:57:12 +0000 (17:57 -0700)
Change-Id: Iff7ea2351292f37cecf96f7524fc0f77a146228c

src/mobile_lib/elc_ctxpopup.c

index 14bcbd1..f85a4e9 100644 (file)
@@ -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;