On 7/14/07, Gustavo Sverzut Barbieri <[EMAIL PROTECTED]> wrote:
On 7/14/07, Lars Munch <[EMAIL PROTECTED]> wrote: > Hi Gustavo > > On Fri, Jul 13, 2007 at 07:53:58PM -0300, Gustavo Sverzut Barbieri > wrote: > > Ok, reading evas docs it's really the expected behavior, at least it's > > documented: > > > > * EVAS_CALLBACK_MOUSE_OUT: event_info = pointer to > > Evas_Event_Mouse_Out * * ... Note that no out events will be * > > reported if the mouse pointer is implicitly grabbed to an object (the > > * mouse buttons are down at all and any were pressed on that object). > > An * out event will be reported as soon as the mouse is no longer > > grabbed (no * mouse buttons are depressed). Out events will be > > reported once all buttons * are released, if the mouse has left the > > object. > > > > > > So, how to solve it without brake every existent thing that depends on > > this? > > As you can see from this post I had a similar problem some months ago: > > http://article.gmane.org/gmane.comp.window-managers.enlightenment.devel/12444/match= > > I was also creating a virtual keyboard for a touchscreen and it was also > highly inspirred by the iPhone keyboard. > > I think the current behaviour are good for some parts like sliders, but > for other pars like push buttons I would like to be able to get an out > event as soon at the mouse leaves the part (clicked or not). Maybe we > could add an ungrab or regrab function?yes, maybe mouse_grab=0|1 and in evas test for this flag being set. BUT, i already tried a quick hack to avoid mouse_grabbed lines and it didn't work, maybe it's not that easy or I did some mistake, again a _quick_ hack :-P
Ok, it turned out to be easy to extend this with mouse_grab idea, I'd like some review on these patches, but I've tested them together with an etk application (edje_viewer) and it seems to work fine. Patches are attached as TXT so gmail recognizes them as text/plain and avoid them being stripped by e-devel mail list. Notice that edje property is no_mouse_grab, because then we can keep compatibility with existent .edj files. I don't like evas_object_mouse_grab_set() very much, it looks like mouse will be immediately grab, which is not the case. But I don't have any better word for that. -- Gustavo Sverzut Barbieri -------------------------------------- Jabber: [EMAIL PROTECTED] MSN: [EMAIL PROTECTED] ICQ#: 17249123 Skype: gsbarbieri Mobile: +55 (81) 9927 0010
? configure.addopts ? configure.addopts-i686 Index: src/lib/Evas.h =================================================================== RCS file: /var/cvs/e/e17/libs/evas/src/lib/Evas.h,v retrieving revision 1.100 diff -u -p -r1.100 Evas.h --- src/lib/Evas.h 10 Jul 2007 00:13:25 -0000 1.100 +++ src/lib/Evas.h 17 Jul 2007 21:08:04 -0000 @@ -766,6 +766,9 @@ extern "C" { EAPI Evas_Bool evas_object_repeat_events_get (Evas_Object *obj); EAPI void evas_object_propagate_events_set (Evas_Object *obj, Evas_Bool prop); EAPI Evas_Bool evas_object_propagate_events_get (Evas_Object *obj); + EAPI void evas_object_mouse_grab_set (Evas_Object *obj, Evas_Bool no_mouse_grab); + EAPI Evas_Bool evas_object_mouse_grab_get (Evas_Object *obj); + EAPI void evas_object_event_callback_add (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info), const void *data); EAPI void *evas_object_event_callback_del (Evas_Object *obj, Evas_Callback_Type type, void (*func) (void *data, Evas *e, Evas_Object *obj, void *event_info)); Index: src/lib/canvas/evas_callbacks.c =================================================================== RCS file: /var/cvs/e/e17/libs/evas/src/lib/canvas/evas_callbacks.c,v retrieving revision 1.31 diff -u -p -r1.31 evas_callbacks.c --- src/lib/canvas/evas_callbacks.c 30 Apr 2007 04:22:42 -0000 1.31 +++ src/lib/canvas/evas_callbacks.c 17 Jul 2007 21:08:04 -0000 @@ -218,12 +218,13 @@ evas_object_event_callback_call(Evas_Obj * EVAS_CALLBACK_MOUSE_DOWN: event_info = pointer to Evas_Event_Mouse_Down * * This event is triggered by a mouse button being depressed while over an - * object. This causes this object to passively grab the mouse until all mouse - * buttons have been released. That means if this mouse button is the first to - * be pressed, all future mouse events will be reported to only this object - * until no buttons are down. That includes mouse move events, in and out - * events, and further button presses. When all buttons are released, event - * propagation occurs as normal. + * object. If mouse_grab is true (default) this causes this object to + * passively grab the mouse until all mouse buttons have been released. + * That means if this mouse button is the first to be pressed, all future + * mouse events will be reported to only this object until no buttons are + * down. That includes mouse move events, in and out events, and further + * button presses. When all buttons are released, event propagation occurs + * as normal. * * EVAS_CALLBACK_MOUSE_UP: event_info = pointer to Evas_Event_Mouse_Up * Index: src/lib/canvas/evas_events.c =================================================================== RCS file: /var/cvs/e/e17/libs/evas/src/lib/canvas/evas_events.c,v retrieving revision 1.51 diff -u -p -r1.51 evas_events.c --- src/lib/canvas/evas_events.c 30 Apr 2007 04:22:42 -0000 1.51 +++ src/lib/canvas/evas_events.c 17 Jul 2007 21:08:04 -0000 @@ -243,8 +243,11 @@ evas_event_feed_mouse_down(Evas *e, int Evas_Event_Mouse_Down ev; obj = l->data; - obj->mouse_grabbed++; - e->pointer.mouse_grabbed++; + if (!obj->no_mouse_grab) + { + obj->mouse_grabbed++; + e->pointer.mouse_grabbed++; + } ev.button = b; ev.output.x = e->pointer.x; @@ -297,10 +300,12 @@ evas_event_feed_mouse_up(Evas *e, int b, Evas_Event_Mouse_Up ev; obj = l->data; -// if (obj->mouse_grabbed > 0) - obj->mouse_grabbed--; -// if (e->pointer.mouse_grabbed > 0) - e->pointer.mouse_grabbed--; + if ((!obj->no_mouse_grab) && (obj->mouse_in) && + (obj->mouse_grabbed > 0)) + { + obj->mouse_grabbed--; + e->pointer.mouse_grabbed--; + } ev.button = b; ev.output.x = e->pointer.x; ev.output.y = e->pointer.y; @@ -397,6 +402,11 @@ evas_event_feed_mouse_up(Evas *e, int b, if (e->pointer.inside) evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data); } + + if (e->pointer.mouse_grabbed < 0) + fprintf(stderr, "BUG? e->pointer.mouse_grabbed (=%d) < 0!\n", + e->pointer.mouse_grabbed); + if ((e->pointer.button == 0) && (e->pointer.mouse_grabbed)) { e->pointer.mouse_grabbed = 0; @@ -1102,3 +1112,43 @@ evas_object_propagate_events_get(Evas_Ob MAGIC_CHECK_END(); return !(obj->no_propagate); } + +/** + * Set whether object will grab mouse (on mouse down). + * + * @param obj + * @param mouse_grab if objects should grab mouse events or not. + * + * This function has direct effect on event callbacks related to mouse. + * + * If @p mouse_grab is true, then when mouse is down at this object, + * events will be restricted to it as source, mouse moves, for example, + * will be emitted even if outside this object area. + * + * If @p prop is false, then events will be emitted just when inside + * this object area. + * + * The default value is true. + */ +EAPI void +evas_object_mouse_grab_set(Evas_Object *obj, Evas_Bool mouse_grab) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + obj->no_mouse_grab = !mouse_grab; +} + +/** + * Determine whether an object is set to grab mouse. + * @param obj + * @return if mouse will be grabbed or not. + */ +EAPI Evas_Bool +evas_object_mouse_grab_get(Evas_Object *obj) +{ + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + return !(obj->no_mouse_grab); +} Index: src/lib/include/evas_private.h =================================================================== RCS file: /var/cvs/e/e17/libs/evas/src/lib/include/evas_private.h,v retrieving revision 1.85 diff -u -p -r1.85 evas_private.h --- src/lib/include/evas_private.h 28 Jun 2007 23:22:20 -0000 1.85 +++ src/lib/include/evas_private.h 17 Jul 2007 21:08:04 -0000 @@ -447,6 +447,7 @@ struct _Evas_Object unsigned short focused : 1; unsigned short in_layer : 1; unsigned short no_propagate : 1; + unsigned short no_mouse_grab : 1; unsigned char delete_me; };
Index: src/bin/edje_cc_handlers.c =================================================================== RCS file: /var/cvs/e/e17/libs/edje/src/bin/edje_cc_handlers.c,v retrieving revision 1.75 diff -u -p -r1.75 edje_cc_handlers.c --- src/bin/edje_cc_handlers.c 7 Jul 2007 11:07:42 -0000 1.75 +++ src/bin/edje_cc_handlers.c 17 Jul 2007 21:09:20 -0000 @@ -43,6 +43,7 @@ static void st_collections_group_parts_p static void st_collections_group_parts_part_effect(void); static void st_collections_group_parts_part_mouse_events(void); static void st_collections_group_parts_part_repeat_events(void); +static void st_collections_group_parts_part_no_mouse_grab(void); static void st_collections_group_parts_part_use_alternate_font_metrics(void); static void st_collections_group_parts_part_clip_to_id(void); static void st_collections_group_parts_part_source(void); @@ -179,6 +180,7 @@ New_Statement_Handler statement_handlers {"collections.group.parts.part.effect", st_collections_group_parts_part_effect}, {"collections.group.parts.part.mouse_events", st_collections_group_parts_part_mouse_events}, {"collections.group.parts.part.repeat_events", st_collections_group_parts_part_repeat_events}, + {"collections.group.parts.part.no_mouse_grab", st_collections_group_parts_part_no_mouse_grab}, {"collections.group.parts.part.use_alternate_font_metrics", st_collections_group_parts_part_use_alternate_font_metrics}, {"collections.group.parts.part.clip_to", st_collections_group_parts_part_clip_to_id}, {"collections.group.parts.part.source", st_collections_group_parts_part_source}, @@ -899,6 +901,7 @@ ob_collections_group_parts_part(void) ep->type = EDJE_PART_TYPE_IMAGE; ep->mouse_events = 1; ep->repeat_events = 0; + ep->no_mouse_grab = 0; ep->use_alternate_font_metrics = 0; ep->clip_to_id = -1; ep->dragable.confine_id = -1; @@ -984,6 +987,19 @@ st_collections_group_parts_part_repeat_e } static void +st_collections_group_parts_part_no_mouse_grab(void) +{ + Edje_Part_Collection *pc; + Edje_Part *ep; + + check_arg_count(1); + + pc = evas_list_data(evas_list_last(edje_collections)); + ep = evas_list_data(evas_list_last(pc->parts)); + ep->no_mouse_grab = parse_bool(0); +} + +static void st_collections_group_parts_part_use_alternate_font_metrics(void) { Edje_Part_Collection *pc; Index: src/lib/edje_data.c =================================================================== RCS file: /var/cvs/e/e17/libs/edje/src/lib/edje_data.c,v retrieving revision 1.37 diff -u -p -r1.37 edje_data.c --- src/lib/edje_data.c 6 Jul 2007 22:36:40 -0000 1.37 +++ src/lib/edje_data.c 17 Jul 2007 21:09:20 -0000 @@ -345,6 +345,7 @@ _edje_edd_setup(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "no_mouse_grab", no_mouse_grab, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "use_alternate_font_metrics", use_alternate_font_metrics, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_part, Edje_Part, "default_desc", default_desc, _edje_edd_edje_part_description); Index: src/lib/edje_load.c =================================================================== RCS file: /var/cvs/e/e17/libs/edje/src/lib/edje_load.c,v retrieving revision 1.106 diff -u -p -r1.106 edje_load.c --- src/lib/edje_load.c 12 Jul 2007 21:30:36 -0000 1.106 +++ src/lib/edje_load.c 17 Jul 2007 21:09:20 -0000 @@ -303,6 +303,7 @@ _edje_object_file_set_internal(Evas_Obje rp->object = evas_object_rectangle_add(ed->evas); evas_object_color_set(rp->object, 0, 0, 0, 0); evas_object_pass_events_set(rp->object, 1); + evas_object_mouse_grab_set(rp->object, 0); } else if (ep->type == EDJE_PART_TYPE_TEXTBLOCK) rp->object = evas_object_textblock_add(ed->evas); @@ -323,9 +324,14 @@ _edje_object_file_set_internal(Evas_Obje _edje_callbacks_add(rp->object, ed, rp); if (ep->repeat_events) evas_object_repeat_events_set(rp->object, 1); + if (ep->no_mouse_grab) + evas_object_mouse_grab_set(rp->object, 0); } else - evas_object_pass_events_set(rp->object, 1); + { + evas_object_pass_events_set(rp->object, 1); + evas_object_mouse_grab_set(rp->object, 0); + } } if (rp->part->clip_to_id < 0) evas_object_clip_set(rp->object, ed->clipper); @@ -366,6 +372,7 @@ _edje_object_file_set_internal(Evas_Obje if (rp->clip_to) { evas_object_pass_events_set(rp->clip_to->object, 1); + evas_object_mouse_grab_set(rp->clip_to->object, 0); evas_object_clip_set(rp->object, rp->clip_to->object); } } Index: src/lib/edje_private.h =================================================================== RCS file: /var/cvs/e/e17/libs/edje/src/lib/edje_private.h,v retrieving revision 1.128 diff -u -p -r1.128 edje_private.h --- src/lib/edje_private.h 6 Jul 2007 23:33:42 -0000 1.128 +++ src/lib/edje_private.h 17 Jul 2007 21:09:20 -0000 @@ -427,6 +427,7 @@ struct _Edje_Part unsigned char effect; /* 0 = plain... */ unsigned char mouse_events; /* it will affect/respond to mouse events */ unsigned char repeat_events; /* it will repeat events to objects below */ + unsigned char no_mouse_grab; /* it will not grab mouse on 'down' */ unsigned char use_alternate_font_metrics; }; Index: src/lib/edje_util.c =================================================================== RCS file: /var/cvs/e/e17/libs/edje/src/lib/edje_util.c,v retrieving revision 1.97 diff -u -p -r1.97 edje_util.c --- src/lib/edje_util.c 16 Jul 2007 07:31:06 -0000 1.97 +++ src/lib/edje_util.c 17 Jul 2007 21:09:21 -0000 @@ -2117,6 +2117,8 @@ _edje_real_part_swallow(Edje_Real_Part * _edje_callbacks_add(obj_swallow, rp->edje, rp); if (rp->part->repeat_events) evas_object_repeat_events_set(obj_swallow, 1); + if (rp->part->no_mouse_grab) + evas_object_mouse_grab_set(obj_swallow, 0); } else evas_object_pass_events_set(obj_swallow, 1);
------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/
_______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel