1 #include <Elementary.h>
4 static const char ACCESS_SMART_NAME[] = "elm_access";
6 ELM_INTERNAL_SMART_SUBCLASS_NEW
7 (ACCESS_SMART_NAME, _elm_access, Elm_Widget_Smart_Class,
8 Elm_Widget_Smart_Class, elm_widget_smart_class_get, NULL);
12 void *user_data; /* Holds user data to CB */
13 Elm_Access_Action_Cb cb;
16 typedef struct _Func_Data Func_Data;
21 Func_Data fn[ELM_ACCESS_ACTION_LAST + 1]; /* Callback for specific action */
24 typedef struct _Action_Info Action_Info;
26 static Eina_Bool mouse_event_enable = EINA_TRUE;
27 static Eina_Bool read_mode = EINA_FALSE;
29 static Evas_Object * _elm_access_add(Evas_Object *parent);
32 _elm_access_smart_add(Evas_Object *obj)
34 EVAS_SMART_DATA_ALLOC(obj, Elm_Widget_Smart_Data);
35 ELM_WIDGET_CLASS(_elm_access_parent_sc)->base.add(obj);
37 elm_widget_can_focus_set(obj, EINA_TRUE);
41 _elm_access_smart_on_focus(Evas_Object *obj)
43 evas_object_focus_set(obj, elm_widget_focus_get(obj));
49 _elm_access_smart_activate(Evas_Object *obj, Elm_Activate act)
51 int type = ELM_ACCESS_ACTION_FIRST;
54 a = evas_object_data_get(obj, "_elm_access_action_info");
58 case ELM_ACTIVATE_DEFAULT:
59 type = ELM_ACCESS_ACTION_ACTIVATE;
63 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
66 case ELM_ACTIVATE_DOWN:
67 type = ELM_ACCESS_ACTION_VALUE_CHANGE;
70 case ELM_ACTIVATE_RIGHT:
73 case ELM_ACTIVATE_LEFT:
80 if ((a) && (type > ELM_ACCESS_ACTION_FIRST) &&
81 (type < ELM_ACCESS_ACTION_LAST) &&
84 a->fn[type].cb(a->fn[type].user_data, obj, NULL);
88 /* TODO: deprecate below? and change above with _access_action_callback_call(); */
89 if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
91 Elm_Access_Info *ac = evas_object_data_get(obj, "_elm_access");
92 if (!ac) return EINA_FALSE;
95 ac->activate(ac->activate_data, ac->part_object,
96 (Elm_Object_Item *)ac->widget_item);
102 _elm_access_smart_set_user(Elm_Widget_Smart_Class *sc)
104 sc->base.add = _elm_access_smart_add;
106 /* not a 'focus chain manager' */
107 sc->focus_next = NULL;
108 sc->focus_direction = NULL;
109 sc->on_focus = _elm_access_smart_on_focus;
110 sc->activate = _elm_access_smart_activate;
115 typedef struct _Mod_Api Mod_Api;
119 void (*out_read) (const char *txt);
120 void (*out_read_done) (void);
121 void (*out_cancel) (void);
122 void (*out_done_callback_set) (void (*func) (void *data), const void *data);
125 static int initted = 0;
126 static Mod_Api *mapi = NULL;
133 if (initted > 1) return;
134 if (!(m = _elm_module_find_as("access/api"))) return;
135 m->api = malloc(sizeof(Mod_Api));
138 ((Mod_Api *)(m->api) )->out_read = // called to read out some text
139 _elm_module_symbol_get(m, "out_read");
140 ((Mod_Api *)(m->api) )->out_read_done = // called to set a done marker so when it is reached the done callback is called
141 _elm_module_symbol_get(m, "out_read_done");
142 ((Mod_Api *)(m->api) )->out_cancel = // called to read out some text
143 _elm_module_symbol_get(m, "out_cancel");
144 ((Mod_Api *)(m->api) )->out_done_callback_set = // called when last read done
145 _elm_module_symbol_get(m, "out_done_callback_set");
150 _access_shutdown(void)
153 if (initted == 0) return;
154 if (!(m = _elm_module_find_as("access/api"))) return;
164 static Elm_Access_Item *
165 _access_add_set(Elm_Access_Info *ac, int type)
170 if (!ac) return NULL;
171 EINA_LIST_FOREACH(ac->items, l, ai)
173 if (ai->type == type)
177 if (ai->data) eina_stringshare_del(ai->data);
184 ai = calloc(1, sizeof(Elm_Access_Item));
186 ac->items = eina_list_prepend(ac->items, ai);
191 _access_highlight_object_get(Evas_Object *obj)
195 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
198 ho = evas_object_data_get(o, "_elm_access_target");
204 _access_highlight_read(Elm_Access_Info *ac, Evas_Object *obj)
210 /*FIXME: TIZEN only - read at once because Tizen TTS engine performance is not good */
211 strbuf = eina_strbuf_new();
213 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
216 if (ac->on_highlight) ac->on_highlight(ac->on_highlight_data);
217 _elm_access_object_hilight(obj);
219 for (type = ELM_ACCESS_INFO_FIRST + 1; type < ELM_ACCESS_INFO_LAST; type++)
221 txt = _elm_access_text_get(ac, type, obj);
222 if (txt && (strlen(txt) > 0))
224 if (eina_strbuf_length_get(strbuf) > 0)
225 eina_strbuf_append_printf(strbuf, ", %s", txt);
227 eina_strbuf_append(strbuf, txt);
234 txt = eina_strbuf_string_steal(strbuf);
235 eina_strbuf_free(strbuf);
237 _elm_access_say(txt);
242 _access_obj_over_timeout_cb(void *data)
247 if (!data) return EINA_FALSE;
249 ac = evas_object_data_get(data, "_elm_access");
250 if (!ac) return EINA_FALSE;
252 ho = _access_highlight_object_get(data);
253 if (ho != data) _access_highlight_read(ac, data);
255 ac->delay_timer = NULL;
260 _access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
263 if (!mouse_event_enable) return;
265 ac = evas_object_data_get(data, "_elm_access");
270 ecore_timer_del(ac->delay_timer);
271 ac->delay_timer = NULL;
273 if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
274 ac->delay_timer = ecore_timer_add(0.2, _access_obj_over_timeout_cb, data);
278 _access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
281 if (!mouse_event_enable) return;
283 ac = evas_object_data_get(data, "_elm_access");
286 _elm_access_object_unhilight(data);
289 ecore_timer_del(ac->delay_timer);
290 ac->delay_timer = NULL;
295 _access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
297 _elm_access_object_unregister(data, obj);
299 // _elm_access_edje_object_part_object_register(); set below object data
300 evas_object_data_del(obj, "_part_access_obj");
304 _access_read_done(void *data __UNUSED__)
306 printf("read done\n");
307 // FIXME: produce event here
311 _access_2nd_click_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
315 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
316 _access_2nd_click_del_cb, NULL);
317 t = evas_object_data_get(obj, "_elm_2nd_timeout");
321 evas_object_data_del(obj, "_elm_2nd_timeout");
326 _access_2nd_click_timeout_cb(void *data)
328 evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL,
329 _access_2nd_click_del_cb, NULL);
330 evas_object_data_del(data, "_elm_2nd_timeout");
335 _access_obj_hilight_del_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
337 _elm_access_object_hilight_disable(e);
341 _access_obj_hilight_hide_cb(void *data __UNUSED__, Evas *e, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
343 _elm_access_object_hilight_disable(e);
347 _access_obj_hilight_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
352 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
354 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
355 evas_object_move(o, x, y);
359 _access_obj_hilight_resize_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
364 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
366 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
367 evas_object_resize(o, w, h);
371 _elm_access_mouse_event_enabled_set(Eina_Bool enabled)
374 if (mouse_event_enable == enabled) return;
375 mouse_event_enable = enabled;
379 _elm_access_read_mode_set(Eina_Bool enabled)
382 if (read_mode == enabled) return;
387 _elm_access_read_mode_get()
393 _elm_access_shutdown()
399 _access_order_del_cb(void *data,
402 void *event_info __UNUSED__)
404 Elm_Widget_Item *item = data;
406 item->access_order = eina_list_remove(item->access_order, obj);
410 _elm_access_widget_item_access_order_set(Elm_Widget_Item *item,
418 _elm_access_widget_item_access_order_unset(item);
420 EINA_LIST_FOREACH(objs, l, o)
422 evas_object_event_callback_add(o, EVAS_CALLBACK_DEL,
423 _access_order_del_cb, item);
426 item->access_order = objs;
430 _elm_access_widget_item_access_order_get(const Elm_Widget_Item *item)
432 if (!item) return NULL;
433 return item->access_order;
437 _elm_access_widget_item_access_order_unset(Elm_Widget_Item *item)
439 Eina_List *l, *l_next;
444 EINA_LIST_FOREACH_SAFE(item->access_order, l, l_next, o)
446 evas_object_event_callback_del_full
447 (o, EVAS_CALLBACK_DEL, _access_order_del_cb, item);
448 item->access_order = eina_list_remove_list(item->access_order, l);
453 _access_action_callback_call(Evas_Object *obj,
454 Elm_Access_Action_Type type,
461 a = evas_object_data_get(obj, "_elm_access_action_info");
463 if (a && (a->fn[type].cb))
464 ret = a->fn[type].cb(a->fn[type].user_data, obj, data);
470 _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir)
473 Evas_Object *ho, *parent, *target;
479 if (!elm_widget_is(obj)) return ret;
481 ho = _access_highlight_object_get(obj);
486 /* find highlight root */
489 ELM_WIDGET_DATA_GET(parent, sd);
490 if (sd->highlight_root)
492 /* change highlight root */
496 parent = elm_widget_parent_get(parent);
500 _elm_access_read_mode_set(EINA_TRUE);
502 ret = elm_widget_focus_next_get(obj, dir, &target);
505 if (dir == ELM_FOCUS_NEXT)
506 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
508 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
510 if (!_access_action_callback_call(ho, type, NULL))
512 _elm_access_highlight_set(target);
517 _elm_access_read_mode_set(EINA_FALSE);
521 //-------------------------------------------------------------------------//
523 _elm_access_highlight_set(Evas_Object* obj)
530 ho = _access_highlight_object_get(obj);
531 if (ho == obj) return;
533 ac = evas_object_data_get(obj, "_elm_access");
536 _access_highlight_read(ac, obj);
540 _elm_access_clear(Elm_Access_Info *ac)
547 ecore_timer_del(ac->delay_timer);
548 ac->delay_timer = NULL;
550 EINA_LIST_FREE(ac->items, ai)
554 if (ai->data) eina_stringshare_del(ai->data);
561 _elm_access_text_set(Elm_Access_Info *ac, int type, const char *text)
563 Elm_Access_Item *ai = _access_add_set(ac, type);
565 ai->data = eina_stringshare_add(text);
569 _elm_access_callback_set(Elm_Access_Info *ac, int type, Elm_Access_Info_Cb func, const void *data)
571 Elm_Access_Item *ai = _access_add_set(ac, type);
578 _elm_access_on_highlight_hook_set(Elm_Access_Info *ac,
579 Elm_Access_On_Highlight_Cb func,
583 ac->on_highlight = func;
584 ac->on_highlight_data = data;
588 _elm_access_activate_callback_set(Elm_Access_Info *ac,
589 Elm_Access_Activate_Cb func,
594 ac->activate_data = data;
598 _elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act)
600 Evas_Object *highlight;
602 highlight = _access_highlight_object_get(obj);
603 if (!highlight) return;
605 _elm_access_read_mode_set(EINA_FALSE);
607 if (!elm_object_focus_get(highlight))
608 elm_object_focus_set(highlight, EINA_TRUE);
610 elm_widget_activate(highlight, act);
615 _elm_access_highlight_cycle(Evas_Object *obj, Elm_Focus_Direction dir)
618 Evas_Object *ho, *parent;
620 ho = _access_highlight_object_get(obj);
625 /* find highlight root */
628 ELM_WIDGET_DATA_GET(parent, sd);
629 if (sd->highlight_root)
631 /* change highlight root */
635 parent = elm_widget_parent_get(parent);
639 _elm_access_read_mode_set(EINA_TRUE);
641 if (dir == ELM_FOCUS_NEXT)
642 type = ELM_ACCESS_ACTION_HIGHLIGHT_NEXT;
644 type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV;
646 if (!_access_action_callback_call(ho, type, NULL))
647 elm_widget_focus_cycle(obj, dir);
649 _elm_access_read_mode_set(EINA_FALSE);
653 _elm_access_text_get(const Elm_Access_Info *ac, int type, const Evas_Object *obj)
658 if (!ac) return NULL;
659 EINA_LIST_FOREACH(ac->items, l, ai)
661 if (ai->type == type)
663 if (ai->func) return ai->func((void *)(ai->data), (Evas_Object *)obj);
664 else if (ai->data) return strdup(ai->data);
672 _elm_access_read(Elm_Access_Info *ac, int type, const Evas_Object *obj)
674 char *txt = _elm_access_text_get(ac, type, obj);
676 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
681 if (mapi->out_done_callback_set)
682 mapi->out_done_callback_set(_access_read_done, NULL);
683 if (type == ELM_ACCESS_DONE)
685 if (mapi->out_read_done) mapi->out_read_done();
687 else if (type == ELM_ACCESS_CANCEL)
689 if (mapi->out_cancel) mapi->out_cancel();
693 if (txt && mapi->out_read) mapi->out_read(txt);
700 _elm_access_say(const char *txt)
702 if (!_elm_config->access_mode) return;
704 if (txt && strlen(txt) == 0) return; /* Tizen only: TTS engine does not work properly */
709 if (mapi->out_done_callback_set)
710 mapi->out_done_callback_set(_access_read_done, NULL);
711 if (mapi->out_cancel) mapi->out_cancel();
714 if (mapi->out_read) mapi->out_read(txt);
715 //if (mapi->out_read) mapi->out_read(".\n"); /* TIZEN only: Tizen TTS engine performance is not good */
717 if (mapi->out_read_done) mapi->out_read_done();
721 EAPI Elm_Access_Info *
722 _elm_access_object_get(const Evas_Object *obj)
724 return evas_object_data_get(obj, "_elm_access");
728 _elm_access_object_hilight(Evas_Object *obj)
731 Evas_Coord x, y, w, h;
733 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
736 o = edje_object_add(evas_object_evas_get(obj));
737 evas_object_name_set(o, "_elm_access_disp");
738 evas_object_layer_set(o, ELM_OBJECT_LAYER_TOOLTIP);
742 Evas_Object *ptarget = evas_object_data_get(o, "_elm_access_target");
745 evas_object_data_del(o, "_elm_access_target");
746 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
748 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
749 _access_obj_hilight_del_cb, NULL);
750 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
751 _access_obj_hilight_hide_cb, NULL);
752 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
753 _access_obj_hilight_move_cb, NULL);
754 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
755 _access_obj_hilight_resize_cb, NULL);
758 evas_object_data_set(o, "_elm_access_target", obj);
759 elm_widget_parent_highlight_set(obj, EINA_TRUE);
761 elm_widget_theme_object_set(obj, o, "access", "base", "default");
763 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
764 _access_obj_hilight_del_cb, NULL);
765 evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE,
766 _access_obj_hilight_hide_cb, NULL);
767 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
768 _access_obj_hilight_move_cb, NULL);
769 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
770 _access_obj_hilight_resize_cb, NULL);
771 evas_object_raise(o);
772 evas_object_geometry_get(obj, &x, &y, &w, &h);
773 evas_object_move(o, x, y);
774 evas_object_resize(o, w, h);
776 /* use callback, should an access object do below every time when
777 * a window gets a client message ECORE_X_ATOM_E_ILLMUE_ACTION_READ? */
778 if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, NULL))
785 _elm_access_object_unhilight(Evas_Object *obj)
787 Evas_Object *o, *ptarget;
789 o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
791 ptarget = evas_object_data_get(o, "_elm_access_target");
794 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
795 _access_obj_hilight_del_cb, NULL);
796 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
797 _access_obj_hilight_hide_cb, NULL);
798 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
799 _access_obj_hilight_move_cb, NULL);
800 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
801 _access_obj_hilight_resize_cb, NULL);
803 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
808 _content_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj,
809 void *event_info __UNUSED__)
811 Evas_Object *accessobj;
815 if (!accessobj) return;
817 evas_object_geometry_get(obj, NULL, NULL, &w, &h);
818 evas_object_resize(accessobj, w, h);
822 _content_move(void *data, Evas *e __UNUSED__, Evas_Object *obj,
823 void *event_info __UNUSED__)
825 Evas_Object *accessobj;
829 if (!accessobj) return;
831 evas_object_geometry_get(obj, &x, &y, NULL, NULL);
832 evas_object_move(accessobj, x, y);
836 _access_object_register(Evas_Object *obj, Evas_Object *parent)
840 Evas_Coord x, y, w, h;
842 if (!obj) return NULL;
844 /* create access object */
845 ao = _elm_access_add(parent);
846 if (!ao) return NULL;
848 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
849 _content_resize, ao);
850 evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
853 evas_object_geometry_get(obj, &x, &y, &w, &h);
854 evas_object_move(ao, x, y);
855 evas_object_resize(ao, w, h);
856 evas_object_show(ao);
858 /* register access object */
859 _elm_access_object_register(ao, obj);
861 /* set access object */
862 evas_object_data_set(obj, "_part_access_obj", ao);
864 /* set owner part object */
865 ac = evas_object_data_get(ao, "_elm_access");
866 ac->part_object = obj;
872 _access_object_unregister(Evas_Object *obj)
879 ao = evas_object_data_get(obj, "_part_access_obj");
883 evas_object_data_del(obj, "_part_access_obj");
885 /* delete callbacks */
886 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_RESIZE,
887 _content_resize, ao);
888 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
891 /* unregister access object */
892 _elm_access_object_unregister(ao, obj);
898 /* button, check, label etc. */
899 ac = evas_object_data_get(obj, "_elm_access");
900 if (ac && ac->hoverobj)
901 _elm_access_object_unregister(obj, ac->hoverobj);
906 _elm_access_edje_object_part_object_register(Evas_Object* obj,
907 const Evas_Object *eobj,
910 Evas_Object *ao, *po;
912 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
913 if (!obj || !po) return NULL;
915 /* check previous access object */
916 ao = evas_object_data_get(po, "_part_access_obj");
918 _elm_access_edje_object_part_object_unregister(obj, eobj, part);
920 ao = _access_object_register(po, obj);
925 //FIXME: unused obj should be removed from here and each widget.
927 _elm_access_edje_object_part_object_unregister(Evas_Object* obj __UNUSED__,
928 const Evas_Object *eobj,
933 po = (Evas_Object *)edje_object_part_object_get(eobj, part);
936 _access_object_unregister(po);
940 _elm_access_object_hilight_disable(Evas *e)
942 Evas_Object *o, *ptarget;
944 o = evas_object_name_find(e, "_elm_access_disp");
946 ptarget = evas_object_data_get(o, "_elm_access_target");
949 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_DEL,
950 _access_obj_hilight_del_cb, NULL);
951 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_HIDE,
952 _access_obj_hilight_hide_cb, NULL);
953 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_MOVE,
954 _access_obj_hilight_move_cb, NULL);
955 evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE,
956 _access_obj_hilight_resize_cb, NULL);
959 elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
963 _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
967 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
968 _access_obj_mouse_in_cb, obj);
969 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
970 _access_obj_mouse_out_cb, obj);
971 evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_DEL,
972 _access_obj_del_cb, obj);
973 ac = calloc(1, sizeof(Elm_Access_Info));
974 evas_object_data_set(obj, "_elm_access", ac);
976 ac->hoverobj = hoverobj;
980 _elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj)
984 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_IN,
985 _access_obj_mouse_in_cb, obj);
986 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
987 _access_obj_mouse_out_cb, obj);
988 evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_DEL,
989 _access_obj_del_cb, obj);
991 ac = evas_object_data_get(obj, "_elm_access");
992 evas_object_data_del(obj, "_elm_access");
995 _elm_access_clear(ac);
1000 a = evas_object_data_get(obj, "_elm_access_action_info");
1005 _elm_access_widget_item_register(Elm_Widget_Item *item)
1007 Evas_Object *ao, *ho;
1008 Evas_Coord x, y, w, h;
1009 Elm_Access_Info *ac;
1011 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1013 /* check previous access object */
1014 if (item->access_obj)
1015 _elm_access_widget_item_unregister(item);
1017 // create access object
1019 ao = _elm_access_add(item->widget);
1022 evas_object_event_callback_add(ho, EVAS_CALLBACK_RESIZE,
1023 _content_resize, ao);
1024 evas_object_event_callback_add(ho, EVAS_CALLBACK_MOVE,
1027 evas_object_geometry_get(ho, &x, &y, &w, &h);
1028 evas_object_move(ao, x, y);
1029 evas_object_resize(ao, w, h);
1030 evas_object_show(ao);
1032 // register access object
1033 _elm_access_object_register(ao, ho);
1035 item->access_obj = ao;
1037 /* set owner widget item */
1038 ac = evas_object_data_get(ao, "_elm_access");
1039 ac->widget_item = item;
1043 _elm_access_widget_item_unregister(Elm_Widget_Item *item)
1047 ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
1049 if (!item->access_obj) return;
1052 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_RESIZE,
1053 _content_resize, item->access_obj);
1054 evas_object_event_callback_del_full(ho, EVAS_CALLBACK_MOVE,
1055 _content_move, item->access_obj);
1057 _elm_access_object_unregister(item->access_obj, ho);
1059 evas_object_del(item->access_obj);
1060 item->access_obj = NULL;
1064 _elm_access_2nd_click_timeout(Evas_Object *obj)
1068 t = evas_object_data_get(obj, "_elm_2nd_timeout");
1072 evas_object_data_del(obj, "_elm_2nd_timeout");
1073 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
1074 _access_2nd_click_del_cb, NULL);
1077 t = ecore_timer_add(0.3, _access_2nd_click_timeout_cb, obj);
1078 evas_object_data_set(obj, "_elm_2nd_timeout", t);
1079 evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
1080 _access_2nd_click_del_cb, NULL);
1084 static Evas_Object *
1085 _elm_access_add(Evas_Object *parent)
1089 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1091 obj = elm_widget_add(_elm_access_smart_class_new(), parent);
1092 if (!obj) return NULL;
1094 if (!elm_widget_sub_object_add(parent, obj))
1095 ERR("could not add %p as sub object of %p", obj, parent);
1101 elm_access_object_register(Evas_Object *obj, Evas_Object *parent)
1103 return _access_object_register(obj, parent);
1107 elm_access_object_unregister(Evas_Object *obj)
1109 _access_object_unregister(obj);
1113 elm_access_object_get(const Evas_Object *obj)
1115 return evas_object_data_get(obj, "_part_access_obj");
1119 elm_access_info_set(Evas_Object *obj, int type, const char *text)
1121 _elm_access_text_set(_elm_access_object_get(obj), type, text);
1125 elm_access_info_get(const Evas_Object *obj, int type)
1127 return _elm_access_text_get(_elm_access_object_get(obj), type, obj);
1131 elm_access_info_cb_set(Evas_Object *obj, int type,
1132 Elm_Access_Info_Cb func, const void *data)
1134 _elm_access_callback_set(_elm_access_object_get(obj), type, func, data);
1138 elm_access_activate_cb_set(Evas_Object *obj,
1139 Elm_Access_Activate_Cb func, void *data)
1141 Elm_Access_Info *ac;
1143 ac = _elm_access_object_get(obj);
1146 ac->activate = func;
1147 ac->activate_data = data;
1151 elm_access_say(const char *text)
1155 _elm_access_say(text);
1159 elm_access_highlight_set(Evas_Object* obj)
1161 _elm_access_highlight_set(obj);
1165 elm_access_action(Evas_Object *obj, const Elm_Access_Action_Type type, void *action_info)
1168 Elm_Access_Action_Info *a;
1170 a = (Elm_Access_Action_Info *) action_info;
1174 case ELM_ACCESS_ACTION_HIGHLIGHT:
1175 evas = evas_object_evas_get(obj);
1176 if (!evas) return EINA_FALSE;
1178 _elm_access_mouse_event_enabled_set(EINA_TRUE);
1180 evas_event_feed_mouse_in(evas, 0, NULL);
1181 evas_event_feed_mouse_move(evas, a->x1, a->y1, 0, NULL);
1183 _elm_access_mouse_event_enabled_set(EINA_FALSE);
1186 case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
1187 if (a->highlight_cycle)
1188 _elm_access_highlight_cycle(obj, ELM_FOCUS_NEXT);
1190 return _access_highlight_next_get(obj, ELM_FOCUS_NEXT);
1193 case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
1194 if (a->highlight_cycle)
1195 _elm_access_highlight_cycle(obj, ELM_FOCUS_PREVIOUS);
1197 return _access_highlight_next_get(obj, ELM_FOCUS_PREVIOUS);
1200 case ELM_ACCESS_ACTION_ACTIVATE:
1201 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_DEFAULT);
1204 case ELM_ACCESS_ACTION_VALUE_CHANGE:
1205 _elm_access_highlight_object_activate(obj, ELM_ACTIVATE_UP);
1208 case ELM_ACCESS_ACTION_SCROLL:
1211 case ELM_ACCESS_ACTION_BACK:
1222 elm_access_action_cb_set(Evas_Object *obj, const Elm_Access_Action_Type type, const Elm_Access_Action_Cb cb, const void *data)
1225 a = evas_object_data_get(obj, "_elm_access_action_info");
1229 a = calloc(1, sizeof(Action_Info));
1230 evas_object_data_set(obj, "_elm_access_action_info", a);
1234 a->fn[type].cb = cb;
1235 a->fn[type].user_data = (void *)data;
1239 elm_access_external_info_set(Evas_Object *obj, const char *text)
1241 _elm_access_text_set
1242 (_elm_access_object_get(obj), ELM_ACCESS_CONTEXT_INFO, text);
1246 elm_access_external_info_get(const Evas_Object *obj)
1248 Elm_Access_Info *ac;
1250 ac = _elm_access_object_get(obj);
1251 return _elm_access_text_get(ac, ELM_ACCESS_CONTEXT_INFO, obj);