jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f88a4b8308a45889960eb842ff0300ce9079d755

commit f88a4b8308a45889960eb842ff0300ce9079d755
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Wed Aug 31 11:33:20 2016 +0900

    evas events: Fix repeated calls to mouse callbacks
    
    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 | 32 ++++++++++++++++++++++++--------
 src/lib/evas/canvas/evas_events.c    | 18 ------------------
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/src/lib/evas/canvas/evas_callbacks.c 
b/src/lib/evas/canvas/evas_callbacks.c
index 7fd6ff1..7842e7c 100644
--- a/src/lib/evas/canvas/evas_callbacks.c
+++ b/src/lib/evas/canvas/evas_callbacks.c
@@ -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)
diff --git a/src/lib/evas/canvas/evas_events.c 
b/src/lib/evas/canvas/evas_events.c
index 1238d51..63e4573 100644
--- a/src/lib/evas/canvas/evas_events.c
+++ b/src/lib/evas/canvas/evas_events.c
@@ -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);
                     }

-- 


Reply via email to