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 */
31 static Elm_Access_Action_Type action_type = ELM_ACCESS_ACTION_FIRST;
33 static Evas_Object * _elm_access_add(Evas_Object *parent);
36 _elm_access_smart_add(Evas_Object *obj)
38 EVAS_SMART_DATA_ALLOC(obj, Elm_Widget_Smart_Data);
39 ELM_WIDGET_CLASS(_elm_access_parent_sc)->base.add(obj);
41 elm_widget_can_focus_set(obj, EINA_TRUE);
45 _elm_access_smart_on_focus(Evas_Object *obj)
47 evas_object_focus_set(obj, elm_widget_focus_get(obj));
53 _elm_access_smart_activate(Evas_Object *obj, Elm_Activate act)
55 int type = ELM_ACCESS_ACTION_FIRST;
58 a = evas_object_data_get(obj, "_elm_access_action_info");
62 case ELM_ACTIVATE_DEFAULT:
63 type = ELM_ACCESS_ACTION_ACTIVATE;
67 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
70 case ELM_ACTIVATE_DOWN:
71 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
74 case ELM_ACTIVATE_RIGHT:
77 case ELM_ACTIVATE_LEFT:
84 if ((a) && (type > ELM_ACCESS_ACTION_FIRST) &&
85 (type < ELM_ACCESS_ACTION_LAST) &&
88 a->fn[type].cb(a->fn[type].user_data, obj, NULL);
92 /* TODO: deprecate below? and change above with _access_action_callback_call(); */
93 if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
95 Elm_Access_Info *ac = evas_object_data_get(obj, "_elm_access");
96 if (!ac) return EINA_FALSE;
99 ac->activate(ac->activate_data, ac->part_object,
100 (Elm_Object_Item *)ac->widget_item);
106 _elm_access_smart_set_user(Elm_Widget_Smart_Class *sc)
108 sc->base.add = _elm_access_smart_add;
110 /* not a 'focus chain manager' */
111 sc->focus_next = NULL;
112 sc->focus_direction = NULL;
113 sc->on_focus = _elm_access_smart_on_focus;
114 sc->activate = _elm_access_smart_activate;
119 typedef struct _Mod_Api Mod_Api;
123 void (*out_read) (const char *txt);
124 void (*out_read_done) (void);
125 void (*out_cancel) (void);
126 void (*out_done_callback_set) (void (*func) (void *data), const void *data);
129 static int initted = 0;
130 static Mod_Api *mapi = NULL;
137 if (initted > 1) return;
138 if (!(m = _elm_module_find_as("access/api"))) return;
139 m->api = malloc(sizeof(Mod_Api));
142 ((Mod_Api *)(m->api) )->out_read = // called to read out some text
143 _elm_module_symbol_get(m, "out_read");
144 ((Mod_Api *)(m->api) )->out_read_done = // called to set a done marker so when it is reached the done callback is called
145 _elm_module_symbol_get(m, "out_read_done");
146 ((Mod_Api *)(m->api) )->out_cancel = // called to read out some text
147 _elm_module_symbol_get(m, "out_cancel");
148 ((Mod_Api *)(m->api) )->out_done_callback_set = // called when last read done
149 _elm_module_symbol_get(m, "out_done_callback_set");
154 _access_shutdown(void)
157 if (initted == 0) return;
158 if (!(m = _elm_module_find_as("access/api"))) return;
168 static Elm_Access_Item *
169 _access_add_set(Elm_Access_Info *ac, int type)
174 if (!ac) return NULL;
175 EINA_LIST_FOREACH(ac->items, l, ai)
177 if (ai->type == type)
181 if (ai->data) eina_stringshare_del(ai->data);
188 ai = calloc(1, sizeof(Elm_Access_Item));
190 ac->items = eina_list_prepend(ac->items, ai);
195 _access_highlight_object_get(Evas_Object *obj)
199 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
202 ho = evas_object_data_get(o, "_elm_access_target");
208 _access_highlight_read(Elm_Access_Info *ac, Evas_Object *obj)
214 /*FIXME: TIZEN only - read at once because Tizen TTS engine performance is not good */
215 strbuf = eina_strbuf_new();
217 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
220 if (ac->on_highlight) ac->on_highlight(ac->on_highlight_data);
221 _elm_access_object_hilight(obj);
223 for (type = ELM_ACCESS_INFO_FIRST + 1; type < ELM_ACCESS_INFO_LAST; type++)
225 txt = _elm_access_text_get(ac, type, obj);
226 if (txt && (strlen(txt) > 0))
228 if (eina_strbuf_length_get(strbuf) > 0)
229 eina_strbuf_append_printf(strbuf, ", %s", txt);
231 eina_strbuf_append(strbuf, txt);
238 txt = eina_strbuf_string_steal(strbuf);
239 eina_strbuf_free(strbuf);
241 _elm_access_say(txt);
246 _access_obj_over_timeout_cb(void *data)
251 if (!data) return EINA_FALSE;
253 ac = evas_object_data_get(data, "_elm_access");
254 if (!ac) return EINA_FALSE;
256 ho = _access_highlight_object_get(data);
257 if (ho != data) _access_highlight_read(ac, data);
259 ac->delay_timer = NULL;
264 _access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
267 if (!mouse_event_enable) return;
269 ac = evas_object_data_get(data, "_elm_access");
274 ecore_timer_del(ac->delay_timer);
275 ac->delay_timer = NULL;
277 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
278 ac->delay_timer = ecore_timer_add(0.2, _access_obj_over_timeout_cb, data);
282 _access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
285 if (!mouse_event_enable) return;
287 ac = evas_object_data_get(data, "_elm_access");
290 _elm_access_object_unhilight(data);
293 ecore_timer_del(ac->delay_timer);
294 ac->delay_timer = NULL;
299 _access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
301 _elm_access_object_unregister(data, obj);
303 // _elm_access_edje_object_part_object_register(); set below object data
304 evas_object_data_del(obj, "_part_access_obj");
308 _access_read_done(void *data __UNUSED__)
310 printf("read done\n");
311 // FIXME: produce event here
315 _access_2nd_click_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
319 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
320 _access_2nd_click_del_cb, NULL);
321 t = evas_object_data_get(obj, "_elm_2nd_timeout");
325 evas_object_data_del(obj, "_elm_2nd_timeout");
330 _access_2nd_click_timeout_cb(void *data)
332 evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL,
333 _access_2nd_click_del_cb, NULL);
334 evas_object_data_del(data, "_elm_2nd_timeout");
339 _access_obj_hilight_del_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
341 _elm_access_object_hilight_disable(e);
345 _access_obj_hilight_hide_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
347 _elm_access_object_hilight_disable(e);
351 _access_obj_hilight_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
356 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
358 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
359 evas_object_move(o, x, y);
363 _access_obj_hilight_resize_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
368 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
370 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
371 evas_object_resize(o, w, h);
375 _elm_access_mouse_event_enabled_set(Eina_Bool enabled)
378 if (mouse_event_enable == enabled) return;
379 mouse_event_enable = enabled;
383 _elm_access_read_mode_set(Eina_Bool enabled)
386 if (read_mode == enabled) return;
391 _elm_access_read_mode_get()
397 _elm_access_shutdown()
403 _access_order_del_cb(void *data,
406 void *event_info __UNUSED__)
408 Elm_Widget_Item *item = data;
410 item->access_order = eina_list_remove(item->access_order, obj);
414 _elm_access_widget_item_access_order_set(Elm_Widget_Item *item,
422 _elm_access_widget_item_access_order_unset(item);
424 EINA_LIST_FOREACH(objs, l, o)
426 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL,
427 _access_order_del_cb, item);
430 item->access_order = objs;
434 _elm_access_widget_item_access_order_get(const Elm_Widget_Item *item)
436 if (!item) return NULL;
437 return item->access_order;
441 _elm_access_widget_item_access_order_unset(Elm_Widget_Item *item)
443 Eina_List *l, *l_next;
448 EINA_LIST_FOREACH_SAFE(item->access_order, l, l_next, o)
450 evas_object_event_callback_del_full
451 (o, EVAS_CALLBACK_DEL, _access_order_del_cb, item);
452 item->access_order = eina_list_remove_list(item->access_order, l);
457 _elm_access_highlight_object_scroll(Evas_Object *obj, int type, int x, int y)
461 Evas_Coord_Rectangle ho_area;
465 evas = evas_object_evas_get(obj);
471 ho = _access_highlight_object_get(obj);
479 /* find scrollable parent */
480 s_parent = elm_widget_parent_get(ho);
483 if(!!evas_object_smart_interface_get(s_parent, ELM_SCROLLABLE_IFACE_NAME))
485 s_parent = elm_widget_parent_get(s_parent);
488 if (!s_parent) return;
490 ELM_SCROLLABLE_IFACE_GET(s_parent, s_iface);
491 s_iface->repeat_events_set(s_parent, EINA_FALSE);
493 evas_object_geometry_get
494 (ho, &ho_area.x, &ho_area.y, &ho_area.w, &ho_area.h);
496 offset.x = x - (ho_area.x + (ho_area.w / 2));
497 offset.y = y - (ho_area.y + (ho_area.h / 2));
500 evas_event_feed_mouse_in(evas, 0, NULL);
501 evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL);
502 evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
506 if (!s_parent) return;
507 evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL);
511 if (!s_parent) return;
512 evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL);
514 ELM_SCROLLABLE_IFACE_GET(s_parent, s_iface);
515 s_iface->repeat_events_set(s_parent, EINA_TRUE);
524 _access_action_callback_call(Evas_Object *obj,
525 Elm_Access_Action_Type type,
532 a = evas_object_data_get(obj, "_elm_access_action_info");
534 if (a && (a->fn[type].cb))
535 ret = a->fn[type].cb(a->fn[type].user_data, obj, data);
541 _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir)
544 Evas_Object *ho, *parent, *target;
550 if (!elm_widget_is(obj)) return ret;
552 ho = _access_highlight_object_get(obj);
557 /* find highlight root */
560 ELM_WIDGET_DATA_GET(parent, sd);
561 if (sd->highlight_root)
563 /* change highlight root */
567 parent = elm_widget_parent_get(parent);
571 _elm_access_read_mode_set(EINA_TRUE);
573 ret = elm_widget_focus_next_get(obj, dir, &target);
576 if (dir == ELM_FOCUS_NEXT)
577 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
579 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
581 if (!_access_action_callback_call(ho, type, NULL))
583 /* change highlight object */
586 _elm_access_highlight_set(target);
589 action_type = ELM_ACCESS_ACTION_FIRST;
593 _elm_access_read_mode_set(EINA_FALSE);
598 //-------------------------------------------------------------------------//
600 _elm_access_highlight_set(Evas_Object* obj)
607 ho = _access_highlight_object_get(obj);
608 if (ho == obj) return;
610 ac = evas_object_data_get(obj, "_elm_access");
613 _access_highlight_read(ac, obj);
617 _elm_access_clear(Elm_Access_Info *ac)
624 ecore_timer_del(ac->delay_timer);
625 ac->delay_timer = NULL;
627 EINA_LIST_FREE(ac->items, ai)
631 if (ai->data) eina_stringshare_del(ai->data);
638 _elm_access_text_set(Elm_Access_Info *ac, int type, const char *text)
640 Elm_Access_Item *ai = _access_add_set(ac, type);
642 ai->data = eina_stringshare_add(text);
646 _elm_access_callback_set(Elm_Access_Info *ac, int type, Elm_Access_Info_Cb func, const void *data)
648 Elm_Access_Item *ai = _access_add_set(ac, type);
655 _elm_access_on_highlight_hook_set(Elm_Access_Info *ac,
656 Elm_Access_On_Highlight_Cb func,
660 ac->on_highlight = func;
661 ac->on_highlight_data = data;
665 _elm_access_activate_callback_set(Elm_Access_Info *ac,
666 Elm_Access_Activate_Cb func,
671 ac->activate_data = data;
675 _elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act)
677 Evas_Object *highlight;
679 highlight = _access_highlight_object_get(obj);
680 if (!highlight) return;
682 _elm_access_read_mode_set(EINA_FALSE);
684 if (!elm_object_focus_get(highlight))
685 elm_object_focus_set(highlight, EINA_TRUE);
687 elm_widget_activate(highlight, act);
692 _elm_access_highlight_cycle(Evas_Object *obj, Elm_Focus_Direction dir)
695 Evas_Object *ho, *parent;
697 ho = _access_highlight_object_get(obj);
702 /* find highlight root */
705 ELM_WIDGET_DATA_GET(parent, sd);
706 if (sd->highlight_root)
708 /* change highlight root */
712 parent = elm_widget_parent_get(parent);
716 _elm_access_read_mode_set(EINA_TRUE);
718 if (dir == ELM_FOCUS_NEXT)
719 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
721 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
725 if (!_access_action_callback_call(ho, type, NULL))
726 elm_widget_focus_cycle(obj, dir);
728 action_type = ELM_ACCESS_ACTION_FIRST;
730 _elm_access_read_mode_set(EINA_FALSE);
734 _elm_access_text_get(const Elm_Access_Info *ac, int type, const Evas_Object *obj)
739 if (!ac) return NULL;
740 EINA_LIST_FOREACH(ac->items, l, ai)
742 if (ai->type == type)
744 if (ai->func) return ai->func((void *)(ai->data), (Evas_Object *)obj);
745 else if (ai->data) return strdup(ai->data);
753 _elm_access_read(Elm_Access_Info *ac, int type, const Evas_Object *obj)
755 char *txt = _elm_access_text_get(ac, type, obj);
757 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
762 if (mapi->out_done_callback_set)
763 mapi->out_done_callback_set(_access_read_done, NULL);
764 if (type == ELM_ACCESS_DONE)
766 if (mapi->out_read_done) mapi->out_read_done();
768 else if (type == ELM_ACCESS_CANCEL)
770 if (mapi->out_cancel) mapi->out_cancel();
774 if (txt && mapi->out_read) mapi->out_read(txt);
781 _elm_access_say(const char *txt)
783 if (!_elm_config->access_mode) return;
785 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
790 if (mapi->out_done_callback_set)
791 mapi->out_done_callback_set(_access_read_done, NULL);
792 if (mapi->out_cancel) mapi->out_cancel();
795 if (mapi->out_read) mapi->out_read(txt);
796 //if (mapi->out_read) mapi->out_read(".\n"); /* TIZEN only: Tizen TTS engine performance is not good */
798 if (mapi->out_read_done) mapi->out_read_done();
802 EAPI Elm_Access_Info *
803 _elm_access_object_get(const Evas_Object *obj)
805 return evas_object_data_get(obj, "_elm_access");
809 _elm_access_object_hilight(Evas_Object *obj)
812 Evas_Coord x, y, w, h;
813 Elm_Access_Action_Info *a;
815 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
818 o = edje_object_add(evas_object_evas_get(obj));
819 evas_object_name_set(o, "_elm_access_disp");
820 evas_object_layer_set(o, ELM_OBJECT_LAYER_TOOLTIP);
824 Evas_Object *ptarget = evas_object_data_get(o, "_elm_access_target");
827 evas_object_data_del(o, "_elm_access_target");
828 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
830 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
831 _access_obj_hilight_del_cb, NULL);
832 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
833 _access_obj_hilight_hide_cb, NULL);
834 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
835 _access_obj_hilight_move_cb, NULL);
836 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
837 _access_obj_hilight_resize_cb, NULL);
838 _access_action_callback_call(ptarget, ELM_ACCESS_ACTION_UNHIGHLIGHT, NULL);
841 evas_object_data_set(o, "_elm_access_target", obj);
842 elm_widget_parent_highlight_set(obj, EINA_TRUE);
844 elm_widget_theme_object_set(obj, o, "access", "base", "default");
846 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
847 _access_obj_hilight_del_cb, NULL);
848 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE,
849 _access_obj_hilight_hide_cb, NULL);
850 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
851 _access_obj_hilight_move_cb, NULL);
852 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
853 _access_obj_hilight_resize_cb, NULL);
854 evas_object_raise(o);
855 evas_object_geometry_get(obj, &x, &y, &w, &h);
856 evas_object_move(o, x, y);
857 evas_object_resize(o, w, h);
859 /* use callback, should an access object do below every time when
860 * a window gets a client message ECORE_X_ATOM_E_ILLMUE_ACTION_READ? */
861 a = calloc(1, sizeof(Elm_Access_Action_Info));
862 a->action_type = action_type;
863 if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, a))
871 _elm_access_object_unhilight(Evas_Object *obj)
873 Evas_Object *o, *ptarget;
875 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
877 ptarget = evas_object_data_get(o, "_elm_access_target");
880 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
881 _access_obj_hilight_del_cb, NULL);
882 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
883 _access_obj_hilight_hide_cb, NULL);
884 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
885 _access_obj_hilight_move_cb, NULL);
886 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
887 _access_obj_hilight_resize_cb, NULL);
889 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
890 _access_action_callback_call(ptarget, ELM_ACCESS_ACTION_UNHIGHLIGHT, NULL);
895 _content_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj,
896 void *event_info __UNUSED__)
898 Evas_Object *accessobj;
902 if (!accessobj) return;
904 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
905 evas_object_resize(accessobj, w, h);
909 _content_move(void *data, Evas *e __UNUSED__, Evas_Object *obj,
910 void *event_info __UNUSED__)
912 Evas_Object *accessobj;
916 if (!accessobj) return;
918 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
919 evas_object_move(accessobj, x, y);
923 _access_object_register(Evas_Object *obj, Evas_Object *parent)
927 Evas_Coord x, y, w, h;
929 if (!obj) return NULL;
931 /* create access object */
932 ao = _elm_access_add(parent);
933 if (!ao) return NULL;
935 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
936 _content_resize, ao);
937 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
940 evas_object_geometry_get(obj, &x, &y, &w, &h);
941 evas_object_move(ao, x, y);
942 evas_object_resize(ao, w, h);
943 evas_object_show(ao);
945 /* register access object */
946 _elm_access_object_register(ao, obj);
948 /* set access object */
949 evas_object_data_set(obj, "_part_access_obj", ao);
951 /* set owner part object */
952 ac = evas_object_data_get(ao, "_elm_access");
953 ac->part_object = obj;
959 _access_object_unregister(Evas_Object *obj)
966 ao = evas_object_data_get(obj, "_part_access_obj");
970 evas_object_data_del(obj, "_part_access_obj");
972 /* delete callbacks */
973 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_RESIZE,
974 _content_resize, ao);
975 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
978 /* unregister access object */
979 _elm_access_object_unregister(ao, obj);
985 /* button, check, label etc. */
986 ac = evas_object_data_get(obj, "_elm_access");
987 if (ac && ac->hoverobj)
988 _elm_access_object_unregister(obj, ac->hoverobj);
993 _elm_access_edje_object_part_object_register(Evas_Object* obj,
994 const Evas_Object *eobj,
997 Evas_Object *ao, *po;
999 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
1000 if (!obj || !po) return NULL;
1002 /* check previous access object */
1003 ao = evas_object_data_get(po, "_part_access_obj");
1005 _elm_access_edje_object_part_object_unregister(obj, eobj, part);
1007 ao = _access_object_register(po, obj);
1012 //FIXME: unused obj should be removed from here and each widget.
1014 _elm_access_edje_object_part_object_unregister(Evas_Object* obj __UNUSED__,
1015 const Evas_Object *eobj,
1020 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
1023 _access_object_unregister(po);
1027 _elm_access_object_hilight_disable(Evas *e)
1029 Evas_Object *o, *ptarget;
1031 o = evas_object_name_find(e, "_elm_access_disp");
1033 ptarget = evas_object_data_get(o, "_elm_access_target");
1036 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
1037 _access_obj_hilight_del_cb, NULL);
1038 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
1039 _access_obj_hilight_hide_cb, NULL);
1040 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
1041 _access_obj_hilight_move_cb, NULL);
1042 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
1043 _access_obj_hilight_resize_cb, NULL);
1046 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
1050 _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
1052 Elm_Access_Info *ac;
1054 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
1055 _access_obj_mouse_in_cb, obj);
1056 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
1057 _access_obj_mouse_out_cb, obj);
1058 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_DEL,
1059 _access_obj_del_cb, obj);
1060 ac = calloc(1, sizeof(Elm_Access_Info));
1061 evas_object_data_set(obj, "_elm_access", ac);
1063 ac->hoverobj = hoverobj;
1067 _elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj)
1069 Elm_Access_Info *ac;
1071 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_IN,
1072 _access_obj_mouse_in_cb, obj);
1073 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
1074 _access_obj_mouse_out_cb, obj);
1075 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_DEL,
1076 _access_obj_del_cb, obj);
1078 ac = evas_object_data_get(obj, "_elm_access");
1079 evas_object_data_del(obj, "_elm_access");
1082 _elm_access_clear(ac);
1087 a = evas_object_data_get(obj, "_elm_access_action_info");
1092 _elm_access_widget_item_register(Elm_Widget_Item *item)
1094 Evas_Object *ao, *ho;
1095 Evas_Coord x, y, w, h;
1096 Elm_Access_Info *ac;
1098 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1100 /* check previous access object */
1101 if (item->access_obj)
1102 _elm_access_widget_item_unregister(item);
1104 // create access object
1106 ao = _elm_access_add(item->widget);
1109 evas_object_event_callback_add(ho, EVAS_CALLBACK_RESIZE,
1110 _content_resize, ao);
1111 evas_object_event_callback_add(ho, EVAS_CALLBACK_MOVE,
1114 evas_object_geometry_get(ho, &x, &y, &w, &h);
1115 evas_object_move(ao, x, y);
1116 evas_object_resize(ao, w, h);
1117 evas_object_show(ao);
1119 // register access object
1120 _elm_access_object_register(ao, ho);
1122 item->access_obj = ao;
1124 /* set owner widget item */
1125 ac = evas_object_data_get(ao, "_elm_access");
1126 ac->widget_item = item;
1130 _elm_access_widget_item_unregister(Elm_Widget_Item *item)
1134 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1136 if (!item->access_obj) return;
1139 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_RESIZE,
1140 _content_resize, item->access_obj);
1141 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_MOVE,
1142 _content_move, item->access_obj);
1144 _elm_access_object_unregister(item->access_obj, ho);
1146 evas_object_del(item->access_obj);
1147 item->access_obj = NULL;
1151 _elm_access_2nd_click_timeout(Evas_Object *obj)
1155 t = evas_object_data_get(obj, "_elm_2nd_timeout");
1159 evas_object_data_del(obj, "_elm_2nd_timeout");
1160 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
1161 _access_2nd_click_del_cb, NULL);
1164 t = ecore_timer_add(0.3, _access_2nd_click_timeout_cb, obj);
1165 evas_object_data_set(obj, "_elm_2nd_timeout", t);
1166 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
1167 _access_2nd_click_del_cb, NULL);
1171 static Evas_Object *
1172 _elm_access_add(Evas_Object *parent)
1176 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1178 obj = elm_widget_add(_elm_access_smart_class_new(), parent);
1179 if (!obj) return NULL;
1181 if (!elm_widget_sub_object_add(parent, obj))
1182 ERR("could not add %p as sub object of %p", obj, parent);
1188 elm_access_object_register(Evas_Object *obj, Evas_Object *parent)
1190 return _access_object_register(obj, parent);
1194 elm_access_object_unregister(Evas_Object *obj)
1196 _access_object_unregister(obj);
1200 elm_access_object_get(const Evas_Object *obj)
1202 return evas_object_data_get(obj, "_part_access_obj");
1206 elm_access_info_set(Evas_Object *obj, int type, const char *text)
1208 _elm_access_text_set(_elm_access_object_get(obj), type, text);
1212 elm_access_info_get(const Evas_Object *obj, int type)
1214 return _elm_access_text_get(_elm_access_object_get(obj), type, obj);
1218 elm_access_info_cb_set(Evas_Object *obj, int type,
1219 Elm_Access_Info_Cb func, const void *data)
1221 _elm_access_callback_set(_elm_access_object_get(obj), type, func, data);
1225 elm_access_activate_cb_set(Evas_Object *obj,
1226 Elm_Access_Activate_Cb func, void *data)
1228 Elm_Access_Info *ac;
1230 ac = _elm_access_object_get(obj);
1233 ac->activate = func;
1234 ac->activate_data = data;
1238 elm_access_say(const char *text)
1242 _elm_access_say(text);
1246 elm_access_highlight_set(Evas_Object* obj)
1248 _elm_access_highlight_set(obj);
1252 elm_access_action(Evas_Object *obj, const Elm_Access_Action_Type type, void *action_info)
1256 Elm_Access_Action_Info *a;
1258 a = (Elm_Access_Action_Info *) action_info;
1262 case ELM_ACCESS_ACTION_READ:
1263 case ELM_ACCESS_ACTION_HIGHLIGHT:
1264 evas = evas_object_evas_get(obj);
1265 if (!evas) return EINA_FALSE;
1267 _elm_access_mouse_event_enabled_set(EINA_TRUE);
1269 evas_event_feed_mouse_in(evas, 0, NULL);
1270 evas_event_feed_mouse_move(evas, a->x, a->y, 0, NULL);
1271 _elm_access_mouse_event_enabled_set(EINA_FALSE);
1273 ho = _access_highlight_object_get(obj);
1275 _access_action_callback_call(ho, ELM_ACCESS_ACTION_READ, a);
1278 case ELM_ACCESS_ACTION_UNHIGHLIGHT:
1281 case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
1282 if (a->highlight_cycle)
1283 _elm_access_highlight_cycle(obj, ELM_FOCUS_NEXT);
1285 return _access_highlight_next_get(obj, ELM_FOCUS_NEXT);
1288 case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
1289 if (a->highlight_cycle)
1290 _elm_access_highlight_cycle(obj, ELM_FOCUS_PREVIOUS);
1292 return _access_highlight_next_get(obj, ELM_FOCUS_PREVIOUS);
1295 case ELM_ACCESS_ACTION_ACTIVATE:
1296 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_DEFAULT);
1299 case ELM_ACCESS_ACTION_VALUE_CHANGE:
1300 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_UP);
1303 case ELM_ACCESS_ACTION_SCROLL:
1306 case ELM_ACCESS_ACTION_BACK:
1317 elm_access_action_cb_set(Evas_Object *obj, const Elm_Access_Action_Type type, const Elm_Access_Action_Cb cb, const void *data)
1320 a = evas_object_data_get(obj, "_elm_access_action_info");
1324 a = calloc(1, sizeof(Action_Info));
1325 evas_object_data_set(obj, "_elm_access_action_info", a);
1329 a->fn[type].cb = cb;
1330 a->fn[type].user_data = (void *)data;
1334 elm_access_external_info_set(Evas_Object *obj, const char *text)
1336 _elm_access_text_set
1337 (_elm_access_object_get(obj), ELM_ACCESS_CONTEXT_INFO, text);
1341 elm_access_external_info_get(const Evas_Object *obj)
1343 Elm_Access_Info *ac;
1345 ac = _elm_access_object_get(obj);
1346 return _elm_access_text_get(ac, ELM_ACCESS_CONTEXT_INFO, obj);