From: Jean-Philippe Andre Date: Wed, 31 Aug 2016 02:33:20 +0000 (+0900) Subject: evas events: Fix repeated calls to mouse callbacks X-Git-Tag: upstream/1.20.0~4553 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f88a4b8308a45889960eb842ff0300ce9079d755;p=platform%2Fupstream%2Fefl.git 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 --- 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); }