Evas events: Forward more pointer events

This continues the work started in the previous commit:
forward full event info (Efl_Pointer_Event) from evas to
the upper layers.

This also includes more support for IN and OUT.
This commit is contained in:
Jean-Philippe Andre 2016-05-27 16:21:13 +09:00
parent 37d894abb1
commit 7658ed7ae3
4 changed files with 288 additions and 117 deletions

View File

@ -375,6 +375,7 @@ struct _Evas_Event_Mouse_Down /** Mouse button press event */
Evas_Event_Flags event_flags;
Evas_Device *dev;
Evas_Object *event_src; /**< The Evas Object which actually triggered the event, used in cases of proxy event propagation */
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Mouse_Up /** Mouse button release event */
@ -393,6 +394,7 @@ struct _Evas_Event_Mouse_Up /** Mouse button release event */
Evas_Event_Flags event_flags;
Evas_Device *dev;
Evas_Object *event_src; /**< The Evas Object which actually triggered the event, used in cases of proxy event propagation */
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Mouse_In /** Mouse enter event */
@ -409,6 +411,7 @@ struct _Evas_Event_Mouse_In /** Mouse enter event */
Evas_Event_Flags event_flags;
Evas_Device *dev;
Evas_Object *event_src; /**< The Evas Object which actually triggered the event, used in cases of proxy event propagation */
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Mouse_Out /** Mouse leave event */
@ -425,6 +428,7 @@ struct _Evas_Event_Mouse_Out /** Mouse leave event */
Evas_Event_Flags event_flags;
Evas_Device *dev;
Evas_Object *event_src; /**< The Evas Object which actually triggered the event, used in cases of proxy event propagation */
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Mouse_Move /** Mouse move event */
@ -441,7 +445,7 @@ struct _Evas_Event_Mouse_Move /** Mouse move event */
Evas_Event_Flags event_flags;
Evas_Device *dev;
Evas_Object *event_src; /**< The Evas Object which actually triggered the event, used in cases of proxy event propagation */
void *reserved; /* internal use only */
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Mouse_Wheel /** Wheel event */
@ -458,6 +462,7 @@ struct _Evas_Event_Mouse_Wheel /** Wheel event */
unsigned int timestamp;
Evas_Event_Flags event_flags;
Evas_Device *dev;
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Multi_Down /** Multi button press event */
@ -477,6 +482,7 @@ struct _Evas_Event_Multi_Down /** Multi button press event */
unsigned int timestamp;
Evas_Event_Flags event_flags;
Evas_Device *dev;
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Multi_Up /** Multi button release event */
@ -496,6 +502,7 @@ struct _Evas_Event_Multi_Up /** Multi button release event */
unsigned int timestamp;
Evas_Event_Flags event_flags;
Evas_Device *dev;
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Multi_Move /** Multi button down event */
@ -512,6 +519,7 @@ struct _Evas_Event_Multi_Move /** Multi button down event */
unsigned int timestamp;
Evas_Event_Flags event_flags;
Evas_Device *dev;
void *reserved; /**< Reserved field for internal use only. @since 1.18 */
};
struct _Evas_Event_Key_Down /** Key press event */

View File

@ -62,13 +62,26 @@ static inline void *
_pointer_event_get(const _eo_evas_object_cb_info *info, const Eo_Event *event)
{
if (!info->data) return NULL;
/* See also evas_events.c: _pointer_event_create() */
#define EV_CASE(TYPE, Type) \
case EVAS_CALLBACK_ ## TYPE: return ((Evas_Event_ ## Type *) event->info)->reserved
switch (info->type)
{
case EVAS_CALLBACK_MOUSE_MOVE:
return ((Evas_Event_Mouse_Move *) event->info)->reserved;
default:
return NULL;
EV_CASE(MOUSE_MOVE, Mouse_Move);
EV_CASE(MOUSE_OUT, Mouse_Out);
EV_CASE(MOUSE_IN, Mouse_In);
EV_CASE(MOUSE_DOWN, Mouse_Down);
EV_CASE(MOUSE_UP, Mouse_Up);
EV_CASE(MULTI_MOVE, Multi_Move);
EV_CASE(MULTI_DOWN, Multi_Down);
EV_CASE(MULTI_UP, Multi_Up);
EV_CASE(MOUSE_WHEEL, Mouse_Wheel);
default: return NULL;
}
#undef EV_CASE
}
static Eina_Bool

View File

@ -13,6 +13,14 @@ static Eina_List *
evas_event_list_copy(Eina_List *list);
static void
_canvas_event_feed_multi_up_internal(Evas *eo_e, void *_pd, int d, int x, int y,
double rad, double radx, double rady, double pres, double ang,
double fx, double fy, Evas_Button_Flags flags,
unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe);
static void
_evas_event_havemap_adjust(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Evas_Coord *x, Evas_Coord *y, Eina_Bool mouse_grabbed)
{
@ -41,76 +49,51 @@ _pointer_event_create(Evas_Callback_Type type, void *ev,
Efl_Pointer_Event_Data **evdata)
{
Efl_Pointer_Event *evt = NULL;
Efl_Pointer_Event *pev = parentev ? parentev->eo : NULL;
if (!ev) return NULL;
/* This function converts an existing evas info struct to the efl pointer
* event. All pointers must be valid.
*
* See also evas_callbacks.c: _pointer_event_get()
*
* FIXME: evas event logic should not use legacy structs anymore... this
* should be temporary code. Should be.
*/
#define EV_CASE(TYPE, Type) \
case EVAS_CALLBACK_ ## TYPE: \
evt = efl_pointer_event_instance_get(EFL_POINTER_EVENT_CLASS, \
parentev ? parentev->eo : NULL, (void **) evdata); \
efl_pointer_event_legacy_info_set(evt, ev, type); \
((Evas_Event_ ## Type *) ev)->reserved = evt; \
break;
switch (type)
{
case EVAS_CALLBACK_MOUSE_MOVE:
evt = efl_pointer_event_instance_get(EFL_POINTER_EVENT_CLASS, pev, (void **) evdata);
efl_pointer_event_legacy_info_set(evt, ev, type);
((Evas_Event_Mouse_Move *) ev)->reserved = evt;
break;
EV_CASE(MOUSE_MOVE, Mouse_Move);
EV_CASE(MOUSE_OUT, Mouse_Out);
EV_CASE(MOUSE_IN, Mouse_In);
EV_CASE(MOUSE_DOWN, Mouse_Down);
EV_CASE(MOUSE_UP, Mouse_Up);
EV_CASE(MULTI_MOVE, Multi_Move);
EV_CASE(MULTI_DOWN, Multi_Down);
EV_CASE(MULTI_UP, Multi_Up);
EV_CASE(MOUSE_WHEEL, Mouse_Wheel);
default:
DBG("Support for event type %d not implemented yet.", type);
break;
}
#undef EV_CASE
if (!evt && evdata) *evdata = NULL;
return evt;
}
static inline void
_pointer_event_adjust(Evas_Callback_Type type, void *ev,
Efl_Pointer_Event_Data *evdata)
{
if (!evdata) return;
/* FIXME: remove OR 1 */
#if defined(DEBUG) || 1
# define CHKACT(a) do { if (evdata->action != EFL_POINTER_ACTION_ ## a) abort(); } while (0)
#else
# define CHKACT(a) do {} while(0)
#endif
switch (type)
{
case EVAS_CALLBACK_MOUSE_MOVE:
CHKACT(MOVE);
evdata->cur.x = ((Evas_Event_Mouse_Move *) ev)->cur.canvas.x;
evdata->cur.y = ((Evas_Event_Mouse_Move *) ev)->cur.canvas.y;
evdata->cur.xsub = ((Evas_Event_Mouse_Move *) ev)->cur.canvas.x;
evdata->cur.ysub = ((Evas_Event_Mouse_Move *) ev)->cur.canvas.y;
break;
case EVAS_CALLBACK_MOUSE_OUT:
CHKACT(OUT);
evdata->cur.x = ((Evas_Event_Mouse_Out *) ev)->canvas.x;
evdata->cur.y = ((Evas_Event_Mouse_Out *) ev)->canvas.y;
evdata->cur.xsub = ((Evas_Event_Mouse_Out *) ev)->canvas.x;
evdata->cur.ysub = ((Evas_Event_Mouse_Out *) ev)->canvas.y;
break;
case EVAS_CALLBACK_MOUSE_IN:
CHKACT(IN);
evdata->cur.x = ((Evas_Event_Mouse_In *) ev)->canvas.x;
evdata->cur.y = ((Evas_Event_Mouse_In *) ev)->canvas.y;
evdata->cur.xsub = ((Evas_Event_Mouse_In *) ev)->canvas.x;
evdata->cur.ysub = ((Evas_Event_Mouse_In *) ev)->canvas.y;
break;
default: break;
}
}
#define EV_CALL(_eo_obj, _obj, _typ, _ev, _id, _pe) do { \
if (!_pe) _pe = _pointer_event_create(_typ, _ev, parent_pe, & _pe ## data); \
else _pointer_event_adjust(_typ, _ev, _pe ## data); \
else efl_pointer_event_legacy_info_set(_pe, _ev, _typ); \
evas_object_event_callback_call(_eo_obj, _obj, _typ, _ev, _id); \
} while (0)
#define EV_DEL(a) do { eo_unref(a); a = NULL; } while (0)
@ -1091,10 +1074,14 @@ evas_event_thaw_eval(Evas *eo_e)
}
}
EAPI void
evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
static void
_canvas_event_feed_mouse_down_internal(Eo *eo_e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Eina_List *l, *copy;
Evas_Event_Mouse_Down ev;
Evas_Object *eo_obj;
@ -1169,10 +1156,7 @@ evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned in
ev.canvas.x = e->pointer.x;
ev.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_DOWN, &ev,
event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, &ev, event_id, pe);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
_evas_event_source_mouse_down_events(eo_obj, eo_e, &ev,
event_id);
@ -1187,6 +1171,13 @@ evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned in
_evas_touch_point_update(eo_e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_down_internal(eo_e, b, flags, timestamp, data, NULL);
}
static int
@ -1314,10 +1305,14 @@ _post_up_handle(Evas *eo_e, unsigned int timestamp, const void *data)
return post_called;
}
EAPI void
evas_event_feed_mouse_up(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
static void
_canvas_event_feed_mouse_up_internal(Eo *eo_e, int b, Evas_Button_Flags flags,
unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Eina_List *l, *copy;
INF("ButtonEvent:up time=%u x=%d y=%d button=%d downs=%d", timestamp, e->pointer.x, e->pointer.y, b, e->pointer.downs);
@ -1376,9 +1371,7 @@ evas_event_feed_mouse_up(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x,
&ev.canvas.y,
obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_UP,
&ev, event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id, pe);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
_evas_event_source_mouse_up_events(eo_obj, eo_e, &ev,
event_id);
@ -1411,10 +1404,18 @@ evas_event_feed_mouse_up(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int
_evas_touch_point_remove(eo_e, 0);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
evas_event_feed_mouse_cancel(Eo *eo_e, unsigned int timestamp, const void *data)
evas_event_feed_mouse_up(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_up_internal(eo_e, b, flags, timestamp, data, NULL);
}
static void
_canvas_event_feed_mouse_cancel_internal(Eo *eo_e, unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Evas_Coord_Touch_Point *point;
@ -1432,23 +1433,33 @@ evas_event_feed_mouse_cancel(Eo *eo_e, unsigned int timestamp, const void *data)
for (i = 0; i < 32; i++)
{
if ((e->pointer.button & (1 << i)))
evas_event_feed_mouse_up(eo_e, i + 1, 0, timestamp, data);
_canvas_event_feed_mouse_up_internal(eo_e, i + 1, 0, timestamp, data, parent_pe);
}
EINA_LIST_FOREACH_SAFE(e->touch_points, l, ll, point)
{
if ((point->state == EVAS_TOUCH_POINT_DOWN) ||
(point->state == EVAS_TOUCH_POINT_MOVE))
evas_event_feed_multi_up(eo_e, point->id, point->x, point->y,
0, 0, 0, 0, 0, 0, 0, 0, timestamp, data);
_canvas_event_feed_multi_up_internal(eo_e, e, point->id, point->x, point->y,
0, 0, 0, 0, 0, 0, 0, 0, timestamp, data, NULL);
}
evas_event_default_flags_set(eo_e, flags);
_evas_unwalk(e);
}
EAPI void
evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timestamp, const void *data)
evas_event_feed_mouse_cancel(Eo *eo_e, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_cancel_internal(eo_e, timestamp, data, NULL);
}
static void
_canvas_event_feed_mouse_wheel_internal(Eo *eo_e, int direction, int z,
unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Eina_List *l, *copy;
Evas_Event_Mouse_Wheel ev;
Evas_Object *eo_obj;
@ -1486,9 +1497,7 @@ evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timesta
ev.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y,
obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_WHEEL, &ev,
event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id, pe);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
_evas_event_source_wheel_events(eo_obj, eo_e, &ev, event_id);
if (e->delete_me || e->is_frozen) break;
@ -1499,6 +1508,13 @@ evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timesta
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_wheel_internal(eo_e, direction, z, timestamp, data, NULL);
}
static void
@ -2006,10 +2022,13 @@ evas_event_feed_mouse_move(Eo *eo_e, int x, int y, unsigned int timestamp, const
_canvas_event_feed_mouse_move_internal(eo_e, e, x, y, timestamp, data, NULL);
}
EAPI void
evas_event_feed_mouse_in(Eo *eo_e, unsigned int timestamp, const void *data)
static void
_canvas_event_feed_mouse_in_internal(Eo *eo_e, unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Eina_List *ins;
Eina_List *l;
Evas_Event_Mouse_In ev;
@ -2053,9 +2072,7 @@ evas_event_feed_mouse_in(Eo *eo_e, unsigned int timestamp, const void *data)
ev.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y,
obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_IN, &ev,
event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id, pe);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
_evas_event_source_mouse_in_events(eo_obj, eo_e, &ev, event_id);
if (e->delete_me || e->is_frozen) break;
@ -2069,12 +2086,22 @@ evas_event_feed_mouse_in(Eo *eo_e, unsigned int timestamp, const void *data)
evas_event_feed_mouse_move(eo_e, e->pointer.x, e->pointer.y, timestamp, data);
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
evas_event_feed_mouse_out(Eo *eo_e, unsigned int timestamp, const void *data)
evas_event_feed_mouse_in(Eo *eo_e, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_in_internal(eo_e, timestamp, data, NULL);
}
static void
_canvas_event_feed_mouse_out_internal(Eo *eo_e, unsigned int timestamp, const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Evas_Event_Mouse_Out ev;
int event_id = 0;
@ -2117,9 +2144,7 @@ evas_event_feed_mouse_out(Eo *eo_e, unsigned int timestamp, const void *data)
ev.canvas.y = e->pointer.y;
_evas_event_havemap_adjust(eo_obj, obj, &ev.canvas.x, &ev.canvas.y,
obj->mouse_grabbed);
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MOUSE_OUT, &ev,
event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id, pe);
if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
_evas_event_source_mouse_out_events(eo_obj, eo_e, &ev, event_id);
if (e->delete_me || e->is_frozen) break;
@ -2134,6 +2159,13 @@ evas_event_feed_mouse_out(Eo *eo_e, unsigned int timestamp, const void *data)
_evas_post_event_callback_call(eo_e, e);
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
evas_event_feed_mouse_out(Eo *eo_e, unsigned int timestamp, const void *data)
{
_canvas_event_feed_mouse_out_internal(eo_e, timestamp, data, NULL);
}
static void
@ -2143,11 +2175,13 @@ _canvas_event_feed_multi_down_internal(Evas *eo_e, void *_pd,
double pres, double ang,
double fx, double fy,
Evas_Button_Flags flags, unsigned int timestamp,
const void *data)
const void *data, Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = _pd;
Eina_List *l, *copy;
Evas_Event_Multi_Down ev;
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Evas_Object *eo_obj;
int addgrab = 0;
int event_id = 0;
@ -2210,9 +2244,7 @@ _canvas_event_feed_multi_down_internal(Evas *eo_e, void *_pd,
ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
if (y != ev.canvas.y)
ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
evas_object_event_callback_call(eo_obj, obj,
EVAS_CALLBACK_MULTI_DOWN, &ev,
event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id, pe);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
_evas_event_source_multi_down_events(eo_obj, eo_e, &ev, event_id);
if (e->delete_me || e->is_frozen) break;
@ -2224,6 +2256,7 @@ _canvas_event_feed_multi_down_internal(Evas *eo_e, void *_pd,
_evas_touch_point_update(eo_e, d, x, y, EVAS_TOUCH_POINT_STILL);
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
@ -2234,7 +2267,7 @@ evas_event_input_multi_down(Eo *eo_e, int d, int x, int y, double rad, double ra
x - e->framespace.x,
y - e->framespace.y,
rad, radx, rady, pres, ang,
fx, fy, flags, timestamp, data);
fx, fy, flags, timestamp, data, NULL);
}
EAPI void
@ -2243,7 +2276,7 @@ evas_event_feed_multi_down(Eo *eo_e, int d, int x, int y, double rad, double rad
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
_canvas_event_feed_multi_down_internal(eo_e, e,
d, x, y, rad, radx, rady, pres, ang,
fx, fy, flags, timestamp, data);
fx, fy, flags, timestamp, data, NULL);
}
static void
@ -2254,8 +2287,11 @@ _canvas_event_feed_multi_up_internal(Evas *eo_e, void *_pd,
double fx, double fy,
Evas_Button_Flags flags,
unsigned int timestamp,
const void *data)
const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
Evas_Public_Data *e = _pd;
Eina_List *l, *copy;
Evas_Event_Multi_Up ev;
@ -2315,8 +2351,7 @@ _canvas_event_feed_multi_up_internal(Evas *eo_e, void *_pd,
obj->mouse_grabbed--;
e->pointer.mouse_grabbed--;
}
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP,
&ev, event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id, pe);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
_evas_event_source_multi_up_events(eo_obj, eo_e, &ev, event_id);
if (e->delete_me || e->is_frozen) break;
@ -2328,6 +2363,7 @@ _canvas_event_feed_multi_up_internal(Evas *eo_e, void *_pd,
_evas_touch_point_remove(eo_e, d);
if (ev.dev) eo_unref(ev.dev);
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
@ -2339,7 +2375,7 @@ evas_event_input_multi_up(Eo *eo_e, int d, int x, int y, double rad, double radx
y - e->framespace.y,
rad, radx, rady,
pres, ang, fx, fy, flags, timestamp,
data);
data, NULL);
}
EAPI void
@ -2347,7 +2383,7 @@ evas_event_feed_multi_up(Eo *eo_e, int d, int x, int y, double rad, double radx,
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
_canvas_event_feed_multi_up_internal(eo_e, e, d, x, y, rad, radx, rady,
pres, ang, fx, fy, flags, timestamp, data);
pres, ang, fx, fy, flags, timestamp, data, NULL);
}
static void
@ -2356,9 +2392,12 @@ _canvas_event_feed_multi_move_internal(Eo *eo_e, void *_pd, int d, int x,
double rady, double pres, double ang,
double fx, double fy,
unsigned int timestamp,
const void *data)
const void *data,
Efl_Pointer_Event_Data *parent_pe)
{
Evas_Public_Data *e = _pd;
Efl_Pointer_Event_Data *pedata = NULL;
Efl_Pointer_Event *pe = NULL;
if (e->is_frozen) return;
e->last_timestamp = timestamp;
@ -2421,7 +2460,7 @@ _canvas_event_feed_multi_move_internal(Eo *eo_e, void *_pd, int d, int x,
ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
if (y != ev.cur.canvas.y)
ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id, pe);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
_evas_event_source_multi_move_events(eo_obj, eo_e, &ev,
event_id);
@ -2496,7 +2535,7 @@ _canvas_event_feed_multi_move_internal(Eo *eo_e, void *_pd, int d, int x,
ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
if (y != ev.cur.canvas.y)
ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
EV_CALL(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id, pe);
if ((obj->proxy->is_proxy) || (obj->proxy->src_events))
_evas_event_source_multi_move_events(eo_obj, eo_e, &ev,
event_id);
@ -2520,6 +2559,7 @@ _canvas_event_feed_multi_move_internal(Eo *eo_e, void *_pd, int d, int x,
if (ev.dev) eo_unref(ev.dev);
}
_evas_unwalk(e);
EV_DEL(pe);
}
EAPI void
@ -2529,7 +2569,7 @@ evas_event_input_multi_move(Eo *eo_e, int d, int x, int y, double rad, double ra
_canvas_event_feed_multi_move_internal(eo_e, e, d,
x - e->framespace.x, y - e->framespace.y,
rad, radx, rady,
pres, ang, fx, fy, timestamp, data);
pres, ang, fx, fy, timestamp, data, NULL);
}
EAPI void
@ -2537,7 +2577,7 @@ evas_event_feed_multi_move(Eo *eo_e, int d, int x, int y, double rad, double rad
{
Evas_Public_Data *e = eo_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
_canvas_event_feed_multi_move_internal(eo_e, e, d, x, y, rad, radx, rady,
pres, ang, fx, fy, timestamp, data);
pres, ang, fx, fy, timestamp, data, NULL);
}
static void
@ -3126,6 +3166,7 @@ _evas_canvas_event_pointer_cb(void *data, const Eo_Event *event)
Efl_Pointer_Event_Data *ev = eo_data_scope_get(event->info, EFL_POINTER_EVENT_CLASS);
Evas_Public_Data *e = data;
Evas *eo_e = event->object;
int dir;
if (!ev) return EO_CALLBACK_CONTINUE;
@ -3149,56 +3190,55 @@ _evas_canvas_event_pointer_cb(void *data, const Eo_Event *event)
ev->radius, ev->radius_x, ev->radius_y,
ev->pressure, ev->angle,
ev->cur.xsub, ev->cur.ysub,
ev->timestamp, ev->data);
ev->timestamp, ev->data, ev);
}
break;
case EFL_POINTER_ACTION_DOWN:
if (ev->finger == 0)
{
evas_event_feed_mouse_down(eo_e, ev->button, ev->button_flags, ev->timestamp, ev->data);
_canvas_event_feed_mouse_down_internal(eo_e, ev->button, ev->button_flags, ev->timestamp, ev->data, ev);
}
else
{
evas_event_feed_multi_down(eo_e, ev->finger, ev->cur.x, ev->cur.y,
ev->radius, ev->radius_x, ev->radius_y,
ev->pressure, ev->angle,
ev->cur.xsub, ev->cur.ysub, ev->button_flags,
ev->timestamp, ev->data);
_canvas_event_feed_multi_down_internal(eo_e, e, ev->finger, ev->cur.x, ev->cur.y,
ev->radius, ev->radius_x, ev->radius_y,
ev->pressure, ev->angle,
ev->cur.xsub, ev->cur.ysub, ev->button_flags,
ev->timestamp, ev->data, ev);
}
break;
case EFL_POINTER_ACTION_UP:
if (ev->finger == 0)
{
evas_event_feed_mouse_up(eo_e, ev->button, ev->button_flags, ev->timestamp, ev->data);
_canvas_event_feed_mouse_up_internal(eo_e, ev->button, ev->button_flags, ev->timestamp, ev->data, ev);
}
else
{
evas_event_feed_multi_up(eo_e, ev->finger, ev->cur.x, ev->cur.y,
ev->radius, ev->radius_x, ev->radius_y,
ev->pressure, ev->angle,
ev->cur.xsub, ev->cur.ysub, ev->button_flags,
ev->timestamp, ev->data);
_canvas_event_feed_multi_up_internal(eo_e, e, ev->finger, ev->cur.x, ev->cur.y,
ev->radius, ev->radius_x, ev->radius_y,
ev->pressure, ev->angle,
ev->cur.xsub, ev->cur.ysub, ev->button_flags,
ev->timestamp, ev->data, ev);
}
break;
case EFL_POINTER_ACTION_CANCEL:
evas_event_feed_mouse_cancel(eo_e, ev->timestamp, ev->data);
_canvas_event_feed_mouse_cancel_internal(eo_e, ev->timestamp, ev->data, ev);
break;
case EFL_POINTER_ACTION_IN:
evas_event_feed_mouse_in(eo_e, ev->timestamp, ev->data);
_canvas_event_feed_mouse_in_internal(eo_e, ev->timestamp, ev->data, ev);
break;
case EFL_POINTER_ACTION_OUT:
evas_event_feed_mouse_out(eo_e, ev->timestamp, ev->data);
_canvas_event_feed_mouse_out_internal(eo_e, ev->timestamp, ev->data, ev);
break;
case EFL_POINTER_ACTION_WHEEL:
evas_event_feed_mouse_wheel(eo_e,
(ev->wheel.dir == EFL_ORIENT_HORIZONTAL) ? 1 : 0,
ev->wheel.z, ev->timestamp, ev->data);
dir = (ev->wheel.dir == EFL_ORIENT_HORIZONTAL) ? 1 : 0;
_canvas_event_feed_mouse_wheel_internal(eo_e, dir, ev->wheel.z, ev->timestamp, ev->data, ev);
break;
default:

View File

@ -24,11 +24,50 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
#warning Modifiers and locks not supported yet - very bad!
#if defined(DEBUG)
# define CHKACT(a) do { if (evdata->action != EFL_POINTER_ACTION_ ## a) abort(); } while (0)
#else
# define CHKACT(a) do {} while(0)
#endif
switch (type)
{
//cse EVAS_CALLBACK_MOUSE_IN:
//case EVAS_CALLBACK_MOUSE_OUT:
case EVAS_CALLBACK_MOUSE_IN:
CHKACT(IN);
{
const Evas_Event_Mouse_In *e = event_info;
ev->action = EFL_POINTER_ACTION_IN;
ev->cur.x = e->canvas.x;
ev->cur.y = e->canvas.y;
ev->cur.xsub = e->canvas.x;
ev->cur.ysub = e->canvas.y;
ev->data = e->data;
ev->timestamp = e->timestamp;
ev->event_flags = e->event_flags;
ev->device = e->dev;
ev->source = e->event_src;
break;
}
case EVAS_CALLBACK_MOUSE_OUT:
CHKACT(OUT);
{
const Evas_Event_Mouse_Out *e = event_info;
ev->action = EFL_POINTER_ACTION_OUT;
ev->cur.x = e->canvas.x;
ev->cur.y = e->canvas.y;
ev->cur.xsub = e->canvas.x;
ev->cur.ysub = e->canvas.y;
ev->data = e->data;
ev->timestamp = e->timestamp;
ev->event_flags = e->event_flags;
ev->device = e->dev;
ev->source = e->event_src;
break;
}
case EVAS_CALLBACK_MOUSE_DOWN:
CHKACT(DOWN);
{
const Evas_Event_Mouse_Down *e = event_info;
ev->action = EFL_POINTER_ACTION_DOWN;
@ -47,6 +86,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MOUSE_UP:
CHKACT(UP);
{
const Evas_Event_Mouse_Up *e = event_info;
ev->action = EFL_POINTER_ACTION_UP;
@ -65,6 +105,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MOUSE_MOVE:
CHKACT(MOVE);
{
const Evas_Event_Mouse_Move *e = event_info;
ev->action = EFL_POINTER_ACTION_MOVE;
@ -86,6 +127,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MOUSE_WHEEL:
CHKACT(WHEEL);
{
const Evas_Event_Mouse_Wheel *e = event_info;
ev->action = EFL_POINTER_ACTION_WHEEL;
@ -103,6 +145,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MULTI_DOWN:
CHKACT(DOWN);
{
const Evas_Event_Multi_Down *e = event_info;
ev->action = EFL_POINTER_ACTION_DOWN;
@ -125,6 +168,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MULTI_UP:
CHKACT(UP);
{
const Evas_Event_Multi_Up *e = event_info;
ev->action = EFL_POINTER_ACTION_UP;
@ -147,6 +191,7 @@ efl_pointer_event_legacy_info_set(Efl_Pointer_Event *evt, const void *event_info
}
case EVAS_CALLBACK_MULTI_MOVE:
CHKACT(MOVE);
{
const Evas_Event_Multi_Move *e = event_info;
ev->action = EFL_POINTER_ACTION_MOVE;
@ -183,12 +228,57 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
switch (ev->action)
{
case EFL_POINTER_ACTION_IN:
{
Evas_Event_Mouse_In *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_IN;
ev->legacy = e;
e->reserved = ev->eo;
e->buttons = ev->pressed_buttons;
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
e->output.x = ev->cur.x;
e->output.y = ev->cur.y;
e->data = ev->data;
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
e->event_src = ev->source;
}
break;
case EFL_POINTER_ACTION_OUT:
{
Evas_Event_Mouse_Out *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_OUT;
ev->legacy = e;
e->reserved = ev->eo;
e->buttons = ev->pressed_buttons;
e->canvas.x = ev->cur.x;
e->canvas.y = ev->cur.y;
e->output.x = ev->cur.x;
e->output.y = ev->cur.y;
e->data = ev->data;
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->event_src = ev->source;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
break;
case EFL_POINTER_ACTION_DOWN:
if (!ev->finger || !multi)
{
Evas_Event_Mouse_Down *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_DOWN;
ev->legacy = e;
e->reserved = ev->eo;
e->button = ev->button;
e->canvas.x = ev->cur.x;
@ -201,12 +291,15 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->event_src = ev->source;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
else
{
Evas_Event_Multi_Down *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MULTI_DOWN;
ev->legacy = e;
e->reserved = ev->eo;
e->device = ev->finger;
e->radius = ev->radius;
@ -225,6 +318,8 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
break;
@ -234,6 +329,7 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
Evas_Event_Mouse_Up *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_UP;
ev->legacy = e;
e->reserved = ev->eo;
e->button = ev->button;
e->canvas.x = ev->cur.x;
@ -246,12 +342,15 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->event_src = ev->source;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
else
{
Evas_Event_Multi_Down *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MULTI_UP;
ev->legacy = e;
e->reserved = ev->eo;
e->device = ev->finger;
e->radius = ev->radius;
@ -270,6 +369,8 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
break;
}
break;
@ -280,6 +381,7 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
Evas_Event_Mouse_Move *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_MOVE;
ev->legacy = e;
e->reserved = ev->eo;
e->buttons = ev->pressed_buttons;
e->cur.canvas.x = ev->cur.x;
@ -295,12 +397,15 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->event_src = ev->source;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
else
{
Evas_Event_Multi_Move *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MULTI_MOVE;
ev->legacy = e;
e->reserved = ev->eo;
e->device = ev->finger;
e->radius = ev->radius;
@ -318,6 +423,8 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
}
break;
@ -326,6 +433,7 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
Evas_Event_Mouse_Wheel *e = calloc(1, sizeof(*e));
if (ptype) *ptype = EVAS_CALLBACK_MOUSE_WHEEL;
ev->legacy = e;
e->reserved = ev->eo;
e->direction = (ev->wheel.dir == EFL_ORIENT_VERTICAL);
e->z = ev->wheel.z;
@ -337,6 +445,8 @@ efl_pointer_event_legacy_info_get(const Efl_Pointer_Event *evt, Evas_Callback_Ty
e->timestamp = ev->timestamp;
e->event_flags = ev->event_flags;
e->dev = ev->device;
e->modifiers = NULL; /* FIXME */
e->locks = NULL; /* FIXME */
break;
}