[genlist] apply r71140 with local enhancement
[framework/uifw/elementary.git] / src / lib / elm_access.c
index 2e48d16..4ea5582 100644 (file)
@@ -12,7 +12,6 @@ struct _Mod_Api
 };
 
 static int initted = 0;
-static Elm_Module *mod = NULL;
 static Mod_Api *mapi = NULL;
 
 static void
@@ -22,7 +21,6 @@ _access_init(void)
    initted++;
    if (initted > 1) return;
    if (!(m = _elm_module_find_as("access/api"))) return;
-   mod = m;
    m->api = malloc(sizeof(Mod_Api));
    if (!m->api) return;
    m->init_func(m);
@@ -133,6 +131,31 @@ static void
 _access_read_done(void *data __UNUSED__)
 {
    printf("read done\n");
+   // FIXME: produce event here
+}
+
+static void
+_access_2nd_click_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Ecore_Timer *t;
+
+   evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
+                                       _access_2nd_click_del_cb, NULL);
+   t = evas_object_data_get(obj, "_elm_2nd_timeout");
+   if (t)
+     {
+        ecore_timer_del(t);
+        evas_object_data_del(obj, "_elm_2nd_timeout");
+     }
+}
+
+static Eina_Bool
+_access_2nd_click_timeout_cb(void *data)
+{
+   evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL,
+                                       _access_2nd_click_del_cb, NULL);
+   evas_object_data_del(data, "_elm_2nd_timeout");
+   return EINA_FALSE;
 }
 
 static void
@@ -152,7 +175,7 @@ _access_obj_hilight_move_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Obje
 {
    Evas_Coord x, y;
    Evas_Object *o;
-   
+
    o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
    if (!o) return;
    evas_object_geometry_get(obj, &x, &y, NULL, NULL);
@@ -164,7 +187,7 @@ _access_obj_hilight_resize_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Ob
 {
    Evas_Coord w, h;
    Evas_Object *o;
-   
+
    o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
    if (!o) return;
    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
@@ -214,7 +237,7 @@ _elm_access_callback_set(Elm_Access_Info *ac, int type, Elm_Access_Content_Cb fu
 }
 
 EAPI char *
-_elm_access_text_get(Elm_Access_Info *ac, int type, Evas_Object *obj, Elm_Widget_Item *item)
+_elm_access_text_get(const Elm_Access_Info *ac, int type, Evas_Object *obj, Elm_Widget_Item *item)
 {
    Elm_Access_Item *ai;
    Eina_List *l;
@@ -281,17 +304,23 @@ _elm_access_say(const char *txt)
 }
 
 EAPI Elm_Access_Info *
-_elm_access_object_get(Evas_Object *obj)
+_elm_access_object_get(const Evas_Object *obj)
 {
    return evas_object_data_get(obj, "_elm_access");
 }
 
+EAPI Elm_Access_Info *
+_elm_access_item_get(const Elm_Widget_Item *it)
+{
+   return it->access;
+}
+
 EAPI void
 _elm_access_object_hilight(Evas_Object *obj)
 {
    Evas_Object *o;
    Evas_Coord x, y, w, h;
-   
+
    o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
    if (!o)
      {
@@ -336,7 +365,7 @@ EAPI void
 _elm_access_object_unhilight(Evas_Object *obj)
 {
    Evas_Object *o, *ptarget;
-   
+
    o = evas_object_name_find(evas_object_evas_get(obj), "_elm_access_disp");
    if (!o) return;
    ptarget = evas_object_data_get(o, "_elm_access_target");
@@ -391,28 +420,98 @@ _elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
    evas_object_data_set(obj, "_elm_access", ac);
 }
 
+static Eina_Bool
+_access_item_over_timeout_cb(void *data)
+{
+   Elm_Access_Info *ac = ((Elm_Widget_Item *)data)->access;
+   if (!ac) return EINA_FALSE;
+   if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
+     {
+        _elm_access_object_hilight(((Elm_Widget_Item *)data)->view);
+        _elm_access_read(ac, ELM_ACCESS_CANCEL, NULL, data);
+        _elm_access_read(ac, ELM_ACCESS_TYPE,   NULL, data);
+        _elm_access_read(ac, ELM_ACCESS_INFO,   NULL, data);
+        _elm_access_read(ac, ELM_ACCESS_STATE,  NULL, data);
+        _elm_access_read(ac, ELM_ACCESS_DONE,   NULL, data);
+     }
+   ac->delay_timer = NULL;
+   return EINA_FALSE;
+}
+
 static void
-_access_2nd_click_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
+_access_item_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info  __UNUSED__)
 {
-   Ecore_Timer *t;
+   Elm_Access_Info *ac = ((Elm_Widget_Item *)data)->access;
+   if (!ac) return;
 
-   evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL,
-                                       _access_2nd_click_del_cb, NULL);
-   t = evas_object_data_get(obj, "_elm_2nd_timeout");
-   if (t)
+   if (ac->delay_timer)
      {
-        ecore_timer_del(t);
-        evas_object_data_del(obj, "_elm_2nd_timeout");
+        ecore_timer_del(ac->delay_timer);
+        ac->delay_timer = NULL;
      }
+   if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF)
+      ac->delay_timer = ecore_timer_add(0.2, _access_item_over_timeout_cb, data);
 }
 
-static Eina_Bool
-_access_2nd_click_timeout_cb(void *data)
+static void
+_access_item_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
-   evas_object_event_callback_del_full(data, EVAS_CALLBACK_DEL,
-                                       _access_2nd_click_del_cb, NULL);
-   evas_object_data_del(data, "_elm_2nd_timeout");
-   return EINA_FALSE;
+   Elm_Access_Info *ac = ((Elm_Widget_Item *)data)->access;
+   if (!ac) return;
+
+   _elm_access_object_unhilight(((Elm_Widget_Item *)data)->view);
+   if (ac->delay_timer)
+     {
+        ecore_timer_del(ac->delay_timer);
+        ac->delay_timer = NULL;
+     }
+}
+
+static void _access_item_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__);
+
+EAPI void
+_elm_access_item_unregister(Elm_Widget_Item *item)
+{
+   Elm_Access_Info *ac;
+
+   ac = item->access;
+   if (ac)
+     {
+        evas_object_event_callback_del_full(ac->hoverobj,
+                                            EVAS_CALLBACK_MOUSE_IN,
+                                            _access_item_mouse_in_cb, item);
+        evas_object_event_callback_del_full(ac->hoverobj,
+                                            EVAS_CALLBACK_MOUSE_OUT,
+                                            _access_item_mouse_out_cb, item);
+        evas_object_event_callback_del_full(ac->hoverobj,
+                                            EVAS_CALLBACK_DEL,
+                                            _access_item_del_cb, item);
+        item->access = NULL;
+        _elm_access_clear(ac);
+        free(ac);
+     }
+}
+
+static void
+_access_item_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   _elm_access_item_unregister((Elm_Widget_Item *)data);
+}
+
+EAPI void
+_elm_access_item_register(Elm_Widget_Item *item, Evas_Object *hoverobj)
+{
+   Elm_Access_Info *ac;
+
+   evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
+                                  _access_item_mouse_in_cb, item);
+   evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
+                                  _access_item_mouse_out_cb, item);
+   evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_DEL,
+                                  _access_item_del_cb, item);
+   ac = calloc(1, sizeof(Elm_Access_Info));
+   ac->hoverobj = hoverobj;
+   item->access = ac;
 }
 
 EAPI Eina_Bool
@@ -435,9 +534,3 @@ _elm_access_2nd_click_timeout(Evas_Object *obj)
                                   _access_2nd_click_del_cb, NULL);
    return EINA_FALSE;
 }
-
-// XXX special version for items
-//EAPI void
-//_elm_access_item_hover_register(Elm_Widget_Item *item, Evas_Object *hoverobj)
-//{
-//}