kimcinoo pushed a commit to branch master.
commit e6090ed8ddabcffa38dcc235c8bc8403af198b2b
Author: Shinwoo Kim <[email protected]>
Date: Sat Sep 7 11:34:04 2013 +0900
[access] delete access object in job when its hover object is deleted
---
ChangeLog | 4 ++
src/lib/elm_access.c | 130 +++++++++++++++++++++++++++++++++++++--------------
2 files changed, 98 insertions(+), 36 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index ea24b35..1718c8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1589,3 +1589,7 @@
2013-09-04 Ryuan Choi (ryuan)
* elm_config : profile may be broken when clicked reset button in
profiles tab
+
+2013-09-07 Shinwoo Kim
+
+ * elm_access : delete access object in job when its hover object is
deleted
diff --git a/src/lib/elm_access.c b/src/lib/elm_access.c
index 684b9e3..164039c 100644
--- a/src/lib/elm_access.c
+++ b/src/lib/elm_access.c
@@ -292,7 +292,7 @@ _access_obj_over_timeout_cb(void *data)
}
static void
-_access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj
__UNUSED__, void *event_info __UNUSED__)
+_access_hover_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj
__UNUSED__, void *event_info __UNUSED__)
{
Elm_Access_Info *ac;
if (!mouse_event_enable) return;
@@ -307,7 +307,7 @@ _access_obj_mouse_in_cb(void *data, Evas *e __UNUSED__,
Evas_Object *obj __UNUSE
}
static void
-_access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj
__UNUSED__, void *event_info __UNUSED__)
+_access_hover_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj
__UNUSED__, void *event_info __UNUSED__)
{
Elm_Access_Info *ac;
if (!mouse_event_enable) return;
@@ -321,13 +321,6 @@ _access_obj_mouse_out_cb(void *data, Evas *e __UNUSED__,
Evas_Object *obj __UNUS
}
static void
-_access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void
*event_info __UNUSED__)
-{
- _elm_access_object_unregister(data, obj);
- _access_object_unregister(obj);
-}
-
-static void
_access_read_done(void *data __UNUSED__)
{
DBG("read done");
@@ -940,17 +933,7 @@ _access_object_unregister(Evas_Object *obj)
if (ao)
{
- evas_object_data_del(obj, "_part_access_obj");
-
- /* delete callbacks */
- evas_object_event_callback_del_full(obj, EVAS_CALLBACK_RESIZE,
- _content_resize, ao);
- evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
- _content_move, ao);
-
- /* unregister access object */
- _elm_access_object_unregister(ao, obj);
-
+ /* delete callbacks and unregister access object in
_access_obj_del_cb*/
evas_object_del(ao);
}
else
@@ -1019,17 +1002,86 @@ _elm_access_object_hilight_disable(Evas *e)
elm_widget_parent_highlight_set(ptarget, EINA_FALSE);
}
+static void
+_access_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void
*event_info __UNUSED__)
+{
+
+ Ecore_Job *ao_del_job = NULL;
+
+ evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _access_obj_del_cb);
+
+ if (data) /* hover object */
+ {
+ evas_object_event_callback_del_full(data, EVAS_CALLBACK_RESIZE,
+ _content_resize, obj);
+ evas_object_event_callback_del_full(data, EVAS_CALLBACK_MOVE,
+ _content_move, obj);
+
+ _elm_access_object_unregister(obj, data);
+ }
+
+ ao_del_job = evas_object_data_get(obj, "_access_obj_del_job");
+
+ if (ao_del_job)
+ {
+ ecore_job_del(ao_del_job);
+ evas_object_data_del(obj, "_access_obj_del_job");
+ }
+}
+
+static void
+_access_obj_del_job(void *data)
+{
+ if (!data) return;
+
+ evas_object_data_del(data, "_access_obj_del_job");
+
+ evas_object_event_callback_del(data, EVAS_CALLBACK_DEL, _access_obj_del_cb);
+ evas_object_del(data);
+}
+
+static void
+_access_hover_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void
*event_info __UNUSED__)
+{
+ Ecore_Job *ao_del_job = NULL;
+
+ /* data - access object - could be NULL */
+ if (!data) return;
+
+ evas_object_event_callback_del_full(obj, EVAS_CALLBACK_RESIZE,
+ _content_resize, data);
+ evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
+ _content_move, data);
+
+ _elm_access_object_unregister(data, obj);
+
+ /* delete access object in job */
+ ao_del_job = evas_object_data_get(data, "_access_obj_del_job");
+ if (ao_del_job)
+ {
+ ecore_job_del(ao_del_job);
+ evas_object_data_del(data, "_access_obj_del_job");
+ }
+
+ ao_del_job = ecore_job_add(_access_obj_del_job, data);
+ evas_object_data_set(data, "_access_obj_del_job", ao_del_job);
+}
+
EAPI void
_elm_access_object_register(Evas_Object *obj, Evas_Object *hoverobj)
{
Elm_Access_Info *ac;
evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_IN,
- _access_obj_mouse_in_cb, obj);
+ _access_hover_mouse_in_cb, obj);
evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
- _access_obj_mouse_out_cb, obj);
+ _access_hover_mouse_out_cb, obj);
evas_object_event_callback_add(hoverobj, EVAS_CALLBACK_DEL,
- _access_obj_del_cb, obj);
+ _access_hover_del_cb, obj);
+
+ evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+ _access_obj_del_cb, hoverobj);
+
ac = calloc(1, sizeof(Elm_Access_Info));
evas_object_data_set(obj, "_elm_access", ac);
@@ -1040,18 +1092,29 @@ EAPI void
_elm_access_object_unregister(Evas_Object *obj, Evas_Object *hoverobj)
{
Elm_Access_Info *ac;
+ Evas_Object *ao;
evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_IN,
- _access_obj_mouse_in_cb, obj);
+ _access_hover_mouse_in_cb, obj);
evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_MOUSE_OUT,
- _access_obj_mouse_out_cb, obj);
+ _access_hover_mouse_out_cb, obj);
evas_object_event_callback_del_full(hoverobj, EVAS_CALLBACK_DEL,
- _access_obj_del_cb, obj);
+ _access_hover_del_cb, obj);
+
+ /* _access_obj_del_cb and _access_hover_del_cb calls this function,
+ both do not need _part_access_obj data, so delete the data here. */
+ ao = evas_object_data_get(hoverobj, "_part_access_obj");
+ if (ao) evas_object_data_del(hoverobj, "_part_access_obj");
ac = evas_object_data_get(obj, "_elm_access");
evas_object_data_del(obj, "_elm_access");
if (ac)
{
+ /* widget could delete VIEW(it) only and register item again,
+ in this case _elm_access_widget_item_register could try to delete
+ access object again in _elm_access_widget_item_unregister */
+ if (ac->widget_item) ac->widget_item->access_obj = NULL;
+
_elm_access_clear(ac);
free(ac);
}
@@ -1103,22 +1166,17 @@ _elm_access_widget_item_register(Elm_Widget_Item *item)
EAPI void
_elm_access_widget_item_unregister(Elm_Widget_Item *item)
{
- Evas_Object *ho;
+ Evas_Object *ao;
ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
if (!item->access_obj) return;
- ho = item->view;
- evas_object_event_callback_del_full(ho, EVAS_CALLBACK_RESIZE,
- _content_resize, item->access_obj);
- evas_object_event_callback_del_full(ho, EVAS_CALLBACK_MOVE,
- _content_move, item->access_obj);
-
- _elm_access_object_unregister(item->access_obj, ho);
-
- evas_object_del(item->access_obj);
+ /* delete callbacks and unregister access object in _access_obj_del_cb*/
+ ao = item->access_obj;
item->access_obj = NULL;
+
+ evas_object_del(ao);
}
EAPI Eina_Bool
--
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk