and another commit in an attempt to fix mouse grabs + event callbacks
authorCarsten Haitzler <raster@rasterman.com>
Mon, 26 Sep 2011 02:45:06 +0000 (02:45 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Mon, 26 Sep 2011 02:45:06 +0000 (02:45 +0000)
to be consistent

SVN revision: 63607

legacy/evas/src/lib/canvas/evas_events.c
legacy/evas/src/lib/canvas/evas_object_main.c

index 515aa4e..e7fb6b0 100644 (file)
@@ -248,16 +248,19 @@ evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int
    copy = evas_event_list_copy(e->pointer.object.in);
    EINA_LIST_FOREACH(copy, l, obj)
      {
-        if (obj->delete_me) continue;
-
-        ev.canvas.x = e->pointer.x;
-        ev.canvas.y = e->pointer.y;
-        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
         if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
           {
              obj->mouse_grabbed++;
              e->pointer.mouse_grabbed++;
           }
+     }
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
+        if (obj->delete_me) continue;
+
+        ev.canvas.x = e->pointer.x;
+        ev.canvas.y = e->pointer.y;
+        _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
 
         if (e->events_frozen <= 0)
           evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
@@ -579,8 +582,8 @@ evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const
                   ev.cur.canvas.x = e->pointer.x;
                   ev.cur.canvas.y = e->pointer.y;
                   _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
-                  if ((obj->cur.visible) &&
-                      (evas_object_clippers_is_visible(obj)) &&
+                  if (((evas_object_clippers_is_visible(obj)) ||
+                       (obj->mouse_grabbed)) &&
                       (!evas_event_passes_through(obj)) &&
                       (!obj->clip.clipees))
                     {
@@ -698,8 +701,8 @@ evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const
              // FIXME: i don't think we need this
              //             evas_object_clip_recalc(obj);
              if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
-                 (obj->cur.visible) &&
-                 (evas_object_clippers_is_visible(obj)) &&
+                 ((evas_object_clippers_is_visible(obj)) ||
+                     (obj->mouse_grabbed)) &&
                  (eina_list_data_find(ins, obj)) &&
                  (!evas_event_passes_through(obj)) &&
                  (!obj->clip.clipees) &&
@@ -933,6 +936,14 @@ evas_event_feed_multi_down(Evas *e,
    copy = evas_event_list_copy(e->pointer.object.in);
    EINA_LIST_FOREACH(copy, l, obj)
      {
+        if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
+          {
+             obj->mouse_grabbed++;
+             e->pointer.mouse_grabbed++;
+          }
+     }
+   EINA_LIST_FOREACH(copy, l, obj)
+     {
         ev.canvas.x = x;
         ev.canvas.y = y;
         ev.canvas.xsub = fx;
@@ -942,11 +953,6 @@ evas_event_feed_multi_down(Evas *e,
           ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
         if (y != ev.canvas.y)
           ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
-        if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
-          {
-             obj->mouse_grabbed++;
-             e->pointer.mouse_grabbed++;
-          }
         if (e->events_frozen <= 0)
           evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev);
         if (e->delete_me) break;
@@ -1075,8 +1081,8 @@ evas_event_feed_multi_move(Evas *e,
         copy = evas_event_list_copy(e->pointer.object.in);
         EINA_LIST_FOREACH(copy, l, obj)
           {
-             if ((obj->cur.visible) &&
-                 (evas_object_clippers_is_visible(obj)) &&
+             if (((evas_object_clippers_is_visible(obj)) ||
+                  (obj->mouse_grabbed)) &&
                  (!evas_event_passes_through(obj)) &&
                  (!obj->clip.clipees))
                {
@@ -1134,8 +1140,8 @@ evas_event_feed_multi_move(Evas *e,
              // FIXME: i don't think we need this
              //             evas_object_clip_recalc(obj);
              if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
-                 (obj->cur.visible) &&
-                 (evas_object_clippers_is_visible(obj)) &&
+                 ((evas_object_clippers_is_visible(obj)) ||
+                     (obj->mouse_grabbed)) &&
                  (eina_list_data_find(ins, obj)) &&
                  (!evas_event_passes_through(obj)) &&
                  (!obj->clip.clipees) &&
index 96c6340..533a203 100644 (file)
@@ -904,19 +904,22 @@ evas_object_hide(Evas_Object *obj)
              if ((!obj->smart.smart) ||
                  ((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
                {
-                  if (evas_object_is_in_output_rect(obj,
-                                                    obj->layer->evas->pointer.x,
-                                                    obj->layer->evas->pointer.y, 1, 1))
-                    evas_event_feed_mouse_move(obj->layer->evas,
-                                               obj->layer->evas->pointer.x,
-                                               obj->layer->evas->pointer.y,
-                                               obj->layer->evas->last_timestamp,
-                                               NULL);
-                  if (obj->delete_me) return;
+                  if (!obj->mouse_grabbed)
+                    {
+                       if (evas_object_is_in_output_rect(obj,
+                                                         obj->layer->evas->pointer.x,
+                                                         obj->layer->evas->pointer.y, 1, 1))
+                          evas_event_feed_mouse_move(obj->layer->evas,
+                                                     obj->layer->evas->pointer.x,
+                                                     obj->layer->evas->pointer.y,
+                                                     obj->layer->evas->last_timestamp,
+                                                     NULL);
+                    }
 /* this is at odds to handling events when an obj is moved out of the mouse
  * ore resized out or clipped out. if mouse is grabbed - regardless of
  * visibility, mouse move events should keep happening and mouse up.
  * for better or worse it's at least consistent.
+                  if (obj->delete_me) return;
                   if (obj->mouse_grabbed > 0)
                     obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
                   if ((obj->mouse_in) || (obj->mouse_grabbed > 0))