forked from enlightenment/efl
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:
parent
9452acd126
commit
f88a4b8308
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue