forked from enlightenment/efl
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:
parent
608da26634
commit
834794ed84
|
@ -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.]]
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue