[access] call a callback function with information
authorShinwoo Kim <cinoo.kim@samsung.com>
Sat, 30 Mar 2013 08:45:46 +0000 (17:45 +0900)
committerSungho Kwak <sungho1.kwak@samsung.com>
Tue, 2 Apr 2013 09:46:15 +0000 (18:46 +0900)
Change-Id: I54c6682ab29443aefb92513205a9b408fe55d528

src/lib/elm_access.c
src/lib/elm_access.h
src/lib/elm_win.c

index 57c5495..b534677 100644 (file)
@@ -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:
index dffae82..3be938c 100644 (file)
@@ -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
index e6032f3..6a062f5 100755 (executable)
@@ -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)