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

Reply via email to