evas: Fix mouse inputs when also listening to multi
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 17 Aug 2016 04:08:03 +0000 (13:08 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 17 Aug 2016 04:13:23 +0000 (13:13 +0900)
Since the new event type is the same for multi and single
touch (finger id is the only difference), multi touch listeners
would get triggered even for single mouse events.

Fixes https://phab.enlightenment.org/T4345
Fixes https://phab.enlightenment.org/T4378

This raises a question though: How do we want to differentiate
between single & multi touch events in the eo interfaces?

src/lib/evas/canvas/evas_callbacks.c
src/lib/evas/canvas/evas_events_legacy.c
src/lib/evas/include/evas_private.h

index ae9c9bb..7959079 100644 (file)
@@ -131,7 +131,7 @@ _eo_evas_object_cb(void *data, const Eo_Event *event)
    switch (info->efl_event_info)
      {
       case EFL_EVENT_TYPE_POINTER:
-        event_info = efl_event_pointer_legacy_info_fill(efl_event_info, &event_flags);
+        event_info = efl_event_pointer_legacy_info_fill(efl_event_info, info->type, &event_flags);
         break;
 
       case EFL_EVENT_TYPE_KEY:
index 0d2cd24..ff9c01b 100644 (file)
@@ -210,16 +210,18 @@ efl_event_pointer_legacy_info_set(Efl_Event_Pointer *evt, const void *event_info
 }
 
 void *
-efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags)
+efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type, Evas_Event_Flags **pflags)
 {
    Efl_Event_Pointer_Data *ev = efl_data_scope_get(evt, EFL_EVENT_POINTER_CLASS);
    if (!ev) return NULL;
 
 #define COORD_DUP(e) do { (e)->output.x = (e)->canvas.x; (e)->output.y = (e)->canvas.y; } while (0)
+#define TYPE_CHK(typ) do { if (type != EVAS_CALLBACK_ ## typ) return NULL; } while (0)
 
    switch (ev->action)
      {
       case EFL_POINTER_ACTION_IN:
+        TYPE_CHK(MOUSE_IN);
         {
            Evas_Event_Mouse_In *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
            e->canvas.x = ev->cur.x;
@@ -238,6 +240,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
         }
 
       case EFL_POINTER_ACTION_OUT:
+        TYPE_CHK(MOUSE_OUT);
         {
            Evas_Event_Mouse_Out *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
            e->canvas.x = ev->cur.x;
@@ -258,6 +261,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
       case EFL_POINTER_ACTION_DOWN:
         if (ev->finger == 0)
           {
+             TYPE_CHK(MOUSE_DOWN);
              Evas_Event_Mouse_Down *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->button = ev->button;
              e->canvas.x = ev->cur.x;
@@ -277,6 +281,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
           }
         else
           {
+             TYPE_CHK(MULTI_DOWN);
              Evas_Event_Multi_Down *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->device = ev->finger;
              e->radius = ev->radius;
@@ -304,6 +309,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
       case EFL_POINTER_ACTION_UP:
         if (ev->finger == 0)
           {
+             TYPE_CHK(MOUSE_UP);
              Evas_Event_Mouse_Up *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->button = ev->button;
              e->canvas.x = ev->cur.x;
@@ -323,6 +329,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
           }
         else
           {
+             TYPE_CHK(MULTI_UP);
              Evas_Event_Multi_Up *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->device = ev->finger;
              e->radius = ev->radius;
@@ -350,6 +357,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
       case EFL_POINTER_ACTION_MOVE:
         if (ev->finger == 0)
           {
+             TYPE_CHK(MOUSE_MOVE);
              Evas_Event_Mouse_Move *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->buttons = ev->pressed_buttons;
              e->cur.canvas.x = ev->cur.x;
@@ -371,6 +379,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
           }
         else
           {
+             TYPE_CHK(MULTI_MOVE);
              Evas_Event_Multi_Move *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
              e->device = ev->finger;
              e->radius = ev->radius;
@@ -396,6 +405,7 @@ efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags
 
       case EFL_POINTER_ACTION_WHEEL:
         {
+           TYPE_CHK(MOUSE_WHEEL);
            Evas_Event_Mouse_Wheel *e = ev->legacy ? ev->legacy : calloc(1, sizeof(*e));
            e->direction =  (ev->wheel.dir == EFL_ORIENT_HORIZONTAL) ? 1 : 0;
            e->z = ev->wheel.z;
index d7b4891..d63e7d4 100644 (file)
@@ -1957,7 +1957,7 @@ Evas_Device *_evas_device_top_get(const Evas *e);
 Eina_Bool efl_event_pointer_legacy_info_set(Efl_Event_Pointer *evt, const void *event_info, Evas_Callback_Type type);
 Eina_Bool efl_event_key_legacy_info_set(Efl_Event_Key *evt, const void *event_info, Evas_Callback_Type type);
 Eina_Bool efl_event_hold_legacy_info_set(Efl_Event_Hold *evt, const void *event_info, Evas_Callback_Type type);
-void *efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags);
+void *efl_event_pointer_legacy_info_fill(Efl_Event_Key *evt, Evas_Callback_Type type, Evas_Event_Flags **pflags);
 void *efl_event_key_legacy_info_fill(Efl_Event_Key *evt, Evas_Event_Flags **pflags);
 void *efl_event_hold_legacy_info_fill(Efl_Event_Hold *evt, Evas_Event_Flags **pflags);