hello ~ Gustavo. Can I know that you meant "elm_widget_focus_direction_go" API ? And one more, what is worse API I made ? I only added elm_widget_can_focus_child_get API... and I think it doesn't duplicate exist one.
2011/8/5 Gustavo Barbieri <barbi...@profusion.mobi> > Sorry, but there is directional scrolling implemented. Why did you > duplicate it with a worse API (directional scrolling takes x,y as > direction parameters and may do diagonal). If it's broken or not > implemented it's better to fix it than to introduce something new. > > Sent from my iPhone > > On 05/08/2011, at 10:26, "Enlightenment SVN" <no-re...@enlightenment.org> > wrote: > > > Log: > > elementary : Focus movement is possible with arrow keys. You can check > > this feature in elementary_test -> focus. > > > > > > Author: woohyun > > Date: 2011-08-05 01:25:07 -0700 (Fri, 05 Aug 2011) > > New Revision: 62125 > > Trac: http://trac.enlightenment.org/e/changeset/62125 > > > > Modified: > > trunk/elementary/src/bin/test_focus.c trunk/elementary/src/lib/ > Elementary.h.in trunk/elementary/src/lib/elm_widget.c > trunk/elementary/src/lib/elm_widget.h trunk/elementary/src/lib/elm_win.c > > > > Modified: trunk/elementary/src/bin/test_focus.c > > =================================================================== > > --- trunk/elementary/src/bin/test_focus.c 2011-08-05 07:45:45 UTC (rev > 62124) > > +++ trunk/elementary/src/bin/test_focus.c 2011-08-05 08:25:07 UTC (rev > 62125) > > @@ -91,7 +91,8 @@ > > { > > Evas_Object *lb = elm_label_add(win); > > elm_object_text_set(lb, > > - "<b>Use Tab and Shift+Tab</b>" > > + "<b>Use Tab, Shift+Tab, and<br>" > > + "Arrow Keys</b>" > > ); > > evas_object_size_hint_weight_set(lb, 0.0, 0.0); > > evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, > > > > Modified: trunk/elementary/src/lib/Elementary.h.in > > =================================================================== > > --- trunk/elementary/src/lib/Elementary.h.in 2011-08-05 07:45:45 UTC > (rev 62124) > > +++ trunk/elementary/src/lib/Elementary.h.in 2011-08-05 08:25:07 UTC > (rev 62125) > > @@ -320,7 +320,11 @@ > > typedef enum _Elm_Focus_Direction > > { > > ELM_FOCUS_PREVIOUS, > > - ELM_FOCUS_NEXT > > + ELM_FOCUS_NEXT, > > + ELM_FOCUS_UP, > > + ELM_FOCUS_DOWN, > > + ELM_FOCUS_LEFT, > > + ELM_FOCUS_RIGHT > > } Elm_Focus_Direction; > > > > typedef enum _Elm_Text_Format > > > > Modified: trunk/elementary/src/lib/elm_widget.c > > =================================================================== > > --- trunk/elementary/src/lib/elm_widget.c 2011-08-05 07:45:45 UTC (rev > 62124) > > +++ trunk/elementary/src/lib/elm_widget.c 2011-08-05 08:25:07 UTC (rev > 62125) > > @@ -158,6 +158,10 @@ > > static Evas_Object *_newest_focus_order_get(Evas_Object *obj, > > unsigned int > *newest_focus_order, > > Eina_Bool > can_focus_only); > > +static Eina_Bool _focus_list_direction_nearest_get(Evas_Object > *obj, > > + Eina_List > *list, > > + Elm_Focus_Direction dir, > > + Evas_Object > **nearest); > > > > /* local subsystem globals */ > > static Evas_Smart *_e_smart = NULL; > > @@ -399,6 +403,96 @@ > > } > > } > > > > +static Eina_Bool > > +_focus_list_direction_nearest_get(Evas_Object *obj, > > + Eina_List *list, > > + Elm_Focus_Direction dir, > > + Evas_Object **nearest) > > +{ > > + Evas_Object *cur, *next = NULL; > > + Eina_List *l; > > + double weight = 0.0; > > + Evas_Coord x, y, w, h, cx, cy; > > + > > + if (!nearest) return EINA_FALSE; > > + *nearest = NULL; > > + > > + evas_object_geometry_get(obj, &x, &y, &w, &h); > > + cx = x + (w / 2); > > + cy = y + (h / 2); > > + > > + EINA_LIST_FOREACH(list, l, cur) > > + { > > + if (obj == cur) continue; > > + Evas_Coord cur_x, cur_y, cur_w, cur_h; > > + int w_gap = 0, h_gap = 0; > > + double cur_weight = 0.0; > > + > > + evas_object_geometry_get(cur, &cur_x, &cur_y, &cur_w, &cur_h); > > + > > + if (dir == ELM_FOCUS_LEFT) > > + { > > + if (x < (cur_x + cur_w)) continue; > > + w_gap = x - (cur_x + cur_w); > > + if ((cy >= cur_y) && (cy <= (cur_y + cur_h))) > > + h_gap = 0; > > + else if (cy > (cur_y + cur_h)) > > + h_gap = cy - (cur_y + cur_h); > > + else if (cy < (cur_y)) > > + h_gap = cur_y - cy; > > + } > > + else if (dir == ELM_FOCUS_RIGHT) > > + { > > + if ((x + w) > cur_x) continue; > > + w_gap = cur_x - (x + w); > > + if ((cy >= cur_y) && (cy <= (cur_y + cur_h))) > > + h_gap = 0; > > + else if (cy > (cur_y + cur_h)) > > + h_gap = cy - (cur_y + cur_h); > > + else if (cy < (cur_y)) > > + h_gap = cur_y - cy; > > + } > > + else if (dir == ELM_FOCUS_UP) > > + { > > + if (y < (cur_y + cur_h)) continue; > > + h_gap = y - (cur_y + cur_h); > > + if ((cx >= cur_x) && (cx <= (cur_x + cur_w))) > > + w_gap = 0; > > + else if (cx < cur_x) > > + w_gap = cur_x - cx; > > + else if (cx > (cur_x + cur_w)) > > + w_gap = cur_x + cur_w - cx; > > + } > > + else if (dir == ELM_FOCUS_DOWN) > > + { > > + if ((y + h) > cur_y) continue; > > + h_gap = cur_y - (y + h); > > + if ((cx >= cur_x) && (cx <= (cur_x + cur_w))) w_gap = 0; > > + else if (cx < cur_x) > > + w_gap = cur_x - cx; > > + else if (cx > (cur_x + cur_w)) > > + w_gap = cur_x + cur_w - cx; > > + } > > + cur_weight = (w_gap * w_gap) + (h_gap * h_gap); > > + > > + if (cur_weight == 0.0) > > + { > > + *nearest = cur; > > + return EINA_TRUE; > > + } > > + cur_weight = 1.0 / cur_weight; > > + if (cur_weight > weight) > > + { > > + weight = cur_weight; > > + next = cur; > > + } > > + } > > + if (!next) return EINA_FALSE; > > + *nearest = next; > > + return EINA_TRUE; > > +} > > + > > + > > /** > > * @defgroup Widget Widget > > * > > @@ -1147,6 +1241,47 @@ > > return sd->tree_unfocusable; > > } > > > > +/** > > + * @internal > > + * > > + * Get the list of focusable child objects. > > + * > > + * This function retruns list of child objects which can get focus. > > + * > > + * @param obj The parent widget > > + * @retrun list of focusable child objects. > > + * > > + * @ingroup Widget > > + */ > > +EAPI Eina_List * > > +elm_widget_can_focus_child_list_get(const Evas_Object *obj) > > +{ > > + API_ENTRY return NULL; > > + > > + const Eina_List *l; > > + Eina_List *child_list = NULL; > > + Evas_Object *child; > > + > > + if (sd->subobjs) > > + { > > + EINA_LIST_FOREACH(sd->subobjs, l, child) > > + { > > + if ((elm_widget_can_focus_get(child)) && > > + (evas_object_visible_get(child)) && > > + (!elm_widget_disabled_get(child))) > > + child_list = eina_list_append(child_list, child); > > + else if (elm_widget_is(child)) > > + { > > + Eina_List *can_focus_list; > > + can_focus_list = > elm_widget_can_focus_child_list_get(child); > > + if (can_focus_list) > > + child_list = eina_list_merge(child_list, > can_focus_list); > > + } > > + } > > + } > > + return child_list; > > +} > > + > > EAPI void > > elm_widget_highlight_ignore_set(Evas_Object *obj, > > Eina_Bool ignore) > > @@ -1598,7 +1733,7 @@ > > Elm_Focus_Direction dir, > > Evas_Object **next) > > { > > - Eina_List *(*list_next)(const Eina_List * list); > > + Eina_List *(*list_next)(const Eina_List * list) = NULL; > > > > if (!next) > > return EINA_FALSE; > > @@ -1617,64 +1752,110 @@ > > list_next = eina_list_prev; > > } > > else if (dir == ELM_FOCUS_NEXT) > > - list_next = eina_list_next; > > + { > > + list_next = eina_list_next; > > + } > > + else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) || > > + (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN)) > > + { > > + list_next = eina_list_next; > > + } > > else > > return EINA_FALSE; > > > > - const Eina_List *l = items; > > + if ((dir == ELM_FOCUS_PREVIOUS) || (dir == ELM_FOCUS_NEXT)) > > + { > > + const Eina_List *l = items; > > > > - /* Recovery last focused sub item */ > > - if (elm_widget_focus_get(obj)) > > - for (; l; l = list_next(l)) > > - { > > - Evas_Object *cur = list_data_get(l); > > - if (elm_widget_focus_get(cur)) break; > > - } > > + /* Recovery last focused sub item */ > > + if (elm_widget_focus_get(obj)) > > + for (; l; l = list_next(l)) > > + { > > + Evas_Object *cur = list_data_get(l); > > + if (elm_widget_focus_get(cur)) break; > > + } > > > > - const Eina_List *start = l; > > - Evas_Object *to_focus = NULL; > > + const Eina_List *start = l; > > + Evas_Object *to_focus = NULL; > > > > - /* Interate sub items */ > > - /* Go to end of list */ > > - for (; l; l = list_next(l)) > > - { > > - Evas_Object *tmp = NULL; > > - Evas_Object *cur = list_data_get(l); > > + /* Interate sub items */ > > + /* Go to end of list */ > > + for (; l; l = list_next(l)) > > + { > > + Evas_Object *tmp = NULL; > > + Evas_Object *cur = list_data_get(l); > > > > - if (elm_widget_parent_get(cur) != obj) > > - continue; > > + if (elm_widget_parent_get(cur) != obj) > > + continue; > > > > - /* Try Focus cycle in subitem */ > > - if (elm_widget_focus_next_get(cur, dir, &tmp)) > > + /* Try Focus cycle in subitem */ > > + if (elm_widget_focus_next_get(cur, dir, &tmp)) > > + { > > + *next = tmp; > > + return EINA_TRUE; > > + } > > + else if ((tmp) && (!to_focus)) > > + to_focus = tmp; > > + } > > + > > + l = items; > > + > > + /* Get First possible */ > > + for (; l != start; l = list_next(l)) > > { > > - *next = tmp; > > - return EINA_TRUE; > > + Evas_Object *tmp = NULL; > > + Evas_Object *cur = list_data_get(l); > > + > > + if (elm_widget_parent_get(cur) != obj) > > + continue; > > + > > + /* Try Focus cycle in subitem */ > > + elm_widget_focus_next_get(cur, dir, &tmp); > > + if (tmp) > > + { > > + *next = tmp; > > + return EINA_FALSE; > > + } > > } > > - else if ((tmp) && (!to_focus)) > > - to_focus = tmp; > > + > > + *next = to_focus; > > + return EINA_FALSE; > > } > > - > > - l = items; > > - > > - /* Get First possible */ > > - for (; l != start; l = list_next(l)) > > + else if ((dir == ELM_FOCUS_LEFT) || (dir == ELM_FOCUS_RIGHT) || > > + (dir == ELM_FOCUS_UP) || (dir == ELM_FOCUS_DOWN)) > > { > > + Eina_List *can_focus_list; > > Evas_Object *tmp = NULL; > > - Evas_Object *cur = list_data_get(l); > > + Evas_Object *cur; > > > > - if (elm_widget_parent_get(cur) != obj) > > - continue; > > - > > - /* Try Focus cycle in subitem */ > > - elm_widget_focus_next_get(cur, dir, &tmp); > > - if (tmp) > > + can_focus_list = elm_widget_can_focus_child_list_get(obj); > > + if (can_focus_list) > > { > > - *next = tmp; > > - return EINA_FALSE; > > + Eina_List *l; > > + EINA_LIST_FOREACH(can_focus_list, l, cur) > > + { > > + if (elm_widget_focus_get(cur)) > > + { > > + if (_focus_list_direction_nearest_get(cur, > can_focus_list, dir, &tmp)) > > + { > > + *next = tmp; > > + return EINA_TRUE; > > + } > > + else > > + { > > + *next = cur; > > + return EINA_FALSE; > > + } > > + } > > + } > > + if (elm_widget_focus_get(obj)) > > + { > > + *next = list_data_get(can_focus_list); > > + return EINA_FALSE; > > + } > > } > > } > > > > - *next = to_focus; > > return EINA_FALSE; > > } > > > > > > Modified: trunk/elementary/src/lib/elm_widget.h > > =================================================================== > > --- trunk/elementary/src/lib/elm_widget.h 2011-08-05 07:45:45 UTC (rev > 62124) > > +++ trunk/elementary/src/lib/elm_widget.h 2011-08-05 08:25:07 UTC (rev > 62125) > > @@ -269,6 +269,7 @@ > > EAPI void elm_widget_can_focus_set(Evas_Object *obj, > Eina_Bool can_focus); > > EAPI Eina_Bool elm_widget_can_focus_get(const Evas_Object *obj); > > EAPI Eina_Bool elm_widget_child_can_focus_get(const Evas_Object > *obj); > > +EAPI Eina_List *elm_widget_can_focus_child_list_get(const > Evas_Object *obj); > > EAPI void elm_widget_tree_unfocusable_set(Evas_Object *obj, > Eina_Bool tree_unfocusable); > > EAPI Eina_Bool elm_widget_tree_unfocusable_get(const Evas_Object > *obj); > > EAPI void elm_widget_highlight_ignore_set(Evas_Object *obj, > Eina_Bool ignore); > > > > Modified: trunk/elementary/src/lib/elm_win.c > > =================================================================== > > --- trunk/elementary/src/lib/elm_win.c 2011-08-05 07:45:45 UTC (rev > 62124) > > +++ trunk/elementary/src/lib/elm_win.c 2011-08-05 08:25:07 UTC (rev > 62125) > > @@ -397,6 +397,34 @@ > > ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > > return EINA_TRUE; > > } > > + else if ((!strcmp(ev->keyname, "Left")) || > > + (!strcmp(ev->keyname, "KP_Left"))) > > + { > > + elm_widget_focus_cycle(obj, ELM_FOCUS_LEFT); > > + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > > + return EINA_TRUE; > > + } > > + else if ((!strcmp(ev->keyname, "Right")) || > > + (!strcmp(ev->keyname, "KP_Right"))) > > + { > > + elm_widget_focus_cycle(obj, ELM_FOCUS_RIGHT); > > + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > > + return EINA_TRUE; > > + } > > + else if ((!strcmp(ev->keyname, "Up")) || > > + (!strcmp(ev->keyname, "KP_Up"))) > > + { > > + elm_widget_focus_cycle(obj, ELM_FOCUS_UP); > > + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > > + return EINA_TRUE; > > + } > > + else if ((!strcmp(ev->keyname, "Down")) || > > + (!strcmp(ev->keyname, "KP_Down"))) > > + { > > + elm_widget_focus_cycle(obj, ELM_FOCUS_DOWN); > > + ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; > > + return EINA_TRUE; > > + } > > } > > > > return EINA_FALSE; > > > > > > > ------------------------------------------------------------------------------ > > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > > The must-attend event for mobile developers. Connect with experts. > > Get tools for creating Super Apps. See the latest technologies. > > Sessions, hands-on labs, demos & much more. Register early & save! > > http://p.sf.net/sfu/rim-blackberry-1 > > _______________________________________________ > > enlightenment-svn mailing list > > enlightenment-...@lists.sourceforge.net > > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > > ------------------------------------------------------------------------------ > BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA > The must-attend event for mobile developers. Connect with experts. > Get tools for creating Super Apps. See the latest technologies. > Sessions, hands-on labs, demos & much more. Register early & save! > http://p.sf.net/sfu/rim-blackberry-1 > _______________________________________________ > enlightenment-devel mailing list > enlightenment-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel > ------------------------------------------------------------------------------ BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA The must-attend event for mobile developers. Connect with experts. Get tools for creating Super Apps. See the latest technologies. Sessions, hands-on labs, demos & much more. Register early & save! http://p.sf.net/sfu/rim-blackberry-1 _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel