1 #include <Elementary.h>
3 #include "elm_interface_scrollable.h"
5 static const char ACCESS_SMART_NAME[] = "elm_access";
7 ELM_INTERNAL_SMART_SUBCLASS_NEW
8 (ACCESS_SMART_NAME, _elm_access, Elm_Widget_Smart_Class,
9 Elm_Widget_Smart_Class, elm_widget_smart_class_get, NULL);
13 void *user_data; /* Holds user data to CB */
14 Elm_Access_Action_Cb cb;
17 typedef struct _Func_Data Func_Data;
22 Func_Data fn[ELM_ACCESS_ACTION_LAST + 1]; /* Callback for specific action */
25 typedef struct _Action_Info Action_Info;
27 static Eina_Bool mouse_event_enable = EINA_TRUE;
28 static Eina_Bool read_mode = EINA_FALSE;
29 static Evas_Coord_Point offset;
30 static Evas_Object *s_parent; /* scrollable parent */
32 static Evas_Object * _elm_access_add(Evas_Object *parent);
35 _elm_access_smart_add(Evas_Object *obj)
37 EVAS_SMART_DATA_ALLOC(obj, Elm_Widget_Smart_Data);
38 ELM_WIDGET_CLASS(_elm_access_parent_sc)->base.add(obj);
40 elm_widget_can_focus_set(obj, EINA_TRUE);
44 _elm_access_smart_on_focus(Evas_Object *obj)
46 evas_object_focus_set(obj, elm_widget_focus_get(obj));
52 _elm_access_smart_activate(Evas_Object *obj, Elm_Activate act)
54 int type = ELM_ACCESS_ACTION_FIRST;
57 a = evas_object_data_get(obj, "_elm_access_action_info");
61 case ELM_ACTIVATE_DEFAULT:
62 type = ELM_ACCESS_ACTION_ACTIVATE;
66 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
69 case ELM_ACTIVATE_DOWN:
70 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
73 case ELM_ACTIVATE_RIGHT:
76 case ELM_ACTIVATE_LEFT:
83 if ((a) && (type > ELM_ACCESS_ACTION_FIRST) &&
84 (type < ELM_ACCESS_ACTION_LAST) &&
87 a->fn[type].cb(a->fn[type].user_data, obj, NULL);
91 /* TODO: deprecate below? and change above with _access_action_callback_call(); */
92 if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
94 Elm_Access_Info *ac = evas_object_data_get(obj, "_elm_access");
95 if (!ac) return EINA_FALSE;
98 ac->activate(ac->activate_data, ac->part_object,
99 (Elm_Object_Item *)ac->widget_item);
105 _elm_access_smart_set_user(Elm_Widget_Smart_Class *sc)
107 sc->base.add = _elm_access_smart_add;
109 /* not a 'focus chain manager' */
110 sc->focus_next = NULL;
111 sc->focus_direction = NULL;
112 sc->on_focus = _elm_access_smart_on_focus;
113 sc->activate = _elm_access_smart_activate;
118 typedef struct _Mod_Api Mod_Api;
122 void (*out_read) (const char *txt);
123 void (*out_read_done) (void);
124 void (*out_cancel) (void);
125 void (*out_done_callback_set) (void (*func) (void *data), const void *data);
128 static int initted = 0;
129 static Mod_Api *mapi = NULL;
136 if (initted > 1) return;
137 if (!(m = _elm_module_find_as("access/api"))) return;
138 m->api = malloc(sizeof(Mod_Api));
141 ((Mod_Api *)(m->api) )->out_read = // called to read out some text
142 _elm_module_symbol_get(m, "out_read");
143 ((Mod_Api *)(m->api) )->out_read_done = // called to set a done marker so when it is reached the done callback is called
144 _elm_module_symbol_get(m, "out_read_done");
145 ((Mod_Api *)(m->api) )->out_cancel = // called to read out some text
146 _elm_module_symbol_get(m, "out_cancel");
147 ((Mod_Api *)(m->api) )->out_done_callback_set = // called when last read done
148 _elm_module_symbol_get(m, "out_done_callback_set");
153 _access_shutdown(void)
156 if (initted == 0) return;
157 if (!(m = _elm_module_find_as("access/api"))) return;
167 static Elm_Access_Item *
168 _access_add_set(Elm_Access_Info *ac, int type)
173 if (!ac) return NULL;
174 EINA_LIST_FOREACH(ac->items, l, ai)
176 if (ai->type == type)
180 if (ai->data) eina_stringshare_del(ai->data);
187 ai = calloc(1, sizeof(Elm_Access_Item));
189 ac->items = eina_list_prepend(ac->items, ai);
194 _access_highlight_object_get(Evas_Object *obj)
198 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
201 ho = evas_object_data_get(o, "_elm_access_target");
207 _access_highlight_read(Elm_Access_Info *ac, Evas_Object *obj)
213 /*FIXME: TIZEN only - read at once because Tizen TTS engine performance is not good */
214 strbuf = eina_strbuf_new();
216 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
219 if (ac->on_highlight) ac->on_highlight(ac->on_highlight_data);
220 _elm_access_object_hilight(obj);
222 for (type = ELM_ACCESS_INFO_FIRST + 1; type < ELM_ACCESS_INFO_LAST; type++)
224 txt = _elm_access_text_get(ac, type, obj);
225 if (txt && (strlen(txt) > 0))
227 if (eina_strbuf_length_get(strbuf) > 0)
228 eina_strbuf_append_printf(strbuf, ", %s", txt);
230 eina_strbuf_append(strbuf, txt);
237 txt = eina_strbuf_string_steal(strbuf);
238 eina_strbuf_free(strbuf);
240 _elm_access_say(txt);
245 _access_obj_over_timeout_cb(void *data)
250 if (!data) return EINA_FALSE;
252 ac = evas_object_data_get(data, "_elm_access");
253 if (!ac) return EINA_FALSE;
255 ho = _access_highlight_object_get(data);
256 if (ho != data) _access_highlight_read(ac, data);
258 ac->delay_timer = NULL;
263 _access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
266 if (!mouse_event_enable) return;
268 ac = evas_object_data_get(data, "_elm_access");
273 ecore_timer_del(ac->delay_timer);
274 ac->delay_timer = NULL;
276 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
277 ac->delay_timer = ecore_timer_add(0.2, _access_obj_over_timeout_cb, data);
281 _access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
284 if (!mouse_event_enable) return;
286 ac = evas_object_data_get(data, "_elm_access");
289 _elm_access_object_unhilight(data);
292 ecore_timer_del(ac->delay_timer);
293 ac->delay_timer = NULL;
298 _access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
300 _elm_access_object_unregister(data, obj);
302 // _elm_access_edje_object_part_object_register(); set below object data
303 evas_object_data_del(obj, "_part_access_obj");
307 _access_read_done(void *data __UNUSED__)
309 printf("read done\n");
310 // FIXME: produce event here
314 _access_2nd_click_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
318 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
319 _access_2nd_click_del_cb, NULL);
320 t = evas_object_data_get(obj, "_elm_2nd_timeout");
324 evas_object_data_del(obj, "_elm_2nd_timeout");
329 _access_2nd_click_timeout_cb(void *data)
331 evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL,
332 _access_2nd_click_del_cb, NULL);
333 evas_object_data_del(data, "_elm_2nd_timeout");
338 _access_obj_hilight_del_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
340 _elm_access_object_hilight_disable(e);
344 _access_obj_hilight_hide_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
346 _elm_access_object_hilight_disable(e);
350 _access_obj_hilight_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
355 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
357 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
358 evas_object_move(o, x, y);
362 _access_obj_hilight_resize_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
367 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
369 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
370 evas_object_resize(o, w, h);
374 _elm_access_mouse_event_enabled_set(Eina_Bool enabled)
377 if (mouse_event_enable == enabled) return;
378 mouse_event_enable = enabled;
382 _elm_access_read_mode_set(Eina_Bool enabled)
385 if (read_mode == enabled) return;
390 _elm_access_read_mode_get()
396 _elm_access_shutdown()
402 _access_order_del_cb(void *data,
405 void *event_info __UNUSED__)
407 Elm_Widget_Item *item = data;
409 item->access_order = eina_list_remove(item->access_order, obj);
413 _elm_access_widget_item_access_order_set(Elm_Widget_Item *item,
421 _elm_access_widget_item_access_order_unset(item);
423 EINA_LIST_FOREACH(objs, l, o)
425 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL,
426 _access_order_del_cb, item);
429 item->access_order = objs;
433 _elm_access_widget_item_access_order_get(const Elm_Widget_Item *item)
435 if (!item) return NULL;
436 return item->access_order;
440 _elm_access_widget_item_access_order_unset(Elm_Widget_Item *item)
442 Eina_List *l, *l_next;
447 EINA_LIST_FOREACH_SAFE(item->access_order, l, l_next, o)
449 evas_object_event_callback_del_full
450 (o, EVAS_CALLBACK_DEL, _access_order_del_cb, item);
451 item->access_order = eina_list_remove_list(item->access_order, l);
456 _elm_access_highlight_object_scroll(Evas_Object *obj, int type, int x, int y)
460 Evas_Coord_Rectangle ho_area;
464 evas = evas_object_evas_get(obj);
470 ho = _access_highlight_object_get(obj);
478 /* find scrollable parent */
479 s_parent = elm_widget_parent_get(ho);
482 if(!!evas_object_smart_interface_get(s_parent, ELM_SCROLLABLE_IFACE_NAME))
484 s_parent = elm_widget_parent_get(s_parent);
487 if (!s_parent) return;
488 //TODO: new interface to disable repeat event
490 evas_object_geometry_get
491 (ho, &ho_area.x, &ho_area.y, &ho_area.w, &ho_area.h);
493 offset.x = x - (ho_area.x + (ho_area.w / 2));
494 offset.y = y - (ho_area.y + (ho_area.h / 2));
497 evas_event_feed_mouse_in(evas, 0, NULL);
498 evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL);
499 evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
503 if (!s_parent) return;
504 evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL);
508 if (!s_parent) return;
509 evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
510 //TODO: new interface to enable repeat event
519 _access_action_callback_call(Evas_Object *obj,
520 Elm_Access_Action_Type type,
527 a = evas_object_data_get(obj, "_elm_access_action_info");
529 if (a && (a->fn[type].cb))
530 ret = a->fn[type].cb(a->fn[type].user_data, obj, data);
536 _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir)
539 Evas_Object *ho, *parent, *target;
545 if (!elm_widget_is(obj)) return ret;
547 ho = _access_highlight_object_get(obj);
552 /* find highlight root */
555 ELM_WIDGET_DATA_GET(parent, sd);
556 if (sd->highlight_root)
558 /* change highlight root */
562 parent = elm_widget_parent_get(parent);
566 _elm_access_read_mode_set(EINA_TRUE);
568 ret = elm_widget_focus_next_get(obj, dir, &target);
571 if (dir == ELM_FOCUS_NEXT)
572 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
574 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
576 if (!_access_action_callback_call(ho, type, NULL))
578 _elm_access_highlight_set(target);
583 _elm_access_read_mode_set(EINA_FALSE);
587 //-------------------------------------------------------------------------//
589 _elm_access_highlight_set(Evas_Object* obj)
596 ho = _access_highlight_object_get(obj);
597 if (ho == obj) return;
599 ac = evas_object_data_get(obj, "_elm_access");
602 _access_highlight_read(ac, obj);
606 _elm_access_clear(Elm_Access_Info *ac)
613 ecore_timer_del(ac->delay_timer);
614 ac->delay_timer = NULL;
616 EINA_LIST_FREE(ac->items, ai)
620 if (ai->data) eina_stringshare_del(ai->data);
627 _elm_access_text_set(Elm_Access_Info *ac, int type, const char *text)
629 Elm_Access_Item *ai = _access_add_set(ac, type);
631 ai->data = eina_stringshare_add(text);
635 _elm_access_callback_set(Elm_Access_Info *ac, int type, Elm_Access_Info_Cb func, const void *data)
637 Elm_Access_Item *ai = _access_add_set(ac, type);
644 _elm_access_on_highlight_hook_set(Elm_Access_Info *ac,
645 Elm_Access_On_Highlight_Cb func,
649 ac->on_highlight = func;
650 ac->on_highlight_data = data;
654 _elm_access_activate_callback_set(Elm_Access_Info *ac,
655 Elm_Access_Activate_Cb func,
660 ac->activate_data = data;
664 _elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act)
666 Evas_Object *highlight;
668 highlight = _access_highlight_object_get(obj);
669 if (!highlight) return;
671 _elm_access_read_mode_set(EINA_FALSE);
673 if (!elm_object_focus_get(highlight))
674 elm_object_focus_set(highlight, EINA_TRUE);
676 elm_widget_activate(highlight, act);
681 _elm_access_highlight_cycle(Evas_Object *obj, Elm_Focus_Direction dir)
684 Evas_Object *ho, *parent;
686 ho = _access_highlight_object_get(obj);
691 /* find highlight root */
694 ELM_WIDGET_DATA_GET(parent, sd);
695 if (sd->highlight_root)
697 /* change highlight root */
701 parent = elm_widget_parent_get(parent);
705 _elm_access_read_mode_set(EINA_TRUE);
707 if (dir == ELM_FOCUS_NEXT)
708 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
710 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
712 if (!_access_action_callback_call(ho, type, NULL))
713 elm_widget_focus_cycle(obj, dir);
715 _elm_access_read_mode_set(EINA_FALSE);
719 _elm_access_text_get(const Elm_Access_Info *ac, int type, const Evas_Object *obj)
724 if (!ac) return NULL;
725 EINA_LIST_FOREACH(ac->items, l, ai)
727 if (ai->type == type)
729 if (ai->func) return ai->func((void *)(ai->data), (Evas_Object *)obj);
730 else if (ai->data) return strdup(ai->data);
738 _elm_access_read(Elm_Access_Info *ac, int type, const Evas_Object *obj)
740 char *txt = _elm_access_text_get(ac, type, obj);
742 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
747 if (mapi->out_done_callback_set)
748 mapi->out_done_callback_set(_access_read_done, NULL);
749 if (type == ELM_ACCESS_DONE)
751 if (mapi->out_read_done) mapi->out_read_done();
753 else if (type == ELM_ACCESS_CANCEL)
755 if (mapi->out_cancel) mapi->out_cancel();
759 if (txt && mapi->out_read) mapi->out_read(txt);
766 _elm_access_say(const char *txt)
768 if (!_elm_config->access_mode) return;
770 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
775 if (mapi->out_done_callback_set)
776 mapi->out_done_callback_set(_access_read_done, NULL);
777 if (mapi->out_cancel) mapi->out_cancel();
780 if (mapi->out_read) mapi->out_read(txt);
781 //if (mapi->out_read) mapi->out_read(".\n"); /* TIZEN only: Tizen TTS engine performance is not good */
783 if (mapi->out_read_done) mapi->out_read_done();
787 EAPI Elm_Access_Info *
788 _elm_access_object_get(const Evas_Object *obj)
790 return evas_object_data_get(obj, "_elm_access");
794 _elm_access_object_hilight(Evas_Object *obj)
797 Evas_Coord x, y, w, h;
799 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
802 o = edje_object_add(evas_object_evas_get(obj));
803 evas_object_name_set(o, "_elm_access_disp");
804 evas_object_layer_set(o, ELM_OBJECT_LAYER_TOOLTIP);
808 Evas_Object *ptarget = evas_object_data_get(o, "_elm_access_target");
811 evas_object_data_del(o, "_elm_access_target");
812 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
814 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
815 _access_obj_hilight_del_cb, NULL);
816 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
817 _access_obj_hilight_hide_cb, NULL);
818 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
819 _access_obj_hilight_move_cb, NULL);
820 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
821 _access_obj_hilight_resize_cb, NULL);
824 evas_object_data_set(o, "_elm_access_target", obj);
825 elm_widget_parent_highlight_set(obj, EINA_TRUE);
827 elm_widget_theme_object_set(obj, o, "access", "base", "default");
829 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
830 _access_obj_hilight_del_cb, NULL);
831 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE,
832 _access_obj_hilight_hide_cb, NULL);
833 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
834 _access_obj_hilight_move_cb, NULL);
835 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
836 _access_obj_hilight_resize_cb, NULL);
837 evas_object_raise(o);
838 evas_object_geometry_get(obj, &x, &y, &w, &h);
839 evas_object_move(o, x, y);
840 evas_object_resize(o, w, h);
842 /* use callback, should an access object do below every time when
843 * a window gets a client message ECORE_X_ATOM_E_ILLMUE_ACTION_READ? */
844 if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, NULL))
851 _elm_access_object_unhilight(Evas_Object *obj)
853 Evas_Object *o, *ptarget;
855 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
857 ptarget = evas_object_data_get(o, "_elm_access_target");
860 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
861 _access_obj_hilight_del_cb, NULL);
862 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
863 _access_obj_hilight_hide_cb, NULL);
864 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
865 _access_obj_hilight_move_cb, NULL);
866 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
867 _access_obj_hilight_resize_cb, NULL);
869 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
874 _content_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj,
875 void *event_info __UNUSED__)
877 Evas_Object *accessobj;
881 if (!accessobj) return;
883 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
884 evas_object_resize(accessobj, w, h);
888 _content_move(void *data, Evas *e __UNUSED__, Evas_Object *obj,
889 void *event_info __UNUSED__)
891 Evas_Object *accessobj;
895 if (!accessobj) return;
897 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
898 evas_object_move(accessobj, x, y);
902 _access_object_register(Evas_Object *obj, Evas_Object *parent)
906 Evas_Coord x, y, w, h;
908 if (!obj) return NULL;
910 /* create access object */
911 ao = _elm_access_add(parent);
912 if (!ao) return NULL;
914 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
915 _content_resize, ao);
916 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
919 evas_object_geometry_get(obj, &x, &y, &w, &h);
920 evas_object_move(ao, x, y);
921 evas_object_resize(ao, w, h);
922 evas_object_show(ao);
924 /* register access object */
925 _elm_access_object_register(ao, obj);
927 /* set access object */
928 evas_object_data_set(obj, "_part_access_obj", ao);
930 /* set owner part object */
931 ac = evas_object_data_get(ao, "_elm_access");
932 ac->part_object = obj;
938 _access_object_unregister(Evas_Object *obj)
945 ao = evas_object_data_get(obj, "_part_access_obj");
949 evas_object_data_del(obj, "_part_access_obj");
951 /* delete callbacks */
952 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_RESIZE,
953 _content_resize, ao);
954 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
957 /* unregister access object */
958 _elm_access_object_unregister(ao, obj);
964 /* button, check, label etc. */
965 ac = evas_object_data_get(obj, "_elm_access");
966 if (ac && ac->hoverobj)
967 _elm_access_object_unregister(obj, ac->hoverobj);
972 _elm_access_edje_object_part_object_register(Evas_Object* obj,
973 const Evas_Object *eobj,
976 Evas_Object *ao, *po;
978 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
979 if (!obj || !po) return NULL;
981 /* check previous access object */
982 ao = evas_object_data_get(po, "_part_access_obj");
984 _elm_access_edje_object_part_object_unregister(obj, eobj, part);
986 ao = _access_object_register(po, obj);
991 //FIXME: unused obj should be removed from here and each widget.
993 _elm_access_edje_object_part_object_unregister(Evas_Object* obj __UNUSED__,
994 const Evas_Object *eobj,
999 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
1002 _access_object_unregister(po);
1006 _elm_access_object_hilight_disable(Evas *e)
1008 Evas_Object *o, *ptarget;
1010 o = evas_object_name_find(e, "_elm_access_disp");
1012 ptarget = evas_object_data_get(o, "_elm_access_target");
1015 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
1016 _access_obj_hilight_del_cb, NULL);
1017 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
1018 _access_obj_hilight_hide_cb, NULL);
1019 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
1020 _access_obj_hilight_move_cb, NULL);
1021 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
1022 _access_obj_hilight_resize_cb, NULL);
1025 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
1029 _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
1031 Elm_Access_Info *ac;
1033 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
1034 _access_obj_mouse_in_cb, obj);
1035 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
1036 _access_obj_mouse_out_cb, obj);
1037 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_DEL,
1038 _access_obj_del_cb, obj);
1039 ac = calloc(1, sizeof(Elm_Access_Info));
1040 evas_object_data_set(obj, "_elm_access", ac);
1042 ac->hoverobj = hoverobj;
1046 _elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj)
1048 Elm_Access_Info *ac;
1050 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_IN,
1051 _access_obj_mouse_in_cb, obj);
1052 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
1053 _access_obj_mouse_out_cb, obj);
1054 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_DEL,
1055 _access_obj_del_cb, obj);
1057 ac = evas_object_data_get(obj, "_elm_access");
1058 evas_object_data_del(obj, "_elm_access");
1061 _elm_access_clear(ac);
1066 a = evas_object_data_get(obj, "_elm_access_action_info");
1071 _elm_access_widget_item_register(Elm_Widget_Item *item)
1073 Evas_Object *ao, *ho;
1074 Evas_Coord x, y, w, h;
1075 Elm_Access_Info *ac;
1077 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1079 /* check previous access object */
1080 if (item->access_obj)
1081 _elm_access_widget_item_unregister(item);
1083 // create access object
1085 ao = _elm_access_add(item->widget);
1088 evas_object_event_callback_add(ho, EVAS_CALLBACK_RESIZE,
1089 _content_resize, ao);
1090 evas_object_event_callback_add(ho, EVAS_CALLBACK_MOVE,
1093 evas_object_geometry_get(ho, &x, &y, &w, &h);
1094 evas_object_move(ao, x, y);
1095 evas_object_resize(ao, w, h);
1096 evas_object_show(ao);
1098 // register access object
1099 _elm_access_object_register(ao, ho);
1101 item->access_obj = ao;
1103 /* set owner widget item */
1104 ac = evas_object_data_get(ao, "_elm_access");
1105 ac->widget_item = item;
1109 _elm_access_widget_item_unregister(Elm_Widget_Item *item)
1113 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1115 if (!item->access_obj) return;
1118 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_RESIZE,
1119 _content_resize, item->access_obj);
1120 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_MOVE,
1121 _content_move, item->access_obj);
1123 _elm_access_object_unregister(item->access_obj, ho);
1125 evas_object_del(item->access_obj);
1126 item->access_obj = NULL;
1130 _elm_access_2nd_click_timeout(Evas_Object *obj)
1134 t = evas_object_data_get(obj, "_elm_2nd_timeout");
1138 evas_object_data_del(obj, "_elm_2nd_timeout");
1139 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
1140 _access_2nd_click_del_cb, NULL);
1143 t = ecore_timer_add(0.3, _access_2nd_click_timeout_cb, obj);
1144 evas_object_data_set(obj, "_elm_2nd_timeout", t);
1145 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
1146 _access_2nd_click_del_cb, NULL);
1150 static Evas_Object *
1151 _elm_access_add(Evas_Object *parent)
1155 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1157 obj = elm_widget_add(_elm_access_smart_class_new(), parent);
1158 if (!obj) return NULL;
1160 if (!elm_widget_sub_object_add(parent, obj))
1161 ERR("could not add %p as sub object of %p", obj, parent);
1167 elm_access_object_register(Evas_Object *obj, Evas_Object *parent)
1169 return _access_object_register(obj, parent);
1173 elm_access_object_unregister(Evas_Object *obj)
1175 _access_object_unregister(obj);
1179 elm_access_object_get(const Evas_Object *obj)
1181 return evas_object_data_get(obj, "_part_access_obj");
1185 elm_access_info_set(Evas_Object *obj, int type, const char *text)
1187 _elm_access_text_set(_elm_access_object_get(obj), type, text);
1191 elm_access_info_get(const Evas_Object *obj, int type)
1193 return _elm_access_text_get(_elm_access_object_get(obj), type, obj);
1197 elm_access_info_cb_set(Evas_Object *obj, int type,
1198 Elm_Access_Info_Cb func, const void *data)
1200 _elm_access_callback_set(_elm_access_object_get(obj), type, func, data);
1204 elm_access_activate_cb_set(Evas_Object *obj,
1205 Elm_Access_Activate_Cb func, void *data)
1207 Elm_Access_Info *ac;
1209 ac = _elm_access_object_get(obj);
1212 ac->activate = func;
1213 ac->activate_data = data;
1217 elm_access_say(const char *text)
1221 _elm_access_say(text);
1225 elm_access_highlight_set(Evas_Object* obj)
1227 _elm_access_highlight_set(obj);
1231 elm_access_action(Evas_Object *obj, const Elm_Access_Action_Type type, void *action_info)
1234 Elm_Access_Action_Info *a;
1236 a = (Elm_Access_Action_Info *) action_info;
1240 case ELM_ACCESS_ACTION_HIGHLIGHT:
1241 evas = evas_object_evas_get(obj);
1242 if (!evas) return EINA_FALSE;
1244 _elm_access_mouse_event_enabled_set(EINA_TRUE);
1246 evas_event_feed_mouse_in(evas, 0, NULL);
1247 evas_event_feed_mouse_move(evas, a->x1, a->y1, 0, NULL);
1249 _elm_access_mouse_event_enabled_set(EINA_FALSE);
1252 case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
1253 if (a->highlight_cycle)
1254 _elm_access_highlight_cycle(obj, ELM_FOCUS_NEXT);
1256 return _access_highlight_next_get(obj, ELM_FOCUS_NEXT);
1259 case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
1260 if (a->highlight_cycle)
1261 _elm_access_highlight_cycle(obj, ELM_FOCUS_PREVIOUS);
1263 return _access_highlight_next_get(obj, ELM_FOCUS_PREVIOUS);
1266 case ELM_ACCESS_ACTION_ACTIVATE:
1267 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_DEFAULT);
1270 case ELM_ACCESS_ACTION_VALUE_CHANGE:
1271 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_UP);
1274 case ELM_ACCESS_ACTION_SCROLL:
1277 case ELM_ACCESS_ACTION_BACK:
1288 elm_access_action_cb_set(Evas_Object *obj, const Elm_Access_Action_Type type, const Elm_Access_Action_Cb cb, const void *data)
1291 a = evas_object_data_get(obj, "_elm_access_action_info");
1295 a = calloc(1, sizeof(Action_Info));
1296 evas_object_data_set(obj, "_elm_access_action_info", a);
1300 a->fn[type].cb = cb;
1301 a->fn[type].user_data = (void *)data;
1305 elm_access_external_info_set(Evas_Object *obj, const char *text)
1307 _elm_access_text_set
1308 (_elm_access_object_get(obj), ELM_ACCESS_CONTEXT_INFO, text);
1312 elm_access_external_info_get(const Evas_Object *obj)
1314 Elm_Access_Info *ac;
1316 ac = _elm_access_object_get(obj);
1317 return _elm_access_text_get(ac, ELM_ACCESS_CONTEXT_INFO, obj);