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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel