On 3/28/07, Gustavo Sverzut Barbieri <[EMAIL PROTECTED]> wrote:
Current edje just ignore events connected to a swallowed part from
inside edje and also doesn't set evas_object_pass_events_set() if
"mouse_events: 0".
I think it's not the correct behavior since you cannot do edje
programs to act on swallowed part and also swallowed part will catch
events due missing evas_object_pass_events_set() and not pass it, even
if edje says it should not act on events. As I think edje as a theme
engine and I think this behavior should be set by theme, I've written
this patch.
This patch also does a minor refactory to avoid code duplication:
callbacks should be added on edje_object_file_set() and
edje_object_part_swallow(), removed on edje_object_part_unswallow()
(and _swallow(), if there was an already swallowed object) and
_edje_file_del().
PS: There are two patches attached edje_patch_swallow_events.patch is
against cvs HEAD, edje_patch_swallow_events.relative.patch is relative
to my previous patch on edje_extern_object_*()
(edje_patch_extern.patch)
edje_callbacks.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
edje_load.c | 47 ++++-------------------------------------------
edje_private.h | 2 ++
edje_util.c | 17 +++++++++++++++++
4 files changed, 77 insertions(+), 43 deletions(-)
2nd try, now as .diff and text/plain, sorry.
--
Gustavo Sverzut Barbieri
--------------------------------------
Jabber: [EMAIL PROTECTED]
MSN: [EMAIL PROTECTED]
ICQ#: 17249123
Skype: gsbarbieri
Mobile: +55 (81) 9927 0010
diff -ur edje.orig/src/lib/edje_callbacks.c
edje.patch_swallow_events/src/lib/edje_callbacks.c
--- edje.orig/src/lib/edje_callbacks.c 2006-12-18 05:50:25.000000000 -0300
+++ edje.patch_swallow_events/src/lib/edje_callbacks.c 2007-03-28
18:58:40.000000000 -0300
@@ -364,3 +364,57 @@
free(pp);
return 0;
}
+
+void
+_edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
+{
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_IN,
+ _edje_mouse_in_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_OUT,
+ _edje_mouse_out_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_DOWN,
+ _edje_mouse_down_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_UP,
+ _edje_mouse_up_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_MOVE,
+ _edje_mouse_move_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_WHEEL,
+ _edje_mouse_wheel_cb,
+ ed);
+ evas_object_data_set(obj, "real_part", rp);
+}
+
+void
+_edje_callbacks_del(Evas_Object *obj)
+{
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_IN,
+ _edje_mouse_in_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_OUT,
+ _edje_mouse_out_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_DOWN,
+ _edje_mouse_down_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_UP,
+ _edje_mouse_up_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_MOVE,
+ _edje_mouse_move_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_WHEEL,
+ _edje_mouse_wheel_cb);
+ evas_object_data_del(obj, "real_part");
+}
diff -ur edje.orig/src/lib/edje_load.c
edje.patch_swallow_events/src/lib/edje_load.c
--- edje.orig/src/lib/edje_load.c 2007-03-16 18:37:57.000000000 -0300
+++ edje.patch_swallow_events/src/lib/edje_load.c 2007-03-28
18:58:40.000000000 -0300
@@ -131,31 +131,7 @@
{
if (ep->mouse_events)
{
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_cb,
- ed);
- evas_object_data_set(rp->object, "real_part", rp);
+ _edje_callbacks_add(rp->object, ed, rp);
if (ep->repeat_events)
evas_object_repeat_events_set(rp->object, 1);
}
@@ -538,25 +514,8 @@
ed->parts = evas_list_remove(ed->parts, rp);
if (rp->object)
{
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_cb);
_edje_text_real_part_on_del(ed, rp);
+ _edje_callbacks_del(rp->object);
evas_object_del(rp->object);
}
if (rp->swallowed_object)
@@ -566,6 +525,8 @@
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
rp->swallowed_object = NULL;
/* I think it would be better swallowed objects dont get deleted */
/* evas_object_del(rp->swallowed_object);*/
diff -ur edje.orig/src/lib/edje_private.h
edje.patch_swallow_events/src/lib/edje_private.h
--- edje.orig/src/lib/edje_private.h 2007-03-06 09:03:34.000000000 -0300
+++ edje.patch_swallow_events/src/lib/edje_private.h 2007-03-28
18:58:40.000000000 -0300
@@ -911,6 +911,8 @@
void _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void
*event_info);
int _edje_timer_cb(void *data);
int _edje_pending_timer_cb(void *data);
+void _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp);
+void _edje_callbacks_del(Evas_Object *obj);
void _edje_edd_setup(void);
void _edje_edd_free(void);
diff -ur edje.orig/src/lib/edje_util.c
edje.patch_swallow_events/src/lib/edje_util.c
--- edje.orig/src/lib/edje_util.c 2007-03-01 19:39:01.000000000 -0300
+++ edje.patch_swallow_events/src/lib/edje_util.c 2007-03-28
19:02:52.000000000 -0300
@@ -784,6 +784,8 @@
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
rp->swallowed_object = NULL;
}
if (!obj_swallow) return;
@@ -843,6 +845,17 @@
rp->swallow_params.aspect.w = aw;
rp->swallow_params.aspect.h = ah;
}
+
+ if (rp->part->mouse_events)
+ {
+ _edje_callbacks_add(obj_swallow, ed, rp);
+ if (rp->part->repeat_events)
+ evas_object_repeat_events_set(obj_swallow, 1);
+ }
+ else
+ evas_object_pass_events_set(obj_swallow, 1);
+
+
ed->dirty = 1;
_edje_recalc(ed);
}
@@ -957,6 +970,10 @@
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
+
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
+
rp->swallowed_object = NULL;
rp->swallow_params.min.w = 0;
rp->swallow_params.min.h = 0;
diff -ur edje.patch_extern/src/lib/edje_callbacks.c
edje.patch_swallow_events/src/lib/edje_callbacks.c
--- edje.patch_extern/src/lib/edje_callbacks.c 2006-12-18 05:50:25.000000000
-0300
+++ edje.patch_swallow_events/src/lib/edje_callbacks.c 2007-03-28
18:31:59.000000000 -0300
@@ -364,3 +364,57 @@
free(pp);
return 0;
}
+
+void
+_edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp)
+{
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_IN,
+ _edje_mouse_in_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_OUT,
+ _edje_mouse_out_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_DOWN,
+ _edje_mouse_down_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_UP,
+ _edje_mouse_up_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_MOVE,
+ _edje_mouse_move_cb,
+ ed);
+ evas_object_event_callback_add(obj,
+ EVAS_CALLBACK_MOUSE_WHEEL,
+ _edje_mouse_wheel_cb,
+ ed);
+ evas_object_data_set(obj, "real_part", rp);
+}
+
+void
+_edje_callbacks_del(Evas_Object *obj)
+{
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_IN,
+ _edje_mouse_in_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_OUT,
+ _edje_mouse_out_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_DOWN,
+ _edje_mouse_down_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_UP,
+ _edje_mouse_up_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_MOVE,
+ _edje_mouse_move_cb);
+ evas_object_event_callback_del(obj,
+ EVAS_CALLBACK_MOUSE_WHEEL,
+ _edje_mouse_wheel_cb);
+ evas_object_data_del(obj, "real_part");
+}
diff -ur edje.patch_extern/src/lib/edje_load.c
edje.patch_swallow_events/src/lib/edje_load.c
--- edje.patch_extern/src/lib/edje_load.c 2007-03-16 18:37:57.000000000
-0300
+++ edje.patch_swallow_events/src/lib/edje_load.c 2007-03-28
18:38:35.000000000 -0300
@@ -131,31 +131,7 @@
{
if (ep->mouse_events)
{
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_cb,
- ed);
- evas_object_event_callback_add(rp->object,
-
EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_cb,
- ed);
- evas_object_data_set(rp->object, "real_part", rp);
+ _edje_callbacks_add(rp->object, ed, rp);
if (ep->repeat_events)
evas_object_repeat_events_set(rp->object, 1);
}
@@ -538,25 +514,8 @@
ed->parts = evas_list_remove(ed->parts, rp);
if (rp->object)
{
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_IN,
- _edje_mouse_in_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_OUT,
- _edje_mouse_out_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_DOWN,
- _edje_mouse_down_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_UP,
- _edje_mouse_up_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_MOVE,
- _edje_mouse_move_cb);
- evas_object_event_callback_del(rp->object,
- EVAS_CALLBACK_MOUSE_WHEEL,
- _edje_mouse_wheel_cb);
_edje_text_real_part_on_del(ed, rp);
+ _edje_callbacks_del(rp->object);
evas_object_del(rp->object);
}
if (rp->swallowed_object)
@@ -566,6 +525,8 @@
EVAS_CALLBACK_FREE,
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
rp->swallowed_object = NULL;
/* I think it would be better swallowed objects dont get deleted */
/* evas_object_del(rp->swallowed_object);*/
diff -ur edje.patch_extern/src/lib/edje_private.h
edje.patch_swallow_events/src/lib/edje_private.h
--- edje.patch_extern/src/lib/edje_private.h 2007-03-06 09:03:34.000000000
-0300
+++ edje.patch_swallow_events/src/lib/edje_private.h 2007-03-28
18:31:59.000000000 -0300
@@ -911,6 +911,8 @@
void _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void
*event_info);
int _edje_timer_cb(void *data);
int _edje_pending_timer_cb(void *data);
+void _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp);
+void _edje_callbacks_del(Evas_Object *obj);
void _edje_edd_setup(void);
void _edje_edd_free(void);
diff -ur edje.patch_extern/src/lib/edje_util.c
edje.patch_swallow_events/src/lib/edje_util.c
--- edje.patch_extern/src/lib/edje_util.c 2007-03-28 18:31:42.000000000
-0300
+++ edje.patch_swallow_events/src/lib/edje_util.c 2007-03-28
18:31:59.000000000 -0300
@@ -785,6 +785,8 @@
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
rp->swallowed_object = NULL;
}
if (!obj_swallow) return;
@@ -845,6 +847,17 @@
rp->swallow_params.aspect.h = ah;
evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part",
rp);
}
+
+ if (rp->part->mouse_events)
+ {
+ _edje_callbacks_add(obj_swallow, ed, rp);
+ if (rp->part->repeat_events)
+ evas_object_repeat_events_set(obj_swallow, 1);
+ }
+ else
+ evas_object_pass_events_set(obj_swallow, 1);
+
+
ed->dirty = 1;
_edje_recalc(ed);
}
@@ -1004,6 +1017,10 @@
_edje_object_part_swallow_free_cb);
evas_object_clip_unset(rp->swallowed_object);
evas_object_data_del(rp->swallowed_object, "\377
edje.swallowing_part");
+
+ if (rp->part->mouse_events)
+ _edje_callbacks_del(rp->swallowed_object);
+
rp->swallowed_object = NULL;
rp->swallow_params.min.w = 0;
rp->swallow_params.min.h = 0;
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel