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;

-- 


Reply via email to