focus: add the focus_direction feature about item. 63/48763/2
authorJaehwan Kim <jae.hwan.kim@samsung.com>
Fri, 25 Sep 2015 06:24:53 +0000 (15:24 +0900)
committerJaehwan Kim <jae.hwan.kim@samsung.com>
Wed, 30 Sep 2015 02:44:51 +0000 (19:44 -0700)
When the focus is moved, it uses focus_direction instead of
focus_origin.
It can get the focus by using the geometry of previous focused object or item

@feature

Conflicts:
src/lib/elm_general.eot
src/lib/elm_gengrid.c
src/lib/elm_gengrid.eo
src/lib/elm_widget.c
src/lib/elm_widget.eo

Change-Id: Ibb833c0fa870abac48795f3c63ec738ffffb82ea
origin: upstream

20 files changed:
src/lib/elc_ctxpopup.c
src/lib/elc_fileselector.c
src/lib/elc_naviframe.c
src/lib/elc_popup.c
src/lib/elm_box.c
src/lib/elm_bubble.c
src/lib/elm_flip.c
src/lib/elm_focus.h
src/lib/elm_frame.c
src/lib/elm_gengrid.c
src/lib/elm_gengrid.eo
src/lib/elm_grid.c
src/lib/elm_layout.c
src/lib/elm_notify.c
src/lib/elm_spinner.c
src/lib/elm_table.c
src/lib/elm_widget.c
src/lib/elm_widget.eo
src/lib/elm_widget.h
src/lib/elm_win.c

index 2d64c392658c6ddf545e175bda42b739d374cffe..7c7ccc96e85f9194e77cc657a857fb62d1c86e6c 100644 (file)
@@ -86,7 +86,7 @@ _elm_ctxpopup_elm_widget_focus_next(Eo *obj EINA_UNUSED, Elm_Ctxpopup_Data *sd,
 }
 
 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, double *weight)
+_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;
 
@@ -101,7 +101,7 @@ _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, weight);
+            (obj, base, l, list_data_get, degree, direction, direction_item, weight);
    eina_list_free(l);
 
    return int_ret;
index 0793e244529268d9f2bf07a1cd53ed78c9d05585..25e03d800aff638344f1077389e3cb609a7aa399 100644 (file)
@@ -2364,7 +2364,7 @@ _elm_fileselector_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm
 }
 
 EOLIAN static Eina_Bool
-_elm_fileselector_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Fileselector_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_fileselector_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Fileselector_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Eina_List *items = NULL;
 
@@ -2377,7 +2377,7 @@ _elm_fileselector_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Fileselect
    if (sd->ok_button) items = eina_list_append(items, sd->ok_button);
 
    elm_widget_focus_list_direction_get
-     (obj, base, items, eina_list_data_get, degree, direction, weight);
+     (obj, base, items, eina_list_data_get, degree, direction, direction_item, weight);
 
    eina_list_free(items);
 
index e232bd332302c67cb1218ec3026272d230fb4fea..ca10f08cf060ae1bbfeeb7cacef5b3e575286208 100644 (file)
@@ -1323,7 +1323,7 @@ _elm_naviframe_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Na
 }
 
 EOLIAN static Eina_Bool
-_elm_naviframe_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_naviframe_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Naviframe_Data *sd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Eina_Bool int_ret;
 
@@ -1340,7 +1340,7 @@ _elm_naviframe_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Naviframe_Dat
    l = eina_list_append(l, VIEW(top_it));
 
    int_ret = elm_widget_focus_list_direction_get
-            (obj, base, l, list_data_get, degree, direction, weight);
+            (obj, base, l, list_data_get, degree, direction, direction_item, weight);
 
    eina_list_free(l);
 
index 78c6bd543f5799d08e0baeaa8d54658c5826e64e..a28f8529483f808149a9a6a85fc8e3412a9e1f7b 100644 (file)
@@ -1302,7 +1302,7 @@ _elm_popup_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Popup_
 }
 
 EOLIAN static Eina_Bool
-_elm_popup_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_popup_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Evas_Object *ao;
    Eina_List *items = NULL;
@@ -1326,7 +1326,7 @@ _elm_popup_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Popup_Data *sd, c
    items = eina_list_merge(items, base_items);
 
    elm_widget_focus_list_direction_get
-     (sd->main_layout, base, items, eina_list_data_get, degree, direction, weight);
+     (sd->main_layout, base, items, eina_list_data_get, degree, direction, direction_item, weight);
    eina_list_free(items);
 
    return EINA_TRUE;
index 0a0e21c99e89fe69feac39cc13eb1aafa22d3f7e..9577268a4ae63123c0a047256e9ad6314eefeacd 100644 (file)
@@ -86,7 +86,7 @@ _elm_box_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Box_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_box_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Box_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_box_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Box_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    const Eina_List *items;
    void *(*list_data_get)(const Eina_List *list);
@@ -105,7 +105,7 @@ _elm_box_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Box_Data *_pd EINA_
         if (!items) return EINA_FALSE;
      }
    return elm_widget_focus_list_direction_get
-            (obj, base, items, list_data_get, degree, direction, weight);
+            (obj, base, items, list_data_get, degree, direction, direction_item, weight);
 }
 
 EOLIAN static Eina_Bool
index 70f261c8543114b0d23436ce3519b3f08a544e32..cd23f19bc34fd6c1a52b456306a2fcde3865d7d6 100644 (file)
@@ -98,7 +98,7 @@ _elm_bubble_elm_widget_focus_next(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED, Elm
 }
 
 EOLIAN static Eina_Bool
-_elm_bubble_elm_widget_focus_direction(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_bubble_elm_widget_focus_direction(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Evas_Object *content;
 
@@ -108,7 +108,7 @@ _elm_bubble_elm_widget_focus_direction(Eo *obj, Elm_Bubble_Data *_pd EINA_UNUSED
 
    /* Try Focus cycle in subitem */
    return elm_widget_focus_direction_get
-            (content, base, degree, direction, weight);
+            (content, base, degree, direction, direction_item, weight);
 }
 
 EOLIAN static Eina_Bool
index b1236f786ba5b2114ab208c450c43a43fdf325a5..ed0d12be9ade4c881dd1cad7a6dc3fe96c2621e1 100644 (file)
@@ -132,7 +132,7 @@ _elm_flip_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Flip_Da
 }
 
 EOLIAN static Eina_Bool
-_elm_flip_elm_widget_focus_direction(Eo *obj, Elm_Flip_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_flip_elm_widget_focus_direction(Eo *obj, Elm_Flip_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Eina_Bool ret;
 
@@ -147,7 +147,7 @@ _elm_flip_elm_widget_focus_direction(Eo *obj, Elm_Flip_Data *sd, const Evas_Obje
      l = eina_list_append(l, sd->back.content);
 
    ret = elm_widget_focus_list_direction_get
-            (obj, base, l, list_data_get, degree, direction, weight);
+            (obj, base, l, list_data_get, degree, direction, direction_item, weight);
 
    eina_list_free(l);
 
index a4a5fc315c9434dcb734dabceaa568207ed674df..dc53e68e54bac300c20c3ae326aa811a6272e01f 100644 (file)
@@ -46,8 +46,6 @@ typedef enum
    ELM_FOCUS_DOWN,     /**< down direction */
    ELM_FOCUS_RIGHT,    /**< right direction */
    ELM_FOCUS_LEFT,      /**< left direction */
-   ELM_FOCUS_MOUSE,      /**< direction is from mouse */
-   ELM_FOCUS_REVERT      /**< direction is from focus revert */
 } Elm_Focus_Direction;
 
 /**
index 4a6f9b5876416fada2d4cdf4d53be1762f48d0f3..53c4b17ec6292e68cd3bd4d44a892a79aec4a36c 100644 (file)
@@ -80,7 +80,7 @@ _elm_frame_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Frame_
 }
 
 EOLIAN static Eina_Bool
-_elm_frame_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Frame_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_frame_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Frame_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Evas_Object *content;
 
@@ -92,7 +92,7 @@ _elm_frame_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Frame_Data *_pd E
      {
         /* Try to cycle focus on content */
         return elm_widget_focus_direction_get
-           (content, base, degree, direction, weight);
+           (content, base, degree, direction, direction_item, weight);
      }
 }
 
index 058dda3b853a4c510e69d7ba64b2895e63301ffb..6c591f09ee0323555f05647637819762742b3018 100644 (file)
@@ -3218,47 +3218,11 @@ _elm_gengrid_nearest_visible_item_get(Evas_Object *obj, Elm_Object_Item *eo_it)
    return eo_it;
 }
 
-static Elm_Object_Item *
-_elm_gengrid_direction_item_get(Evas_Object *obj, Elm_Focus_Direction dir)
-{
-   double max_weight = 0.0, weight = 0.0;
-   Eina_List *item_list = NULL, *l = NULL;
-   Elm_Object_Item *eo_item = NULL, *best_item = NULL;
-   Evas_Object *fobj = _elm_widget_focus_highlight_object_get(obj);
-
-   double degree = 0.0;
-   if (dir == ELM_FOCUS_UP) degree = 0.0;
-   else if (dir == ELM_FOCUS_DOWN) degree = 180.0;
-   else if (dir == ELM_FOCUS_RIGHT) degree = 90.0;
-   else if (dir == ELM_FOCUS_LEFT) degree = 270.0;
-
-   item_list = elm_gengrid_realized_items_get(obj);
-   best_item = elm_gengrid_first_item_get(obj);
-
-   EINA_LIST_FOREACH(item_list, l, eo_item)
-     {
-        ELM_GENGRID_ITEM_DATA_GET(eo_item, item);
-        weight = _elm_widget_focus_direction_weight_get(fobj, VIEW(item), degree);
-        if ((weight == -1.0) ||
-            ((weight != 0.0) && (max_weight != -1.0) &&
-             ((int)(max_weight * 100000000) < (int)(weight * 100000000))))
-          {
-             best_item = eo_item;
-             max_weight = weight;
-          }
-     }
-   eina_list_free(item_list);
-
-   return best_item;
-}
-
 EOLIAN static Eina_Bool
 _elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd, Elm_Object_Item *item)
 {
    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(NULL));
    if (!int_ret) return EINA_FALSE;
@@ -3275,25 +3239,20 @@ _elm_gengrid_elm_widget_on_focus(Eo *obj, Elm_Gengrid_Data *sd, Elm_Object_Item
         if (item) eo_it = item;
         else
           {
-             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)
+             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;
-               }
+               eo_it = elm_gengrid_first_item_get(obj);
           }
         if (eo_it)
           {
              eo_it = _elm_gengrid_nearest_visible_item_get(obj, eo_it);
              if (eo_it)
                {
-                  if (!_elm_config->item_select_on_focus_disable && is_sel)
+                  if (!_elm_config->item_select_on_focus_disable &&
+                      eo_it != sd->last_selected_item)
                     elm_gengrid_item_selected_set(eo_it, EINA_TRUE);
                   else
                     elm_object_item_focus_set(eo_it, EINA_TRUE);
@@ -3340,12 +3299,6 @@ _elm_gengrid_elm_widget_focus_next_manager_is(Eo *obj EINA_UNUSED, Elm_Gengrid_D
    return _elm_gengrid_smart_focus_next_enable;
 }
 
-EOLIAN static Eina_Bool
-_elm_gengrid_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *_pd EINA_UNUSED)
-{
-   return EINA_FALSE;
-}
-
 EOLIAN static Eina_Bool
 _elm_gengrid_elm_widget_focus_next(Eo *obj, Elm_Gengrid_Data *sd, Elm_Focus_Direction dir, Evas_Object **next, Elm_Object_Item **next_item)
 {
@@ -3362,6 +3315,48 @@ _elm_gengrid_elm_widget_focus_next(Eo *obj, Elm_Gengrid_Data *sd, Elm_Focus_Dire
             (obj, items, eina_list_data_get, dir, next, next_item);
 }
 
+EOLIAN static Eina_Bool
+_elm_gengrid_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Gengrid_Data *_pd EINA_UNUSED)
+{
+   return EINA_TRUE;
+}
+
+EOLIAN static Eina_Bool
+_elm_gengrid_elm_widget_focus_direction(Eo *obj, Elm_Gengrid_Data *sd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
+{
+   Eina_List *items = NULL, *l = NULL;
+   Elm_Object_Item *eo_item = NULL;
+   Eina_Bool ret = EINA_FALSE;
+   double c_weight = 0.0;
+
+   items = elm_gengrid_realized_items_get(obj);
+   eo_item = elm_object_focused_item_get(base);
+   if (eo_item)
+     {
+        ELM_GENGRID_ITEM_DATA_GET(eo_item, base_item);
+        base = VIEW(base_item);
+     }
+
+   EINA_LIST_FOREACH(items, l, eo_item)
+     {
+        ELM_GENGRID_ITEM_DATA_GET(eo_item, item);
+
+        c_weight = _elm_widget_focus_direction_weight_get(base, VIEW(item), degree);
+        if ((c_weight == -1.0) ||
+            ((c_weight != 0.0) && (*weight != -1.0) &&
+             ((int)(*weight * 100000000) < (int)(c_weight * 100000000))))
+          {
+             *direction = (Evas_Object *)obj;
+             *direction_item = eo_item;
+             *weight = c_weight;
+             ret = EINA_TRUE;
+          }
+     }
+   eina_list_free(items);
+
+   return ret;
+}
+
 static void
 _mirrored_set(Evas_Object *obj,
               Eina_Bool rtl)
index 97fd46af19792cb2c089f014a6e3929ce37fea23..35f37adaf23d80595cbcc5bfacf0fa35d5a33c44 100644 (file)
@@ -695,6 +695,7 @@ class Elm_Gengrid (Elm_Layout, Elm_Interface_Scrollable,
       Elm_Widget.focus_direction_manager_is;
       Elm_Widget.access;
       Elm_Widget.focus_next;
+      Elm_Widget.focus_direction;
       Elm_Widget.on_focus;
       Elm_Widget.on_focus_region;
       Elm_Widget.event;
index f8397425a8814c5ed602b4a35a3e5e6b7c92df9e..fdbd14279e7c9ab394f07334372720fc40971cec 100644 (file)
@@ -60,7 +60,7 @@ _elm_grid_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd E
 }
 
 EOLIAN static Eina_Bool
-_elm_grid_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_grid_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    const Eina_List *items;
    Eina_List *(*list_free)(Eina_List *list);
@@ -87,7 +87,7 @@ _elm_grid_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_
      }
 
    int_ret = elm_widget_focus_list_direction_get(obj, base, items, list_data_get,
-                                             degree, direction, weight);
+                                             degree, direction, direction_item, weight);
 
    if (list_free) list_free((Eina_List *)items);
 
index d7aceeb7073f10f6ec9f08594ce1d0b0235d377f..e5847032c342d6d2fdd9a208bdce2204345fb3d7 100644 (file)
@@ -552,7 +552,7 @@ _elm_layout_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Layou
 }
 
 EOLIAN static Eina_Bool
-_elm_layout_elm_widget_focus_direction(Eo *obj, Elm_Layout_Smart_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_layout_elm_widget_focus_direction(Eo *obj, Elm_Layout_Smart_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    const Eina_List *items;
    void *(*list_data_get)(const Eina_List *list);
@@ -571,7 +571,7 @@ _elm_layout_elm_widget_focus_direction(Eo *obj, Elm_Layout_Smart_Data *sd, const
      }
 
    return elm_widget_focus_list_direction_get
-            (obj, base, items, list_data_get, degree, direction, weight);
+            (obj, base, items, list_data_get, degree, direction, direction_item, weight);
 }
 
 static void
index 06b5817d608e81292e6355c40b9ee323513df3a2..a20266b96d2a1e01b8e5143c388778d2f61d2b8d 100644 (file)
@@ -359,7 +359,7 @@ _elm_notify_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Notif
 }
 
 EOLIAN static Eina_Bool
-_elm_notify_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_notify_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Evas_Object *cur;
 
@@ -367,7 +367,7 @@ _elm_notify_elm_widget_focus_direction(Eo *obj EINA_UNUSED, Elm_Notify_Data *sd,
 
    cur = sd->content;
 
-   return elm_widget_focus_direction_get(cur, base, degree, direction, weight);
+   return elm_widget_focus_direction_get(cur, base, degree, direction, direction_item, weight);
 }
 
 EOLIAN static Eina_Bool
index b491fe03b6c8ca97413d3cd30b8abefce26c8666..de70b994e166c303b287b970dcdaf4cc71668249 100644 (file)
@@ -1156,7 +1156,7 @@ _elm_spinner_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Spin
 }
 
 EOLIAN static Eina_Bool
-_elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Eina_Bool ret;
    Eina_List *items = NULL;
@@ -1176,7 +1176,7 @@ _elm_spinner_elm_widget_focus_direction(Eo *obj, Elm_Spinner_Data *_pd, const Ev
    items = eina_list_append(items, _pd->dec_button);
 
    ret = elm_widget_focus_list_direction_get
-        (obj, base, items, list_data_get, degree, direction, weight);
+        (obj, base, items, list_data_get, degree, direction, direction_item, weight);
    eina_list_free(items);
 
    return ret;
index 107588484314d4509b9de7bf4afb4f092cf8c8a7..551ac2035308892aceacc686b330c676a8b9c4c5 100644 (file)
@@ -62,7 +62,7 @@ _elm_table_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, void *_pd
 }
 
 EOLIAN static Eina_Bool
-_elm_table_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_table_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    Eina_Bool int_ret;
 
@@ -90,7 +90,7 @@ _elm_table_elm_widget_focus_direction(Eo *obj, void *_pd EINA_UNUSED, const Evas
      }
 
    int_ret = elm_widget_focus_list_direction_get
-       (obj, base, items, list_data_get, degree, direction, weight);
+       (obj, base, items, list_data_get, degree, direction, direction_item, weight);
 
    if (list_free)
      list_free((Eina_List *)items);
index 8b82d79f04466f43713500c4c5e53cebfcd9d32f..1c43e3c393b6ee2346f06289b689f71b2fb325ca 100644 (file)
@@ -63,7 +63,6 @@ struct _Elm_Translate_String_Data
 
 /* local subsystem globals */
 static unsigned int focus_order = 0;
-Elm_Focus_Direction focus_origin = -1;
 
 static inline Eina_Bool
 _elm_widget_is(const Evas_Object *obj)
@@ -423,7 +422,6 @@ _if_focused_revert(Evas_Object *obj,
    if (!sd->focused) return;
    if (!sd->parent_obj) return;
 
-   focus_origin = ELM_FOCUS_REVERT;
    top = elm_widget_top_get(sd->parent_obj);
    if (top)
      {
@@ -1866,7 +1864,6 @@ _elm_widget_focus_cycle(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Elm_Foc
    Elm_Object_Item *target_item = NULL;
    if (!_elm_widget_is(obj))
      return;
-   focus_origin = dir;
    elm_widget_focus_next_get(obj, dir, &target, &target_item);
    if (target)
      {
@@ -1906,6 +1903,7 @@ EOLIAN static Eina_Bool
 _elm_widget_focus_direction_go(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, double degree)
 {
    Evas_Object *target = NULL;
+   Elm_Object_Item *target_item = NULL;
    Evas_Object *current_focused = NULL;
    double weight = 0.0;
 
@@ -1915,7 +1913,7 @@ _elm_widget_focus_direction_go(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED,
    current_focused = elm_widget_focused_object_get(obj);
 
    if (elm_widget_focus_direction_get
-         (obj, current_focused, degree, &target, &weight))
+         (obj, current_focused, degree, &target, &target_item, &weight))
      {
         elm_widget_focus_steal(target, NULL);
         return EINA_TRUE;
@@ -2267,7 +2265,7 @@ _elm_widget_focus_direction_weight_get(const Evas_Object *obj1,
  */
 
 EOLIAN static Eina_Bool
-_elm_widget_focus_direction_get(Eo *obj, Elm_Widget_Smart_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_widget_focus_direction_get(Eo *obj, Elm_Widget_Smart_Data *sd, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    double c_weight;
 
@@ -2285,7 +2283,7 @@ _elm_widget_focus_direction_get(Eo *obj, Elm_Widget_Smart_Data *sd, const Evas_O
    if (_internal_elm_widget_focus_direction_manager_is(obj))
      {
         Eina_Bool int_ret = EINA_FALSE;
-        eo_do((Eo *)obj, int_ret = elm_obj_widget_focus_direction(base, degree, direction, weight));
+        eo_do((Eo *)obj, int_ret = elm_obj_widget_focus_direction(base, degree, direction, direction_item, weight));
         return int_ret;
      }
 
@@ -2340,7 +2338,7 @@ _elm_widget_focus_direction_get(Eo *obj, Elm_Widget_Smart_Data *sd, const Evas_O
  * @ingroup Widget
  */
 EOLIAN static Eina_Bool
-_elm_widget_focus_list_direction_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, const Evas_Object *base, const Eina_List *items, list_data_get_func_type list_data_get, double degree, Evas_Object **direction, double *weight)
+_elm_widget_focus_list_direction_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, const Evas_Object *base, const Eina_List *items, list_data_get_func_type list_data_get, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    if (!direction || !weight || !base || !items)
      return EINA_FALSE;
@@ -2352,7 +2350,7 @@ _elm_widget_focus_list_direction_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data
      {
         Evas_Object *cur = list_data_get(l);
         if (cur && _elm_widget_is(cur))
-          elm_widget_focus_direction_get(cur, base, degree, direction, weight);
+          elm_widget_focus_direction_get(cur, base, degree, direction, direction_item, weight);
      }
    if (current_best != *direction) return EINA_TRUE;
 
@@ -2385,7 +2383,6 @@ _elm_widget_focus_next_get(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Focus_Directi
      return EINA_FALSE;
    *next = NULL;
 
-   focus_origin = dir;
    /* Ignore if disabled */
    if (_elm_config->access_mode && _elm_access_auto_highlight_get())
      {
@@ -2555,6 +2552,7 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED,
              else
                {
                   Evas_Object *n = NULL;
+                  Elm_Object_Item *n_item = NULL;
                   double degree = 0;
                   double weight = 0.0;
 
@@ -2565,8 +2563,10 @@ _elm_widget_focus_list_next_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED,
 
                   if (elm_widget_focus_list_direction_get(obj, focused_object,
                                                           items, list_data_get,
-                                                          degree, &n, &weight))
+                                                          degree, &n, &n_item,
+                                                          &weight))
                     {
+                       *next_item = n_item;
                        *next = n;
                        return EINA_TRUE;
                     }
@@ -4107,12 +4107,6 @@ _elm_widget_focused_item_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EIN
    return NULL;
 }
 
-EOLIAN static Elm_Focus_Direction
-_elm_widget_focus_origin_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
-{
-   return focus_origin;
-}
-
 EOLIAN static void
 _elm_widget_focus_region_show_mode_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd, Elm_Focus_Region_Show_Mode mode)
 {
index 8350dd8d6f67fc207d5e5957c46f37089eb624c5..8010b76a2b4c0125c47257ff968958c2531bf011 100644 (file)
@@ -419,12 +419,6 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte
             return: Evas_Object *;
          }
       }
-      focus_origin {
-         get {
-            /*Get the origination of the focus. Arrow key, tab key, mouse or deletion of an object.*/
-            return: Elm_Focus_Direction;
-         }
-      }
       parent2 {
          set {
             /*@ No description supplied by the EAPI. */
@@ -622,6 +616,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte
             @in const(Evas_Object)* base;
             @in double degree;
             @out Evas_Object *direction;
+            @out Elm_Object_Item *direction_item;
             @out double weight;
          }
          return: bool;
@@ -665,6 +660,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte
             @in list_data_get_func_type list_data_get;
             @in double degree;
             @out Evas_Object *direction;
+            @out Elm_Object_Item *direction_item;
             @out double weight;
          }
       }
@@ -792,6 +788,7 @@ abstract Elm_Widget (Evas.Object_Smart, Elm_Interface_Atspi_Accessible, Elm_Inte
             @in const(Evas_Object)* base;
             @in double degree;
             @out Evas_Object *direction;
+            @out Elm_Object_Item *direction_item;
             @out double weight;
          }
       }
index b9cddd198b91791d044d480f0bb7edbd472af701..5abc2bfea5391b42d4633121e8bcda604adf13ee 100644 (file)
@@ -343,11 +343,13 @@ typedef struct _Elm_Widget_Smart_Class
                                        Evas_Coord *h); /**< 'Virtual' function returning an inner area of a widget that should be brought into the visible area of a broader viewport, may this context arise. On the base Elementary widget class, it defaults to the object's total area, so only override it if you have to. */
    Eina_Bool        (*focus_next)(const Evas_Object *obj,
                                   Elm_Focus_Direction dir,
-                                  Evas_Object **next); /**< 'Virtual' function handling passing focus to sub-objects */
+                                  Evas_Object **next,
+                                  Elm_Object_Item **next_item); /**< 'Virtual' function handling passing focus to sub-objects */
    Eina_Bool        (*focus_direction)(const Evas_Object *obj,
                                        const Evas_Object *base,
                                        double degree,
                                        Evas_Object **target,
+                                       Elm_Object_Item **target_item,
                                        double *weight); /**< 'Virtual' function handling passing focus to sub-objects <b>given a direction, in degrees</b> */
 
    Eina_Bool        (*sub_object_add)(Evas_Object *obj,
@@ -685,9 +687,9 @@ EAPI void             elm_widget_focus_custom_chain_append(Evas_Object *obj, Eva
 EAPI void             elm_widget_focus_custom_chain_prepend(Evas_Object *obj, Evas_Object *child, Evas_Object *relative_child);
 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_direction_get(const Evas_Object *obj, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight);
 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_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, Elm_Object_Item **direction_item, 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, 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);
@@ -794,7 +796,6 @@ EAPI void             elm_widget_focus_move_policy_set(Evas_Object *obj, Elm_Foc
 EAPI Elm_Focus_Move_Policy elm_widget_focus_move_policy_get(const Evas_Object *obj);
 EAPI void             elm_widget_focus_region_show_mode_set(Evas_Object *obj, Elm_Focus_Region_Show_Mode mode);
 EAPI Elm_Focus_Region_Show_Mode elm_widget_focus_region_show_mode_get(const Evas_Object *obj);
-EAPI Elm_Focus_Direction elm_widget_focus_origin_get(const Evas_Object *obj);
 
 /**
  * Function to operate on a given widget's scrollabe children when necessary.
index 30123b072cecdb9a5304d20513892bc155cacbc7..cc32c4979e19fed75ee891982df709e06fd41718 100644 (file)
@@ -1361,7 +1361,7 @@ _elm_win_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, Elm_Win_Data
 }
 
 EOLIAN static Eina_Bool
-_elm_win_elm_widget_focus_direction(Eo *obj, Elm_Win_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, double *weight)
+_elm_win_elm_widget_focus_direction(Eo *obj, Elm_Win_Data *_pd EINA_UNUSED, const Evas_Object *base, double degree, Evas_Object **direction, Elm_Object_Item **direction_item, double *weight)
 {
    const Eina_List *items;
    void *(*list_data_get)(const Eina_List *list);
@@ -1377,7 +1377,7 @@ _elm_win_elm_widget_focus_direction(Eo *obj, Elm_Win_Data *_pd EINA_UNUSED, cons
         list_data_get = eina_list_data_get;
 
         return elm_widget_focus_list_direction_get
-                 (obj, base, items, list_data_get, degree, direction, weight);
+                 (obj, base, items, list_data_get, degree, direction, direction_item, weight);
      }
 
    return EINA_FALSE;