From f09e493bc2bb9fed67b2d6e2faa4f19142394191 Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Fri, 3 May 2013 15:43:31 -0300 Subject: [PATCH] evas/events: Add evas_event_input_mouse_move(). This function should be used internally by the input system (Ecore_Evas_Input) to feed Evas with move events. The x,y event info is relative to the base of the window/surface, instead of the 0,0 of the canvas. This case only happens for now under Wayland, where the 0,0 of the canvas is translated due to the window decorations that are drawn by the client. --- ChangeLog | 4 ++ src/lib/evas/Evas_Eo.h | 16 ++++++++ src/lib/evas/Evas_Legacy.h | 21 ++++++++++ src/lib/evas/canvas/evas_events.c | 62 +++++++++++++++++++++-------- src/lib/evas/canvas/evas_main.c | 2 + src/lib/evas/include/evas_private.h | 1 + 6 files changed, 89 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index 57f9c1a156..515d66d73b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2013-04-03 Rafael Antognolli + + * Evas: Added evas_event_input_mouse_move() for internal use only. + 2013-04-29 ChunEon Park (Hermet) * Evas: Added evas_object_image_source_clip_set()/get(). diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index bacdbfea0d..e2a6965eed 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -185,6 +185,7 @@ enum EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_UP, EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_CANCEL, EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_WHEEL, + EVAS_CANVAS_SUB_ID_EVENT_INPUT_MOUSE_MOVE, EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_MOVE, EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_IN, EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_OUT, @@ -890,6 +891,21 @@ enum */ #define evas_canvas_event_feed_mouse_wheel(direction, z, timestamp, data) EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_WHEEL), EO_TYPECHECK(int, direction), EO_TYPECHECK(int, z), EO_TYPECHECK(unsigned int, timestamp), EO_TYPECHECK(const void *, data) +/** + * @def evas_canvas_event_input_mouse_move + * @since 1.8 + * + * Mouse move event feed from input. + * + * @param[in] x + * @param[in] y + * @param[in] timestamp + * @param[in] data + * + * @see evas_event_input_mouse_move + */ +#define evas_canvas_event_input_mouse_move(x, y, timestamp, data) EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_INPUT_MOUSE_MOVE), EO_TYPECHECK(int, x), EO_TYPECHECK(int, y), EO_TYPECHECK(unsigned int, timestamp), EO_TYPECHECK(const void *, data) + /** * @def evas_canvas_event_feed_mouse_move * @since 1.8 diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h index 7c282bcb12..8e59c9c820 100644 --- a/src/lib/evas/Evas_Legacy.h +++ b/src/lib/evas/Evas_Legacy.h @@ -1104,6 +1104,27 @@ EAPI void evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, un */ EAPI void evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1); +/** + * Mouse move event feed from input. + * + * @param e The given canvas pointer. + * @param x The horizontal position of the mouse pointer relative to the 0,0 of + * the window/surface. + * @param y The vertical position of the mouse pointer relative to the 0,0 of + * the window/surface. + * @param timestamp The timestamp of the mouse move event. + * @param data The data for canvas. + * + * Similar to the evas_event_feed_mouse_move(), this function will inform Evas + * about mouse move events which were received by the input system, relative to + * the 0,0 of the window, not to the canvas 0,0. It will take care of doing any + * special transformation like adding the framespace offset to the mouse event. + * + * @since 1.8 + * @see evas_event_feed_mouse_move + */ +EAPI void evas_event_input_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data) EINA_ARG_NONNULL(1); + /** * Mouse move event feed. * diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 7f71ddaf70..db70fa4e22 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -1487,24 +1487,9 @@ _canvas_event_feed_mouse_wheel(Eo *eo_e, void *_pd, va_list *list) _evas_unwalk(e); } -EAPI void -evas_event_feed_mouse_move(Evas *eo_e, int x, int y, unsigned int timestamp, const void *data) +static void +_canvas_event_feed_mouse_move_internal(Eo *eo_e, void *_pd, int x, int y, unsigned int timestamp, const void *data) { - MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); - return; - MAGIC_CHECK_END(); - - eo_do(eo_e, evas_canvas_event_feed_mouse_move(x, y, timestamp, data)); -} - -void -_canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list) -{ - int x = va_arg(*list, int); - int y = va_arg(*list, int); - unsigned int timestamp = va_arg(*list, unsigned int); - const void *data = va_arg(*list, const void *); - Evas_Public_Data *e = _pd; Evas_Object *nogrep_obj = NULL; int px, py; @@ -2009,6 +1994,49 @@ nogrep: _evas_unwalk(e); } +EAPI void +evas_event_input_mouse_move(Evas *eo_e, int x, int y, unsigned int timestamp, const void *data) +{ + MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + eo_do(eo_e, evas_canvas_event_input_mouse_move(x, y, timestamp, data)); +} + +void +_canvas_event_input_mouse_move(Eo *eo_e, void *_pd, va_list *list) +{ + int x = va_arg(*list, int); + int y = va_arg(*list, int); + unsigned int timestamp = va_arg(*list, unsigned int); + const void *data = va_arg(*list, const void *); + Evas_Public_Data *e = _pd; + + _canvas_event_feed_mouse_move_internal(eo_e, _pd, x - e->framespace.x, y - e->framespace.y, timestamp, data); +} + +EAPI void +evas_event_feed_mouse_move(Evas *eo_e, int x, int y, unsigned int timestamp, const void *data) +{ + MAGIC_CHECK(eo_e, Evas, MAGIC_EVAS); + return; + MAGIC_CHECK_END(); + + eo_do(eo_e, evas_canvas_event_feed_mouse_move(x, y, timestamp, data)); +} + +void +_canvas_event_feed_mouse_move(Eo *eo_e, void *_pd, va_list *list) +{ + int x = va_arg(*list, int); + int y = va_arg(*list, int); + unsigned int timestamp = va_arg(*list, unsigned int); + const void *data = va_arg(*list, const void *); + + _canvas_event_feed_mouse_move_internal(eo_e, _pd, x, y, timestamp, data); +} + EAPI void evas_event_feed_mouse_in(Evas *eo_e, unsigned int timestamp, const void *data) { diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index beebbb3926..4d7ab7a6a0 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -1038,6 +1038,7 @@ _class_constructor(Eo_Class *klass) EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_UP), _canvas_event_feed_mouse_up), EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_CANCEL), _canvas_event_feed_mouse_cancel), EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_WHEEL), _canvas_event_feed_mouse_wheel), + EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_INPUT_MOUSE_MOVE), _canvas_event_input_mouse_move), EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_MOVE), _canvas_event_feed_mouse_move), EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_IN), _canvas_event_feed_mouse_in), EO_OP_FUNC(EVAS_CANVAS_ID(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_OUT), _canvas_event_feed_mouse_out), @@ -1138,6 +1139,7 @@ static const Eo_Op_Description op_desc[] = { EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_UP, "Mouse up event feed."), EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_CANCEL, "Mouse cancel event feed."), EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_WHEEL, "Mouse wheel event feed."), + EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_INPUT_MOUSE_MOVE, "Mouse move event fed from input (only Ecore_Evas_Input should use it)."), EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_MOVE, "Mouse move event feed."), EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_IN, "Mouse in event feed."), EO_OP_DESCRIPTION(EVAS_CANVAS_SUB_ID_EVENT_FEED_MOUSE_OUT, "Mouse out event feed."), diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 61818a4297..b1f6d56ef3 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1131,6 +1131,7 @@ void _canvas_event_feed_mouse_down(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_up(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_cancel(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_wheel(Eo *e, void *_pd, va_list *list); +void _canvas_event_input_mouse_move(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_move(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_in(Eo *e, void *_pd, va_list *list); void _canvas_event_feed_mouse_out(Eo *e, void *_pd, va_list *list);