evas events: Fix repeated calls to mouse callbacks
authorJean-Philippe Andre <jp.andre@samsung.com>
Wed, 31 Aug 2016 02:33:20 +0000 (11:33 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Wed, 31 Aug 2016 02:41:58 +0000 (11:41 +0900)
After my many input events changes, a same object callback
could be called multiple times in a row because both mouse
and multi events were sent. As such, the multi event had no
direct effect (no callback called) but it reset the object's
last event type. This allowed the mouse event callbacks to be
called again.

Note that I haven't tested multi touch yet :(

Very good catch by @bu5hm4n!

Fixes T4462
Fixes T4467

src/lib/evas/canvas/evas_callbacks.c
src/lib/evas/canvas/evas_events.c

index 7fd6ff1..7842e7c 100644 (file)
@@ -42,9 +42,9 @@ DEFINE_EVAS_CALLBACKS(_legacy_evas_callback_table, EVAS_CALLBACK_LAST,
                       EFL_EVENT_POINTER_UP,
                       EFL_EVENT_POINTER_MOVE,
                       EFL_EVENT_POINTER_WHEEL,
-                      EFL_EVENT_POINTER_DOWN,
-                      EFL_EVENT_POINTER_UP,
-                      EFL_EVENT_POINTER_MOVE,
+                      EFL_EVENT_FINGER_DOWN,
+                      EFL_EVENT_FINGER_UP,
+                      EFL_EVENT_FINGER_MOVE,
                       EVAS_OBJECT_EVENT_FREE,
                       EFL_EVENT_KEY_DOWN,
                       EFL_EVENT_KEY_UP,
@@ -299,7 +299,7 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data
                                 const Efl_Event_Description *efl_event_desc)
 {
    /* MEM OK */
-   const Evas_Button_Flags mask = EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK;
+   const Evas_Button_Flags CLICK_MASK = EVAS_BUTTON_DOUBLE_CLICK | EVAS_BUTTON_TRIPLE_CLICK;
    Evas_Button_Flags flags = EVAS_BUTTON_NONE;
    Evas_Public_Data *e;
 
@@ -328,10 +328,10 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data
    if ((type == EVAS_CALLBACK_MOUSE_DOWN) || (type == EVAS_CALLBACK_MOUSE_UP))
      {
         flags = efl_input_pointer_button_flags_get(event_info);
-        if (flags & mask)
+        if (flags & CLICK_MASK)
           {
              if (obj->last_mouse_down_counter < (e->last_mouse_down_counter - 1))
-               efl_input_pointer_button_flags_set(event_info, flags & ~mask);
+               efl_input_pointer_button_flags_set(event_info, flags & ~CLICK_MASK);
           }
         obj->last_mouse_down_counter = e->last_mouse_down_counter;
      }
@@ -344,8 +344,24 @@ evas_object_event_callback_call(Evas_Object *eo_obj, Evas_Object_Protected_Data
 
    efl_event_callback_legacy_call(eo_obj, efl_event_desc, event_info);
 
-   if ((type == EVAS_CALLBACK_MOUSE_DOWN) || (type == EVAS_CALLBACK_MOUSE_UP))
-     efl_input_pointer_button_flags_set(event_info, flags);
+   /* multi events with finger 0 - only for eo callbacks */
+   if (type == EVAS_CALLBACK_MOUSE_DOWN)
+     {
+        if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_DOWN))
+          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_DOWN, event_info);
+        efl_input_pointer_button_flags_set(event_info, flags);
+     }
+   else if (type == EVAS_CALLBACK_MOUSE_UP)
+     {
+        if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_UP))
+          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_UP, event_info);
+        efl_input_pointer_button_flags_set(event_info, flags);
+     }
+   else if (type == EVAS_CALLBACK_MOUSE_MOVE)
+     {
+        if (_evas_object_callback_has_by_type(obj, EVAS_CALLBACK_MULTI_MOVE))
+          efl_event_callback_call(eo_obj, EFL_EVENT_FINGER_MOVE, event_info);
+     }
 
 nothing_here:
    if (!obj->no_propagate)
index 1238d51..63e4573 100644 (file)
@@ -441,8 +441,6 @@ _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, evt,
                                         event_id, EFL_EVENT_POINTER_DOWN);
-        evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_DOWN, evt,
-                                        event_id, EFL_EVENT_FINGER_DOWN);
         if (e->delete_me) break;
         if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
           break;
@@ -505,8 +503,6 @@ _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, evt,
                                                   event_id, EFL_EVENT_POINTER_MOVE);
-                  evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_MOVE, evt,
-                                                  event_id, EFL_EVENT_FINGER_MOVE);
                }
              else
                outs = eina_list_append(outs, eo_child);
@@ -569,8 +565,6 @@ _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, evt,
                                                   event_id, EFL_EVENT_POINTER_MOVE);
-                  evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_MOVE, evt,
-                                                  event_id, EFL_EVENT_FINGER_MOVE);
                }
              else if (child->mouse_in)
                {
@@ -669,8 +663,6 @@ _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, evt,
                                         event_id, EFL_EVENT_POINTER_UP);
-        evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MULTI_UP, evt,
-                                        event_id, EFL_EVENT_FINGER_UP);
         if (e->delete_me) break;
         if (obj->pointer_mode ==
             EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
@@ -1287,8 +1279,6 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_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_DOWN, evt,
                                         event_id, EFL_EVENT_POINTER_DOWN);
-        evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, evt,
-                                        event_id, EFL_EVENT_FINGER_DOWN);
         if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
           _evas_event_source_mouse_down_events(eo_obj, eo_e, evt, event_id);
         if (e->is_frozen || e->delete_me)  break;
@@ -1475,8 +1465,6 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_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, evt,
                                                   event_id, EFL_EVENT_POINTER_UP);
-                  evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, evt,
-                                                  event_id, EFL_EVENT_FINGER_UP);
                   if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
                     _evas_event_source_mouse_up_events(eo_obj, eo_e, evt, event_id);
                   if (e->delete_me) break;
@@ -1796,8 +1784,6 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_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, evt,
                                                        event_id, EFL_EVENT_POINTER_MOVE);
-                       evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
-                                                       event_id, EFL_EVENT_FINGER_MOVE);
                        if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
                          _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
                     }
@@ -1881,8 +1867,6 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
                        ev->action = EFL_POINTER_ACTION_MOVE;
                        evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
                                                        event_id, EFL_EVENT_POINTER_MOVE);
-                       evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
-                                                       event_id, EFL_EVENT_FINGER_MOVE);
                        if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
                          _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
                     }
@@ -2013,8 +1997,6 @@ nogrep:
                        ev->action = EFL_POINTER_ACTION_MOVE;
                        evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
                                                        event_id, EFL_EVENT_POINTER_MOVE);
-                       evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
-                                                       event_id, EFL_EVENT_FINGER_MOVE);
                        if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
                          _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, event_id);
                     }