diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-08-18 16:28:55 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-08-26 10:18:01 +0900 |
commit | ac26c7d4f382a968c505cfa317baf76c38f613a0 (patch) | |
tree | cc3b62682f5b46d3c64233a9a63ab1f78962523c | |
parent | 46c85b87fd65d0c9fc6f107cfc8748be386f8ad6 (diff) | |
download | efl-ac26c7d4f382a968c505cfa317baf76c38f613a0.tar.gz |
evas events: Switch mouse move events to the new type
This is the last commit for this crazy input transformation
series. The following commits will be cleaning up now
unused code, and fixing bugs.
-rw-r--r-- | src/lib/evas/canvas/evas_events.c | 496 |
1 files changed, 193 insertions, 303 deletions
diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index da39c98165..60c1750345 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -11,13 +11,12 @@ _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in, const Eina_Inlist *list, Evas_Object *stop, int x, int y, int *no_rep, Eina_Bool source); +/* FIXME: use eina_list_clone */ static Eina_List * evas_event_list_copy(Eina_List *list); static void -_canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int y, - unsigned int timestamp, const void *data, - Efl_Event_Pointer *parent_pe); +_canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data *ev); static void _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data *ev); @@ -25,6 +24,10 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data static void _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data *ev); +static void +_canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y, + unsigned int timestamp, const void *data); + /* FIXME: remove this */ static void _evas_event_havemap_adjust(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Evas_Coord *x, Evas_Coord *y, Eina_Bool mouse_grabbed) @@ -1257,8 +1260,8 @@ _evas_canvas_event_default_flags_get(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e) static inline void _canvas_event_thaw_eval_internal(Eo *eo_e, Evas_Public_Data *e) { - _canvas_event_feed_mouse_move_internal(eo_e, e, e->pointer.x, e->pointer.y, - e->last_timestamp, NULL, NULL); + _canvas_event_feed_mouse_move_legacy(eo_e, e, e->pointer.x, e->pointer.y, + e->last_timestamp, NULL); } EAPI void @@ -1529,7 +1532,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Event_Pointer *parent_ev) eina_list_free(ins); } if (e->pointer.inside) - _canvas_event_feed_mouse_move_internal(eo_e, e, e->pointer.x, e->pointer.y, ev->timestamp, ev->data, evt); + _canvas_event_feed_mouse_move_legacy(eo_e, e, e->pointer.x, e->pointer.y, ev->timestamp, ev->data); efl_del(evt); @@ -1812,23 +1815,42 @@ evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timesta } static void -_canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int y, - unsigned int timestamp, const void *data, - Efl_Event_Pointer *parent_pe) +_canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data *ev) { Evas_Object *nogrep_obj = NULL; - Efl_Event_Pointer *pemove = NULL, *peout = NULL, *pein = NULL; - int px, py; - - px = e->pointer.x; - py = e->pointer.y; + Evas_Object_Protected_Data *obj; + Efl_Event_Pointer *evt; + Eina_List *l, *copy; + Evas_Object *eo_obj; + Eina_Vector2 point; + Evas *eo_e; + int event_id; + int x, y, px, py; + if (!e || !ev) return; if (e->is_frozen) return; - e->last_timestamp = timestamp; - e->pointer.x = x; - e->pointer.y = y; + eo_e = e->evas; + e->last_timestamp = ev->timestamp; + + // prev pos + px = ev->prev.x = e->pointer.x; + py = ev->prev.y = e->pointer.y; + + // new pos + x = e->pointer.x = ev->cur.x; + y = e->pointer.y = ev->cur.y; + point = ev->cur; + if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return; + + evt = ev->eo; + ev->modifiers = &(e->modifiers); + ev->locks = &(e->locks); + ev->event_flags = e->default_event_flags; + ev->pressed_buttons = e->pointer.button; + if (ev->device) efl_ref(ev->device); + _evas_walk(e); /* update moved touch point */ if ((px != x) || (py != y)) @@ -1836,178 +1858,85 @@ _canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int /* if our mouse button is grabbed to any objects */ if (e->pointer.mouse_grabbed > 0) { - /* go thru old list of in objects */ Eina_List *outs = NULL; - Eina_List *l, *copy; - - { - Evas_Event_Mouse_Move ev; - Evas_Object *eo_obj; - int event_id = 0; - - _evas_object_event_new(); - - event_id = _evas_event_counter; - ev.buttons = e->pointer.button; - ev.cur.output.x = e->pointer.x; - ev.cur.output.y = e->pointer.y; - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - ev.prev.output.x = px; - ev.prev.output.y = py; - ev.prev.canvas.x = px; - ev.prev.canvas.y = py; - ev.data = (void *)data; - ev.modifiers = &(e->modifiers); - ev.locks = &(e->locks); - ev.timestamp = timestamp; - ev.event_flags = e->default_event_flags; - ev.dev = _evas_device_top_get(eo_e); - if (ev.dev) efl_ref(ev.dev); - - copy = evas_event_list_copy(e->pointer.object.in); - EINA_LIST_FOREACH(copy, l, eo_obj) - { - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - if ((!e->is_frozen) && - (evas_object_clippers_is_visible(eo_obj, obj) || - obj->mouse_grabbed) && - (!evas_event_passes_through(eo_obj, obj)) && - (!evas_event_freezes_through(eo_obj, obj)) && - (!evas_object_is_source_invisible(eo_obj, obj) || - obj->mouse_grabbed) && - (!obj->clip.clipees)) - { - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev.cur.canvas.x, - &ev.cur.canvas.y, - obj->mouse_grabbed); - if ((px != x) || (py != y)) - { - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id, pemove, parent_pe); - if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_move_events(eo_obj, eo_e, pemove, event_id); - } - } - else - outs = eina_list_append(outs, eo_obj); - if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) && - (e->pointer.nogrep > 0)) + /* Send normal mouse move events */ + ev->action = EFL_POINTER_ACTION_MOVE; + + _evas_object_event_new(); + event_id = _evas_event_counter; + + /* go thru old list of in objects */ + copy = evas_event_list_copy(e->pointer.object.in); + EINA_LIST_FOREACH(copy, l, eo_obj) + { + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + if ((!e->is_frozen) && + (evas_object_clippers_is_visible(eo_obj, obj) || + obj->mouse_grabbed) && + (!evas_event_passes_through(eo_obj, obj)) && + (!evas_event_freezes_through(eo_obj, obj)) && + (!evas_object_is_source_invisible(eo_obj, obj) || + obj->mouse_grabbed) && + (!obj->clip.clipees)) + { + if ((px != x) || (py != y)) { - eina_list_free(copy); - nogrep_obj = eo_obj; - goto nogrep; + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, NULL, + event_id, EFL_EVENT_POINTER_MOVE, evt); + if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) + _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } - if (e->delete_me) break; } - _evas_post_event_callback_call(eo_e, e); - if (ev.dev) efl_unref(ev.dev); - EV_DEL(pemove); + else + outs = eina_list_append(outs, eo_obj); + if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) && + (e->pointer.nogrep > 0)) + { + eina_list_free(copy); + eina_list_free(outs); + nogrep_obj = eo_obj; + goto nogrep; + } + if (e->delete_me) break; } - { - Evas_Event_Mouse_Out ev; - int event_id = 0; + eina_list_free(copy); + _evas_post_event_callback_call(eo_e, e); - _evas_object_event_new(); - event_id = _evas_event_counter; - ev.buttons = e->pointer.button; - ev.output.x = e->pointer.x; - ev.output.y = e->pointer.y; - ev.canvas.x = e->pointer.x; - ev.canvas.y = e->pointer.y; - ev.data = (void *)data; - ev.modifiers = &(e->modifiers); - ev.locks = &(e->locks); - ev.timestamp = timestamp; - ev.event_flags = e->default_event_flags; - ev.dev = _evas_device_top_get(eo_e); - if (ev.dev) efl_ref(ev.dev); + /* Send mouse out events */ + ev->action = EFL_POINTER_ACTION_OUT; - eina_list_free(copy); + _evas_object_event_new(); + event_id = _evas_event_counter; - while (outs) + EINA_LIST_FREE(outs, eo_obj) + { + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + if ((obj->mouse_grabbed == 0) && (!e->delete_me)) { - Evas_Object *eo_obj; - eo_obj = outs->data; - outs = eina_list_remove(outs, eo_obj); - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - if ((obj->mouse_grabbed == 0) && (!e->delete_me)) - { - if (!obj->mouse_in) continue; - obj->mouse_in = 0; - if (obj->delete_me || e->is_frozen) continue; - ev.canvas.x = e->pointer.x; - ev.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, - &ev.canvas.y, - obj->mouse_grabbed); - e->pointer.object.in = eina_list_remove(e->pointer.object.in, eo_obj); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id, peout, parent_pe); - if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_out_events(eo_obj, eo_e, peout, event_id); - } + if (!obj->mouse_in) continue; + obj->mouse_in = 0; + if (obj->delete_me || e->is_frozen) continue; + e->pointer.object.in = eina_list_remove(e->pointer.object.in, eo_obj); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, NULL, + event_id, EFL_EVENT_POINTER_OUT, evt); + if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) + _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id); } - _evas_post_event_callback_call(eo_e, e); - if (ev.dev) efl_unref(ev.dev); - EV_DEL(peout); } + _evas_post_event_callback_call(eo_e, e); } else { Eina_List *ins; - Eina_List *l, *copy; - Evas_Event_Mouse_Move ev; - Evas_Event_Mouse_Out ev2; - Evas_Event_Mouse_In ev3; - Evas_Object *eo_obj; - int event_id = 0, event_id2 = 0; _evas_object_event_new(); - event_id = _evas_event_counter; - ev.buttons = e->pointer.button; - ev.cur.output.x = e->pointer.x; - ev.cur.output.y = e->pointer.y; - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - ev.prev.output.x = px; - ev.prev.output.y = py; - ev.prev.canvas.x = px; - ev.prev.canvas.y = py; - ev.data = (void *)data; - ev.modifiers = &(e->modifiers); - ev.locks = &(e->locks); - ev.timestamp = timestamp; - ev.event_flags = e->default_event_flags; - ev.dev = _evas_device_top_get(eo_e); - if (ev.dev) efl_ref(ev.dev); - - ev2.buttons = e->pointer.button; - ev2.output.x = e->pointer.x; - ev2.output.y = e->pointer.y; - ev2.canvas.x = e->pointer.x; - ev2.canvas.y = e->pointer.y; - ev2.data = (void *)data; - ev2.modifiers = &(e->modifiers); - ev2.locks = &(e->locks); - ev2.timestamp = timestamp; - ev2.event_flags = e->default_event_flags; - ev2.dev = ev.dev; - - ev3.buttons = e->pointer.button; - ev3.output.x = e->pointer.x; - ev3.output.y = e->pointer.y; - ev3.canvas.x = e->pointer.x; - ev3.canvas.y = e->pointer.y; - ev3.data = (void *)data; - ev3.modifiers = &(e->modifiers); - ev3.locks = &(e->locks); - ev3.timestamp = timestamp; - ev3.event_flags = e->default_event_flags; - ev3.dev = ev.dev; /* get all new in objects */ ins = evas_event_objects_event_list(eo_e, NULL, x, y); @@ -2015,9 +1944,9 @@ _canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int copy = evas_event_list_copy(e->pointer.object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); if (!obj) continue; + /* if its under the pointer and its visible and its in the new */ /* in list */ // FIXME: i don't think we need this @@ -2037,44 +1966,41 @@ _canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int { if ((px != x) || (py != y)) { - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id, pemove, parent_pe); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_MOVE; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, NULL, + event_id, EFL_EVENT_POINTER_MOVE, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_move_events(eo_obj, eo_e, pemove, event_id); + _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } } /* otherwise it has left the object */ - else + else if (obj->mouse_in) { - if (obj->mouse_in) - { - obj->mouse_in = 0; - if (e->is_frozen) continue; - ev2.canvas.x = e->pointer.x; - ev2.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev2.canvas.x, - &ev2.canvas.y, - obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id, peout, parent_pe); - if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_out_events(eo_obj, eo_e, peout, event_id); - if (e->delete_me) break; - } + obj->mouse_in = 0; + if (e->is_frozen) continue; + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_OUT; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, NULL, + event_id, EFL_EVENT_POINTER_OUT, evt); + if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) + _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id); + if (e->delete_me) break; } } + eina_list_free(copy); _evas_post_event_callback_call(eo_e, e); + /* new event id for mouse in */ _evas_object_event_new(); - - event_id2 = _evas_event_counter; - eina_list_free(copy); + event_id = _evas_event_counter; /* go thru our current list of ins */ EINA_LIST_FOREACH(ins, l, eo_obj) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); /* if its not in the old list of ins send an enter event */ if (!eina_list_data_find(e->pointer.object.in, eo_obj)) { @@ -2082,15 +2008,14 @@ _canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int { obj->mouse_in = 1; if (e->is_frozen) continue; - ev3.canvas.x = e->pointer.x; - ev3.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev3.canvas.x, - &ev3.canvas.y, - obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2, pein, parent_pe); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_IN; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, NULL, + event_id, EFL_EVENT_POINTER_IN, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_in_events(eo_obj, eo_e, pein, event_id); + _evas_event_source_mouse_in_events(eo_obj, eo_e, evt, event_id); if (e->delete_me) break; } } @@ -2108,79 +2033,26 @@ _canvas_event_feed_mouse_move_internal(Eo *eo_e, Evas_Public_Data *e, int x, int eina_list_free(ins); } _evas_post_event_callback_call(eo_e, e); - if (ev.dev) efl_unref(ev.dev); - EV_DEL(pemove); - EV_DEL(peout); - EV_DEL(pein); } - _evas_unwalk(e); - return; + nogrep: + if (nogrep_obj) { - Eina_List *ins = NULL; - Eina_List *newin = NULL; - Eina_List *l, *copy, *lst = NULL; - Evas_Event_Mouse_Move ev; - Evas_Event_Mouse_Out ev2; - Evas_Event_Mouse_In ev3; - Evas_Object *eo_obj, *eo_below_obj; - int event_id = 0, event_id2 = 0; - int norep = 0, breaknext = 0; + Eina_List *ins = NULL, *newin = NULL, *lst = NULL; + Evas_Object *eo_below_obj; _evas_object_event_new(); - event_id = _evas_event_counter; - ev.buttons = e->pointer.button; - ev.cur.output.x = e->pointer.x; - ev.cur.output.y = e->pointer.y; - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - ev.prev.output.x = px; - ev.prev.output.y = py; - ev.prev.canvas.x = px; - ev.prev.canvas.y = py; - ev.data = (void *)data; - ev.modifiers = &(e->modifiers); - ev.locks = &(e->locks); - ev.timestamp = timestamp; - ev.event_flags = e->default_event_flags; - ev.dev = _evas_device_top_get(eo_e); - if (ev.dev) efl_ref(ev.dev); - - ev2.buttons = e->pointer.button; - ev2.output.x = e->pointer.x; - ev2.output.y = e->pointer.y; - ev2.canvas.x = e->pointer.x; - ev2.canvas.y = e->pointer.y; - ev2.data = (void *)data; - ev2.modifiers = &(e->modifiers); - ev2.locks = &(e->locks); - ev2.timestamp = timestamp; - ev2.event_flags = e->default_event_flags; - ev2.dev = ev.dev; - - ev3.buttons = e->pointer.button; - ev3.output.x = e->pointer.x; - ev3.output.y = e->pointer.y; - ev3.canvas.x = e->pointer.x; - ev3.canvas.y = e->pointer.y; - ev3.data = (void *)data; - ev3.modifiers = &(e->modifiers); - ev3.locks = &(e->locks); - ev3.timestamp = timestamp; - ev3.event_flags = e->default_event_flags; - ev3.dev = ev.dev; /* go thru old list of in objects */ copy = evas_event_list_copy(e->pointer.object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { - if (breaknext) + if (eo_obj == nogrep_obj) { - lst = l; + lst = l->next; break; } - if (eo_obj == nogrep_obj) breaknext = 1; } /* get all new in objects */ @@ -2188,24 +2060,25 @@ nogrep: if (eo_below_obj) { Evas_Object_Protected_Data *below_obj = efl_data_scope_get(eo_below_obj, EFL_CANVAS_OBJECT_CLASS); + int norep = 0; ins = _evas_event_object_list_raw_in_get(eo_e, NULL, EINA_INLIST_GET(below_obj), NULL, e->pointer.x, e->pointer.y, &norep, EINA_FALSE); } + EINA_LIST_FOREACH(copy, l, eo_obj) { newin = eina_list_append(newin, eo_obj); if (eo_obj == nogrep_obj) break; } - EINA_LIST_FOREACH(ins, l, eo_obj) - { - newin = eina_list_append(newin, eo_obj); - } + + // NOTE: was foreach + append without free (smelled bad) + newin = eina_list_merge(newin, ins); EINA_LIST_FOREACH(lst, l, eo_obj) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); /* if its under the pointer and its visible and its in the new */ /* in list */ // FIXME: i don't think we need this @@ -2225,54 +2098,54 @@ nogrep: { if ((px != x) || (py != y)) { - ev.cur.canvas.x = e->pointer.x; - ev.cur.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id, pemove, parent_pe); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_MOVE; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, NULL, + event_id, EFL_EVENT_POINTER_MOVE, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_move_events(eo_obj, eo_e, pemove, event_id); + _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } } - /* otherwise it has left the object */ else { + /* otherwise it has left the object */ if (!obj->mouse_in) continue; obj->mouse_in = 0; if (e->is_frozen) continue; - ev2.canvas.x = e->pointer.x; - ev2.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev2.canvas.x, - &ev2.canvas.y, obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id, peout, parent_pe); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_OUT; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, NULL, + event_id, EFL_EVENT_POINTER_OUT, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_out_events(eo_obj, eo_e, peout, event_id); + _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id); } if (e->delete_me) break; } + eina_list_free(copy); _evas_post_event_callback_call(eo_e, e); _evas_object_event_new(); - - event_id2 = _evas_event_counter; - eina_list_free(copy); + event_id = _evas_event_counter; /* go thru our current list of ins */ EINA_LIST_FOREACH(newin, l, eo_obj) { - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); /* if its not in the old list of ins send an enter event */ if (!eina_list_data_find(e->pointer.object.in, eo_obj)) { if (obj->mouse_in) continue; obj->mouse_in = 1; if (e->is_frozen) continue; - ev3.canvas.x = e->pointer.x; - ev3.canvas.y = e->pointer.y; - _evas_event_havemap_adjust(eo_obj, obj, &ev3.canvas.x, - &ev3.canvas.y, obj->mouse_grabbed); - EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2, pein, parent_pe); + ev->cur = point; + _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); + ev->action = EFL_POINTER_ACTION_IN; + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, NULL, + event_id, EFL_EVENT_POINTER_IN, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) - _evas_event_source_mouse_in_events(eo_obj, eo_e, pein, event_id2); + _evas_event_source_mouse_in_events(eo_obj, eo_e, evt, event_id); if (e->delete_me) break; } } @@ -2282,26 +2155,47 @@ nogrep: e->pointer.object.in = newin; _evas_post_event_callback_call(eo_e, e); - if (ev.dev) efl_unref(ev.dev); - EV_DEL(pemove); - EV_DEL(peout); - EV_DEL(pein); } + _evas_unwalk(e); + if (ev->device) efl_unref(ev->device); +} + +static void +_canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y, + unsigned int timestamp, const void *data) +{ + Efl_Event_Pointer_Data *ev = NULL; + Efl_Event_Pointer *evt; + + evt = efl_event_instance_get(EFL_EVENT_POINTER_CLASS, eo_e, (void **) &ev); + if (!ev) return; + + ev->data = (void *) data; + ev->timestamp = timestamp; + ev->device = _evas_device_top_get(eo_e); + ev->cur.x = x; + ev->cur.y = y; + + _canvas_event_feed_mouse_move_internal(e, ev); + + efl_del(evt); } EAPI void evas_event_input_mouse_move(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data) { + EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS)); Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS); - _canvas_event_feed_mouse_move_internal(eo_e, e, x - e->framespace.x, y - e->framespace.y, timestamp, data, NULL); + _canvas_event_feed_mouse_move_legacy(eo_e, e, x - e->framespace.x, y - e->framespace.y, timestamp, data); } EAPI void evas_event_feed_mouse_move(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data) { + EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS)); Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS); - _canvas_event_feed_mouse_move_internal(eo_e, e, x, y, timestamp, data, NULL); + _canvas_event_feed_mouse_move_legacy(eo_e, e, x, y, timestamp, data); } static void @@ -2358,7 +2252,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Event_Pointer_Data *ev) /* and set up the new one */ e->pointer.object.in = ins; _evas_post_event_callback_call(eo_e, e); - _canvas_event_feed_mouse_move_internal(eo_e, e, e->pointer.x, e->pointer.y, ev->timestamp, ev->data, ev->eo); + _canvas_event_feed_mouse_move_internal(e, ev); _evas_unwalk(e); if (ev->device) efl_unref(ev->device); @@ -3166,10 +3060,9 @@ _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj) evas->pointer.x, evas->pointer.y)))) { - _canvas_event_feed_mouse_move_internal(evas->evas, evas, - evas->pointer.x, evas->pointer.y, - evas->last_timestamp, - NULL, NULL); + _canvas_event_feed_mouse_move_legacy(evas->evas, evas, + evas->pointer.x, evas->pointer.y, + evas->last_timestamp, NULL); } } @@ -3423,10 +3316,7 @@ _evas_canvas_event_pointer_cb(void *data, const Eo_Event *event) { case EFL_POINTER_ACTION_MOVE: if (ev->finger == 0) - { - _canvas_event_feed_mouse_move_internal(eo_e, e, ev->cur.x, ev->cur.y, - ev->timestamp, ev->data, ev->eo); - } + _canvas_event_feed_mouse_move_internal(e, ev); else _canvas_event_feed_multi_move_internal(e, ev); break; |