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

Reply via email to