From cdd48824bb6bea2b31f8c0f366837b31a342d380 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Sat, 30 Mar 2013 17:45:46 +0900 Subject: [PATCH] [access] call a callback function with information Change-Id: I54c6682ab29443aefb92513205a9b408fe55d528 --- src/lib/elm_access.c | 91 ++++++++++++++++++++++++++++++++++------------------ src/lib/elm_access.h | 31 ++++++++---------- src/lib/elm_win.c | 13 ++++---- 3 files changed, 80 insertions(+), 55 deletions(-) diff --git a/src/lib/elm_access.c b/src/lib/elm_access.c index 57c5495..b534677 100644 --- a/src/lib/elm_access.c +++ b/src/lib/elm_access.c @@ -28,6 +28,7 @@ static Eina_Bool mouse_event_enable = EINA_TRUE; static Eina_Bool read_mode = EINA_FALSE; static Evas_Coord_Point offset; static Evas_Object *s_parent; /* scrollable parent */ +static Elm_Access_Action_Type action_type = ELM_ACCESS_ACTION_FIRST; static Evas_Object * _elm_access_add(Evas_Object *parent); @@ -467,47 +468,51 @@ _elm_access_highlight_object_scroll(Evas_Object *obj, int type, int x, int y) switch (type) { case 0: - ho = _access_highlight_object_get(obj); - if (!ho) - { - s_parent = NULL; - return; - } - else - { - /* find scrollable parent */ - s_parent = elm_widget_parent_get(ho); - while (s_parent) - { - if(!!evas_object_smart_interface_get(s_parent, ELM_SCROLLABLE_IFACE_NAME)) - break; - s_parent = elm_widget_parent_get(s_parent); - } - - if (!s_parent) return; - //TODO: new interface to disable repeat event + ho = _access_highlight_object_get(obj); + if (!ho) + { + s_parent = NULL; + return; + } + else + { + /* find scrollable parent */ + s_parent = elm_widget_parent_get(ho); + while (s_parent) + { + if(!!evas_object_smart_interface_get(s_parent, ELM_SCROLLABLE_IFACE_NAME)) + break; + s_parent = elm_widget_parent_get(s_parent); + } + + if (!s_parent) return; + + ELM_SCROLLABLE_IFACE_GET(s_parent, s_iface); + s_iface->repeat_events_set(s_parent, EINA_FALSE); evas_object_geometry_get (ho, &ho_area.x, &ho_area.y, &ho_area.w, &ho_area.h); offset.x = x - (ho_area.x + (ho_area.w / 2)); offset.y = y - (ho_area.y + (ho_area.h / 2)); - } + } - evas_event_feed_mouse_in(evas, 0, NULL); - evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL); - evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + evas_event_feed_mouse_in(evas, 0, NULL); + evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL); + evas_event_feed_mouse_down(evas, 1, EVAS_BUTTON_NONE, 0, NULL); break; case 1: - if (!s_parent) return; - evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL); + if (!s_parent) return; + evas_event_feed_mouse_move(evas, x - offset.x, y - offset.y, 0, NULL); break; case 2: - if (!s_parent) return; - evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL); - //TODO: new interface to enable repeat event + if (!s_parent) return; + evas_event_feed_mouse_up(evas, 1, EVAS_BUTTON_NONE, 0, NULL); + + ELM_SCROLLABLE_IFACE_GET(s_parent, s_iface); + s_iface->repeat_events_set(s_parent, EINA_TRUE); break; default: @@ -575,8 +580,13 @@ _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir) if (!_access_action_callback_call(ho, type, NULL)) { + /* change highlight object */ + action_type = type; + _elm_access_highlight_set(target); ret = EINA_FALSE; + + action_type = ELM_ACCESS_ACTION_FIRST; } } @@ -584,6 +594,7 @@ _access_highlight_next_get(Evas_Object *obj, Elm_Focus_Direction dir) return ret; } + //-------------------------------------------------------------------------// EAPI void _elm_access_highlight_set(Evas_Object* obj) @@ -709,9 +720,13 @@ _elm_access_highlight_cycle(Evas_Object *obj, Elm_Focus_Direction dir) else type = ELM_ACCESS_ACTION_HIGHLIGHT_PREV; + action_type = type; + if (!_access_action_callback_call(ho, type, NULL)) elm_widget_focus_cycle(obj, dir); + action_type = ELM_ACCESS_ACTION_FIRST; + _elm_access_read_mode_set(EINA_FALSE); } @@ -795,6 +810,7 @@ _elm_access_object_hilight(Evas_Object *obj) { Evas_Object *o; Evas_Coord x, y, w, h; + Elm_Access_Action_Info *a; o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp"); if (!o) @@ -819,6 +835,7 @@ _elm_access_object_hilight(Evas_Object *obj) _access_obj_hilight_move_cb, NULL); evas_object_event_callback_del_full(ptarget, EVAS_CALLBACK_RESIZE, _access_obj_hilight_resize_cb, NULL); + _access_action_callback_call(ptarget, ELM_ACCESS_ACTION_UNHIGHLIGHT, NULL); } } evas_object_data_set(o, "_elm_access_target", obj); @@ -841,10 +858,13 @@ _elm_access_object_hilight(Evas_Object *obj) /* use callback, should an access object do below every time when * a window gets a client message ECORE_X_ATOM_E_ILLMUE_ACTION_READ? */ - if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, NULL)) + a = calloc(1, sizeof(Elm_Access_Action_Info)); + a->action_type = action_type; + if (!_access_action_callback_call(obj, ELM_ACCESS_ACTION_HIGHLIGHT, a)) evas_object_show(o); else evas_object_hide(o); + free(a); } EAPI void @@ -867,6 +887,7 @@ _elm_access_object_unhilight(Evas_Object *obj) _access_obj_hilight_resize_cb, NULL); evas_object_del(o); elm_widget_parent_highlight_set(ptarget, EINA_FALSE); + _access_action_callback_call(ptarget, ELM_ACCESS_ACTION_UNHIGHLIGHT, NULL); } } @@ -1231,12 +1252,14 @@ EAPI Eina_Bool elm_access_action(Evas_Object *obj, const Elm_Access_Action_Type type, void *action_info) { Evas *evas; + Evas_Object *ho; Elm_Access_Action_Info *a; a = (Elm_Access_Action_Info *) action_info; switch (type) { + case ELM_ACCESS_ACTION_READ: case ELM_ACCESS_ACTION_HIGHLIGHT: evas = evas_object_evas_get(obj); if (!evas) return EINA_FALSE; @@ -1244,9 +1267,15 @@ elm_access_action(Evas_Object *obj, const Elm_Access_Action_Type type, void *act _elm_access_mouse_event_enabled_set(EINA_TRUE); evas_event_feed_mouse_in(evas, 0, NULL); - evas_event_feed_mouse_move(evas, a->x1, a->y1, 0, NULL); - + evas_event_feed_mouse_move(evas, a->x, a->y, 0, NULL); _elm_access_mouse_event_enabled_set(EINA_FALSE); + + ho = _access_highlight_object_get(obj); + if (ho) + _access_action_callback_call(ho, ELM_ACCESS_ACTION_READ, a); + break; + + case ELM_ACCESS_ACTION_UNHIGHLIGHT: break; case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT: diff --git a/src/lib/elm_access.h b/src/lib/elm_access.h index dffae82..3be938c 100644 --- a/src/lib/elm_access.h +++ b/src/lib/elm_access.h @@ -27,22 +27,6 @@ typedef enum _Elm_Access_Info_Type Elm_Access_Info_Type; typedef char *(*Elm_Access_Info_Cb)(void *data, Evas_Object *obj); typedef void (*Elm_Access_Activate_Cb)(void *data, Evas_Object *part_obj, Elm_Object_Item *item); -struct _Elm_Access_Action_Info -{ - Evas_Coord x1; - Evas_Coord y1; - Evas_Coord x2; - Evas_Coord y2; - - unsigned int tx; - unsigned int ty; - - - Eina_Bool highlight_cycle : 1; -}; - -typedef struct _Elm_Access_Action_Info Elm_Access_Action_Info; - /** * @typedef Elm_Access_Action_Cb * User callback to make access object do specific action @@ -61,7 +45,8 @@ enum _Elm_Access_Action_Type { ELM_ACCESS_ACTION_FIRST = -1, - ELM_ACCESS_ACTION_HIGHLIGHT, /* highlight a object */ + ELM_ACCESS_ACTION_HIGHLIGHT, /* highlight an object */ + ELM_ACCESS_ACTION_UNHIGHLIGHT, /* unhighlight an object */ ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, /* set highlight to next object */ ELM_ACCESS_ACTION_HIGHLIGHT_PREV, /* set highlight to previous object */ ELM_ACCESS_ACTION_ACTIVATE, /* activate a highlight object */ @@ -70,6 +55,7 @@ enum _Elm_Access_Action_Type * is scrollable */ ELM_ACCESS_ACTION_BACK, /* go back to a previous view ex: pop naviframe item */ + ELM_ACCESS_ACTION_READ, /* highlight an object */ ELM_ACCESS_ACTION_LAST }; @@ -79,6 +65,17 @@ enum _Elm_Access_Action_Type */ typedef enum _Elm_Access_Action_Type Elm_Access_Action_Type; +struct _Elm_Access_Action_Info +{ + Evas_Coord x; + Evas_Coord y; + + Elm_Access_Action_Type action_type; + Eina_Bool highlight_cycle : 1; +}; + +typedef struct _Elm_Access_Action_Info Elm_Access_Action_Info; + /** * @brief Register evas object as an accessible object. * @since 1.8 diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c index e6032f3..6a062f5 100755 --- a/src/lib/elm_win.c +++ b/src/lib/elm_win.c @@ -1960,6 +1960,7 @@ _elm_win_client_message(void *data, int type __UNUSED__, void *event) { + Elm_Access_Action_Info *a; Ecore_X_Atom atom_scroll; Elm_Win_Smart_Data *sd = data; Ecore_X_Event_Client_Message *e = event; @@ -2024,13 +2025,11 @@ _elm_win_client_message(void *data, evas = evas_object_evas_get(ELM_WIDGET_DATA(sd)->obj); if (!evas) return ECORE_CALLBACK_PASS_ON; - _elm_access_mouse_event_enabled_set(EINA_TRUE); - - evas_event_feed_mouse_in(evas, 0, NULL); - evas_event_feed_mouse_move - (evas, e->data.l[2], e->data.l[3], 0, NULL); - - _elm_access_mouse_event_enabled_set(EINA_FALSE); + a = calloc(1, sizeof(Elm_Access_Action_Info)); + a->x = e->data.l[2]; + a->y = e->data.l[3]; + elm_access_action(ELM_WIDGET_DATA(sd)->obj, ELM_ACCESS_ACTION_HIGHLIGHT, a); + free(a); } else if ((unsigned int)e->data.l[1] == ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ_NEXT) -- 2.7.4