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
This commit is contained in:
Jean-Philippe Andre 2016-08-31 11:33:20 +09:00
parent 9452acd126
commit f88a4b8308
2 changed files with 24 additions and 26 deletions

View 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)

View 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);
}