diff --git a/legacy/evas/src/lib/canvas/evas_events.c b/legacy/evas/src/lib/canvas/evas_events.c index 515aa4ed9c..e7fb6b040b 100644 --- a/legacy/evas/src/lib/canvas/evas_events.c +++ b/legacy/evas/src/lib/canvas/evas_events.c @@ -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) && @@ -931,6 +934,14 @@ evas_event_feed_multi_down(Evas *e, _evas_walk(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; @@ -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) && diff --git a/legacy/evas/src/lib/canvas/evas_object_main.c b/legacy/evas/src/lib/canvas/evas_object_main.c index 96c6340aaa..533a2035fd 100644 --- a/legacy/evas/src/lib/canvas/evas_object_main.c +++ b/legacy/evas/src/lib/canvas/evas_object_main.c @@ -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))