and another commit in an attempt to fix mouse grabs + event callbacks

to be consistent



SVN revision: 63607
This commit is contained in:
Carsten Haitzler 2011-09-26 02:45:06 +00:00
parent 0088ea3d8b
commit 7be30a23bf
2 changed files with 36 additions and 27 deletions

View 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); copy = evas_event_list_copy(e->pointer.object.in);
EINA_LIST_FOREACH(copy, l, obj) 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) if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
{ {
obj->mouse_grabbed++; obj->mouse_grabbed++;
e->pointer.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) if (e->events_frozen <= 0)
evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev); 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.x = e->pointer.x;
ev.cur.canvas.y = e->pointer.y; ev.cur.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed); _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
if ((obj->cur.visible) && if (((evas_object_clippers_is_visible(obj)) ||
(evas_object_clippers_is_visible(obj)) && (obj->mouse_grabbed)) &&
(!evas_event_passes_through(obj)) && (!evas_event_passes_through(obj)) &&
(!obj->clip.clipees)) (!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 // FIXME: i don't think we need this
// evas_object_clip_recalc(obj); // evas_object_clip_recalc(obj);
if (evas_object_is_in_output_rect(obj, x, y, 1, 1) && 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)) && (eina_list_data_find(ins, obj)) &&
(!evas_event_passes_through(obj)) && (!evas_event_passes_through(obj)) &&
(!obj->clip.clipees) && (!obj->clip.clipees) &&
@ -931,6 +934,14 @@ evas_event_feed_multi_down(Evas *e,
_evas_walk(e); _evas_walk(e);
copy = evas_event_list_copy(e->pointer.object.in); 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) EINA_LIST_FOREACH(copy, l, obj)
{ {
ev.canvas.x = x; ev.canvas.x = x;
@ -942,11 +953,6 @@ evas_event_feed_multi_down(Evas *e,
ev.canvas.xsub = ev.canvas.x; // fixme - lost precision ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
if (y != ev.canvas.y) if (y != ev.canvas.y)
ev.canvas.ysub = ev.canvas.y; // fixme - lost precision 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) if (e->events_frozen <= 0)
evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev); evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev);
if (e->delete_me) break; 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); copy = evas_event_list_copy(e->pointer.object.in);
EINA_LIST_FOREACH(copy, l, obj) EINA_LIST_FOREACH(copy, l, obj)
{ {
if ((obj->cur.visible) && if (((evas_object_clippers_is_visible(obj)) ||
(evas_object_clippers_is_visible(obj)) && (obj->mouse_grabbed)) &&
(!evas_event_passes_through(obj)) && (!evas_event_passes_through(obj)) &&
(!obj->clip.clipees)) (!obj->clip.clipees))
{ {
@ -1134,8 +1140,8 @@ evas_event_feed_multi_move(Evas *e,
// FIXME: i don't think we need this // FIXME: i don't think we need this
// evas_object_clip_recalc(obj); // evas_object_clip_recalc(obj);
if (evas_object_is_in_output_rect(obj, x, y, 1, 1) && 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)) && (eina_list_data_find(ins, obj)) &&
(!evas_event_passes_through(obj)) && (!evas_event_passes_through(obj)) &&
(!obj->clip.clipees) && (!obj->clip.clipees) &&

View File

@ -904,19 +904,22 @@ evas_object_hide(Evas_Object *obj)
if ((!obj->smart.smart) || if ((!obj->smart.smart) ||
((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap))) ((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
{ {
if (evas_object_is_in_output_rect(obj, if (!obj->mouse_grabbed)
obj->layer->evas->pointer.x, {
obj->layer->evas->pointer.y, 1, 1)) if (evas_object_is_in_output_rect(obj,
evas_event_feed_mouse_move(obj->layer->evas, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.y, 1, 1))
obj->layer->evas->pointer.y, evas_event_feed_mouse_move(obj->layer->evas,
obj->layer->evas->last_timestamp, obj->layer->evas->pointer.x,
NULL); obj->layer->evas->pointer.y,
if (obj->delete_me) return; obj->layer->evas->last_timestamp,
NULL);
}
/* this is at odds to handling events when an obj is moved out of the mouse /* 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 * ore resized out or clipped out. if mouse is grabbed - regardless of
* visibility, mouse move events should keep happening and mouse up. * visibility, mouse move events should keep happening and mouse up.
* for better or worse it's at least consistent. * for better or worse it's at least consistent.
if (obj->delete_me) return;
if (obj->mouse_grabbed > 0) if (obj->mouse_grabbed > 0)
obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed; obj->layer->evas->pointer.mouse_grabbed -= obj->mouse_grabbed;
if ((obj->mouse_in) || (obj->mouse_grabbed > 0)) if ((obj->mouse_in) || (obj->mouse_grabbed > 0))