jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=834794ed84d737e394c47fc4145a0219f7124b01
commit 834794ed84d737e394c47fc4145a0219f7124b01 Author: Jean-Philippe Andre <[email protected]> Date: Fri Aug 19 14:22:15 2016 +0900 evas events: Add new "finger,move/down/up" events for multi touch This moves MULTI events to those new finger event types, and also sends a finger event for finger 0 (aka the pointer). NOTE: This may require a separation between a mouse input and an actual finger touch. To be defined, ie: do we let the app check the input device info to decide whether the event is actually the first finger of a multi touch device, or do we want to send only actual finger events from multi touch devices only? @feature --- src/lib/efl/interfaces/efl_input_interface.eo | 42 +++++++++++++++++++------ src/lib/evas/canvas/evas_events.c | 45 ++++++++++++++++++++------- src/lib/evas/canvas/evas_events_legacy.c | 9 ++++++ 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/lib/efl/interfaces/efl_input_interface.eo b/src/lib/efl/interfaces/efl_input_interface.eo index 7efbea1..c60d252 100644 --- a/src/lib/efl/interfaces/efl_input_interface.eo +++ b/src/lib/efl/interfaces/efl_input_interface.eo @@ -3,18 +3,42 @@ interface Efl.Input.Interface () [[An object implementing this interface can send pointer events. Windows and canvas objects may send input events. + + A "pointer" refers to the main pointing device, which could be a mouse, + trackpad, finger, pen, etc... In other words, the finger id in any + pointer event will always be 0. + + A "finger" refers to a single point of input, usually in an absolute + coordinates input device, and that can support more than one input + position at at time (think multi-touch screens). The first finger (id 0) + is sent along with a pointer event, so be careful to not handle those + events twice. Note that if the input device can support "hovering", it + is entirely possible to receive move events without down coming first. + + A "key" is a key press from a keyboard or equivalent type of input device. + Long, repeated, key presses will always happen like this: + down...up,down...up,down...up (not down...up or down...down...down...up). + + @since 1.19 ]] event_prefix: efl; events { - pointer,move: Efl.Event.Pointer; - pointer,down: Efl.Event.Pointer; - pointer,up: Efl.Event.Pointer; - pointer,cancel: Efl.Event.Pointer; - pointer,in: Efl.Event.Pointer; - pointer,out: Efl.Event.Pointer; - pointer,wheel: Efl.Event.Pointer; - key,down: Efl.Event.Key; - key,up: Efl.Event.Key; + pointer,move: Efl.Event.Pointer; [[Main pointer move (current and previous positions are known).]] + pointer,down: Efl.Event.Pointer; [[Main pointer button pressed (button id is known).]] + pointer,up: Efl.Event.Pointer; [[Main pointer button released (button id is known).]] + pointer,cancel: Efl.Event.Pointer; [[Main pointer button press was cancelled (button id is known). + This can happen in rare cases when the window manager passes + the focus to a more urgent window, for instance. You probably + don't need to listen to this event, as it will be accompanied + by an up event.]] + pointer,in: Efl.Event.Pointer; [[Pointer entered a window or a widget.]] + pointer,out: Efl.Event.Pointer; [[Pointer left a window or a widget.]] + pointer,wheel: Efl.Event.Pointer; [[Mouse wheel event.]] + finger,move: Efl.Event.Pointer; [[Finger moved (current and previous positions are known).]] + finger,down: Efl.Event.Pointer; [[Finger pressed (finger id is known).]] + finger,up: Efl.Event.Pointer; [[Finger released (finger id is known).]] + key,down: Efl.Event.Key; [[Keyboard key press.]] + key,up: Efl.Event.Key; [[Keyboard key release.]] hold: Efl.Event.Hold; [[All input events are on hold or resumed.]] } } diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index d4ae909..83539fa 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -395,6 +395,7 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, _transform_to_src_space_f(obj, src, &ev->cur); point = ev->cur; ev->source = eo_obj; + ev->finger = 0; EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write) { @@ -440,6 +441,8 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_DOWN, NULL, event_id, EFL_EVENT_POINTER_DOWN, evt); + evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_DOWN, NULL, + event_id, EFL_EVENT_FINGER_DOWN, evt); if (e->delete_me) break; if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) break; @@ -477,6 +480,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, curpt = ev->cur; prevpt = ev->prev; ev->source = eo_obj; + ev->finger = 0; if (e->pointer.mouse_grabbed) { @@ -501,6 +505,8 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, ev->action = EFL_POINTER_ACTION_MOVE; evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, NULL, event_id, EFL_EVENT_POINTER_MOVE, evt); + evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_MOVE, NULL, + event_id, EFL_EVENT_FINGER_MOVE, evt); } else outs = eina_list_append(outs, eo_child); @@ -563,6 +569,8 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, NULL, event_id, EFL_EVENT_POINTER_MOVE, evt); + evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_MOVE, NULL, + event_id, EFL_EVENT_FINGER_MOVE, evt); } else if (child->mouse_in) { @@ -642,6 +650,7 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e, _transform_to_src_space_f(obj, src, &ev->cur); point = ev->cur; ev->source = eo_obj; + ev->finger = 0; copy = evas_event_list_copy(src->proxy->src_event_in); EINA_LIST_FOREACH(copy, l, eo_child) @@ -660,6 +669,8 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e, _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_UP, NULL, event_id, EFL_EVENT_POINTER_UP, evt); + evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_UP, NULL, + event_id, EFL_EVENT_FINGER_UP, evt); if (e->delete_me) break; if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) @@ -780,7 +791,7 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi ev->cur = point; _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_DOWN, NULL, - event_id, EFL_EVENT_POINTER_DOWN, ev->eo); + event_id, EFL_EVENT_FINGER_DOWN, ev->eo); if (e->delete_me) break; } eina_list_free(copy); @@ -826,7 +837,7 @@ _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_ ev->cur = point; _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_UP, NULL, - event_id, EFL_EVENT_POINTER_UP, ev->eo); + event_id, EFL_EVENT_FINGER_UP, ev->eo); if (e->delete_me || e->is_frozen) break; } eina_list_free(copy); @@ -878,7 +889,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi ev->cur = point; _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, NULL, - event_id, EFL_EVENT_POINTER_MOVE, ev->eo); + event_id, EFL_EVENT_FINGER_MOVE, ev->eo); if (e->delete_me || e->is_frozen) break; } } @@ -916,7 +927,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi { _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, child->mouse_grabbed); evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, NULL, - event_id, EFL_EVENT_POINTER_MOVE, ev->eo); + event_id, EFL_EVENT_FINGER_MOVE, ev->eo); if (e->delete_me || e->is_frozen) break; } } @@ -1231,6 +1242,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->finger = 0; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -1275,9 +1287,10 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da ev->cur.x = e->pointer.x; ev->cur.y = e->pointer.y; _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); - evas_object_event_callback_call - (eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, NULL, - event_id, EFL_EVENT_POINTER_DOWN, ev->eo); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, NULL, + event_id, EFL_EVENT_POINTER_DOWN, ev->eo); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, NULL, + event_id, EFL_EVENT_FINGER_DOWN, ev->eo); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) _evas_event_source_mouse_down_events(eo_obj, eo_e, ev->eo, event_id); if (e->is_frozen || e->delete_me) break; @@ -1427,6 +1440,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->finger = 0; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -1453,6 +1467,8 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj->mouse_grabbed); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, NULL, event_id, EFL_EVENT_POINTER_UP, ev->eo); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, NULL, + event_id, EFL_EVENT_FINGER_UP, ev->eo); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) _evas_event_source_mouse_up_events(eo_obj, eo_e, ev->eo, event_id); if (e->delete_me) break; @@ -1705,6 +1721,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; ev->pressed_buttons = e->pointer.button; + ev->finger = 0; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -1741,6 +1758,8 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da _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); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, NULL, + event_id, EFL_EVENT_FINGER_MOVE, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } @@ -1824,6 +1843,8 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da 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); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, NULL, + event_id, EFL_EVENT_FINGER_MOVE, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } @@ -1954,6 +1975,8 @@ nogrep: 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); + evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, NULL, + event_id, EFL_EVENT_FINGER_MOVE, evt); if ((obj->proxy->is_proxy) && (obj->proxy->src_events)) _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id); } @@ -2250,7 +2273,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da 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_MULTI_DOWN, NULL, - event_id, EFL_EVENT_POINTER_DOWN, ev->eo); + event_id, EFL_EVENT_FINGER_DOWN, ev->eo); if ((obj->proxy->is_proxy) || (obj->proxy->src_events)) _evas_event_source_multi_down_events(obj, e, ev->eo, event_id); if (e->delete_me || e->is_frozen) break; @@ -2310,7 +2333,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Event_Pointer_Data e->pointer.mouse_grabbed--; } evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, NULL, - event_id, EFL_EVENT_POINTER_UP, ev->eo); + event_id, EFL_EVENT_FINGER_UP, ev->eo); if ((obj->proxy->is_proxy) || (obj->proxy->src_events)) _evas_event_source_multi_up_events(obj, e, ev->eo, event_id); if (e->delete_me || e->is_frozen) break; @@ -2465,7 +2488,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da 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_MULTI_MOVE, NULL, - event_id, EFL_EVENT_POINTER_MOVE, ev->eo); + event_id, EFL_EVENT_FINGER_MOVE, ev->eo); if ((obj->proxy->is_proxy) || (obj->proxy->src_events)) _evas_event_source_multi_move_events(obj, e, ev->eo, event_id); @@ -2505,7 +2528,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Event_Pointer_Da 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_MULTI_MOVE, NULL, - event_id, EFL_EVENT_POINTER_MOVE, ev->eo); + event_id, EFL_EVENT_FINGER_MOVE, ev->eo); if ((obj->proxy->is_proxy) || (obj->proxy->src_events)) _evas_event_source_multi_move_events(obj, e, ev->eo, event_id); } diff --git a/src/lib/evas/canvas/evas_events_legacy.c b/src/lib/evas/canvas/evas_events_legacy.c index dfe3d82..a025530 100644 --- a/src/lib/evas/canvas/evas_events_legacy.c +++ b/src/lib/evas/canvas/evas_events_legacy.c @@ -84,6 +84,9 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type, case EFL_POINTER_ACTION_DOWN: if (ev->finger == 0) { + // filter out MULTI with finger 0, valid for eo, invalid for legacy + if (type == EVAS_CALLBACK_MULTI_DOWN) + return NULL; TYPE_CHK(MOUSE_DOWN); Evas_Event_Mouse_Down *e = _event_alloc(ev->legacy); e->button = ev->button; @@ -132,6 +135,9 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type, case EFL_POINTER_ACTION_UP: if (ev->finger == 0) { + // filter out MULTI with finger 0, valid for eo, invalid for legacy + if (type == EVAS_CALLBACK_MULTI_UP) + return NULL; TYPE_CHK(MOUSE_UP); Evas_Event_Mouse_Up *e = _event_alloc(ev->legacy); e->button = ev->button; @@ -180,6 +186,9 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type, case EFL_POINTER_ACTION_MOVE: if (ev->finger == 0) { + // filter out MULTI with finger 0, valid for eo, invalid for legacy + if (type == EVAS_CALLBACK_MULTI_MOVE) + return NULL; TYPE_CHK(MOUSE_MOVE); Evas_Event_Mouse_Move *e = _event_alloc(ev->legacy); e->buttons = ev->pressed_buttons; --
