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.
This commit is contained in:
Rafael Antognolli 2013-05-03 15:43:31 -03:00
parent f769128dca
commit f09e493bc2
6 changed files with 89 additions and 17 deletions

View File

@ -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().

View File

@ -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

View File

@ -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.
*

View File

@ -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)
{

View File

@ -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."),

View File

@ -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);