jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=7f724f6c5db1127a6dd5786791f495b58910e9a9
commit 7f724f6c5db1127a6dd5786791f495b58910e9a9 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Mon Jul 10 14:21:13 2017 +0900 evas: Fix mouse event info in global events When using the legacy API (and in fact also with the EO API) to listen to mouse events (move, in, out...) on a window instead of an actual evas object, some information was missing: - buttons (bitmask of pressed buttons) - prev.x/y (previous position) This is because Evas had not handled the event yet at this point, it was coming directly from ecore_evas with incomplete information. This patch involves evas a little bit earlier, and also fixes evas_events_legacy.c to have consistent values for cur/prev canvas/ouput coordinates. See also 890a91785 and 484dae76e675318. Those commits were making the pointer coord a seat-based property (instead of canvas-based) but the event should already have those proper values before converting to a legacy struct. This patch restores the meaning of the DUP macros, as I observed 4 different coordinates from the app side (instead of just 2: prev and cur). Thanks to Andy for reporting the original issue on the ML! --- src/lib/ecore_evas/ecore_evas.c | 7 ++++++ src/lib/evas/Evas_Internal.h | 1 + src/lib/evas/canvas/efl_input_pointer.c | 39 ++++++++++++++++++++++++-------- src/lib/evas/canvas/evas_events_legacy.c | 10 +++----- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index b6d82c55f9..280e82d609 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -3481,6 +3481,8 @@ _ecore_evas_mouse_move_process_internal(Ecore_Evas *ee, ev->timestamp = timestamp; ev->cur.x = evt_x; ev->cur.y = evt_y; + efl_input_pointer_finalize(evt); + efl_event_callback_legacy_call(ee->evas, _event_description_get(ev->action), evt); efl_del(evt); @@ -4640,6 +4642,7 @@ _direct_mouse_updown(Ecore_Evas *ee, const Ecore_Event_Mouse_Button *info, Efl_P ev->angle = info->multi.angle - ee->rotation; if (info->dev) ev->device = efl_ref(info->dev); else ev->device = efl_ref(evas_default_device_get(e, EFL_INPUT_DEVICE_TYPE_MOUSE)); + efl_input_pointer_finalize(evt); efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt); processed = ev->evas_done; @@ -4701,6 +4704,7 @@ _direct_mouse_move_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Move *info) ev->angle = info->multi.angle - ee->rotation; if (info->dev) ev->device = efl_ref(info->dev); else ev->device = efl_ref(evas_default_device_get(e, EFL_INPUT_DEVICE_TYPE_MOUSE)); + efl_input_pointer_finalize(evt); efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt); processed = ev->evas_done; @@ -4735,6 +4739,7 @@ _direct_mouse_wheel_cb(Ecore_Evas *ee, const Ecore_Event_Mouse_Wheel *info) ev->wheel.dir = info->direction ? EFL_ORIENT_HORIZONTAL : EFL_ORIENT_VERTICAL; if (info->dev) ev->device = efl_ref(info->dev); else ev->device = efl_ref(evas_default_device_get(e, EFL_INPUT_DEVICE_TYPE_MOUSE)); + efl_input_pointer_finalize(evt); efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt); processed = ev->evas_done; @@ -4764,6 +4769,7 @@ _direct_mouse_inout(Ecore_Evas *ee, const Ecore_Event_Mouse_IO *info, Efl_Pointe _pointer_position_set(ev, ee, info->x, info->y, info->x, info->y); if (info->dev) ev->device = efl_ref(info->dev); else ev->device = efl_ref(evas_default_device_get(e, EFL_INPUT_DEVICE_TYPE_MOUSE)); + efl_input_pointer_finalize(evt); efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt); processed = ev->evas_done; @@ -4893,6 +4899,7 @@ _direct_axis_update_cb(Ecore_Evas *ee, const Ecore_Event_Axis_Update *info) _pointer_position_set(ev, ee, x, y, x, y); if (info->dev) ev->device = efl_ref(info->dev); else ev->device = efl_ref(evas_default_device_get(e, EFL_INPUT_DEVICE_TYPE_MOUSE)); + efl_input_pointer_finalize(evt); efl_event_callback_legacy_call(e, _event_description_get(ev->action), evt); processed = ev->evas_done; diff --git a/src/lib/evas/Evas_Internal.h b/src/lib/evas/Evas_Internal.h index 47aeb0e55d..28702ef65c 100644 --- a/src/lib/evas/Evas_Internal.h +++ b/src/lib/evas/Evas_Internal.h @@ -46,6 +46,7 @@ EAPI Evas_Engine_Info *efl_canvas_output_engine_info_get(Efl_Canvas_Output *outp EAPI Eina_Bool efl_canvas_output_lock(Efl_Canvas_Output *output); EAPI Eina_Bool efl_canvas_output_unlock(Efl_Canvas_Output *output); +EAPI void efl_input_pointer_finalize(Efl_Input_Pointer *obj); /* Internal EO APIs */ EOAPI void efl_canvas_object_legacy_ctor(Eo *obj); diff --git a/src/lib/evas/canvas/efl_input_pointer.c b/src/lib/evas/canvas/efl_input_pointer.c index 01a20c1841..5b720925f8 100644 --- a/src/lib/evas/canvas/efl_input_pointer.c +++ b/src/lib/evas/canvas/efl_input_pointer.c @@ -46,13 +46,13 @@ _del_hook(Eo *evt) } } -EOLIAN static Efl_Input_Pointer * +/* internal eo */ +static Efl_Input_Pointer * _efl_input_pointer_efl_input_event_instance_get(Eo *klass EINA_UNUSED, void *_pd EINA_UNUSED, Eo *owner, void **priv) { Efl_Input_Pointer_Data *ev; Efl_Input_Pointer *evt; - Evas *evas; if (s_cached_event) { @@ -70,17 +70,36 @@ _efl_input_pointer_efl_input_event_instance_get(Eo *klass EINA_UNUSED, void *_pd ev->fake = EINA_FALSE; if (priv) *priv = ev; - evas = efl_provider_find(owner, EVAS_CANVAS_CLASS); - if (evas) - { - Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS); - ev->modifiers = &e->modifiers; - ev->locks = &e->locks; - } - return evt; } +EAPI void +efl_input_pointer_finalize(Efl_Input_Pointer *obj) +{ + const Evas_Pointer_Data *pdata; + Efl_Input_Pointer_Data *ev; + Evas_Public_Data *evas; + Evas *eo_evas; + + ev = efl_data_scope_safe_get(obj, MY_CLASS); + EINA_SAFETY_ON_NULL_RETURN(ev); + + eo_evas = efl_provider_find(obj, EVAS_CANVAS_CLASS); + evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS); + if (!evas) return; + + /* FIXME: modifiers & locks should be seat-based! */ + ev->modifiers = &evas->modifiers; + ev->locks = &evas->locks; + + pdata = _evas_pointer_data_by_device_get(evas, ev->device); + if (!pdata) return; + + ev->prev.x = pdata->seat->x; + ev->prev.y = pdata->seat->y; + ev->pressed_buttons = pdata->button; +} + EOLIAN static void _efl_input_pointer_class_destructor(Efl_Class *klass EINA_UNUSED) { diff --git a/src/lib/evas/canvas/evas_events_legacy.c b/src/lib/evas/canvas/evas_events_legacy.c index e7cd5d742e..f87cf94c5a 100644 --- a/src/lib/evas/canvas/evas_events_legacy.c +++ b/src/lib/evas/canvas/evas_events_legacy.c @@ -37,19 +37,15 @@ efl_input_pointer_legacy_info_fill(Evas *eo_evas, Efl_Input_Key *eo_ev, Evas_Cal { Efl_Input_Pointer_Data *ev = efl_data_scope_get(eo_ev, EFL_INPUT_POINTER_CLASS); Evas_Public_Data *evas; - Evas_Pointer_Data *pdata; if (!ev) return NULL; if (!eo_evas) eo_evas = efl_provider_find(eo_ev, EVAS_CANVAS_CLASS); evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS); if (!evas) return NULL; - pdata = _evas_pointer_data_by_device_get(evas, ev->device); - EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL); - -#define COORD_DUP(e) do { (e)->output.x = pdata->seat->x; (e)->output.y = pdata->seat->y; } while (0) -#define COORD_DUP_CUR(e) do { (e)->cur.output.x = pdata->seat->x; (e)->cur.output.y = pdata->seat->y; } while (0) -#define COORD_DUP_PREV(e) do { (e)->prev.output.x = pdata->seat->prev.x; (e)->prev.output.y = pdata->seat->prev.y; } while (0) +#define COORD_DUP(e) do { (e)->output.x = (e)->canvas.x; (e)->output.y = (e)->canvas.y; } while (0) +#define COORD_DUP_CUR(e) do { (e)->cur.output.x = (e)->cur.canvas.x; (e)->cur.output.y = (e)->cur.canvas.y; } while (0) +#define COORD_DUP_PREV(e) do { (e)->prev.output.x = (e)->prev.canvas.x; (e)->prev.output.y = (e)->prev.canvas.y; } while (0) #define TYPE_CHK(typ) do { if ((type != EVAS_CALLBACK_LAST) && (type != EVAS_CALLBACK_ ## typ)) return NULL; } while (0) switch (ev->action) --