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
This commit is contained in:
Jean-Philippe Andre 2016-08-19 14:22:15 +09:00
parent 608da26634
commit 834794ed84
3 changed files with 76 additions and 20 deletions

View File

@ -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.]]
}
}

View File

@ -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);
}

View File

@ -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;