1 #include "evas_common_private.h"
2 #include "evas_private.h"
3
4 typedef union {
5 Evas_Event_Mouse_Down down;
6 Evas_Event_Mouse_Up up;
7 Evas_Event_Mouse_In in;
8 Evas_Event_Mouse_Out out;
9 Evas_Event_Mouse_Move move;
10 Evas_Event_Mouse_Wheel wheel;
11 Evas_Event_Multi_Down mdown;
12 Evas_Event_Multi_Up mup;
13 Evas_Event_Multi_Move mmove;
14 Evas_Event_Key_Down kdown;
15 Evas_Event_Key_Up kup;
16 Evas_Event_Hold hold;
17 Evas_Event_Axis_Update axis;
18 } Evas_Event_Any;
19
20 #define EV_SIZE sizeof(Evas_Event_Any)
21
22 static inline void *
_event_alloc(void * old)23 _event_alloc(void *old)
24 {
25 if (old)
26 memset(old, 0, EV_SIZE);
27 else
28 old = calloc(1, EV_SIZE);
29 return old;
30 }
31
32 void *
efl_input_pointer_legacy_info_fill(Evas * eo_evas,Efl_Input_Key * eo_ev,Evas_Callback_Type type,Evas_Event_Flags ** pflags)33 efl_input_pointer_legacy_info_fill(Evas *eo_evas, Efl_Input_Key *eo_ev, Evas_Callback_Type type, Evas_Event_Flags **pflags)
34 {
35 Efl_Input_Pointer_Data *ev = efl_data_scope_get(eo_ev, EFL_INPUT_POINTER_CLASS);
36 Evas_Public_Data *evas;
37 Evas_Pointer_Data *pdata;
38
39 if (!ev) return NULL;
40 if (!eo_evas) eo_evas = efl_provider_find(eo_ev, EVAS_CANVAS_CLASS);
41 evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
42 if (!evas) return NULL;
43 pdata = _evas_pointer_data_by_device_get(evas, ev->device);
44 EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL);
45
46 #define COORD_DUP(e) do { (e)->output.x = pdata->seat->x; (e)->output.y = pdata->seat->y; } while (0)
47 #define COORD_DUP_CUR(e) do { (e)->cur.output.x = pdata->seat->x; (e)->cur.output.y = pdata->seat->y; } while (0)
48 #define COORD_DUP_PREV(e) do { (e)->prev.output.x = pdata->seat->prev.x; (e)->prev.output.y = pdata->seat->prev.y; } while (0)
49 #define TYPE_CHK(typ) do { if ((type != EVAS_CALLBACK_LAST) && (type != EVAS_CALLBACK_ ## typ)) return NULL; } while (0)
50
51 switch (ev->action)
52 {
53 case EFL_POINTER_ACTION_IN:
54 TYPE_CHK(MOUSE_IN);
55 {
56 Evas_Event_Mouse_In *e = _event_alloc(ev->legacy);
57 e->canvas.x = ev->cur.x;
58 e->canvas.y = ev->cur.y;
59 COORD_DUP(e);
60 e->data = ev->data;
61 e->timestamp = ev->timestamp;
62 e->event_flags = (Evas_Event_Flags)ev->event_flags;
63 e->dev = ev->device;
64 e->event_src = ev->source;
65 e->modifiers = ev->modifiers;
66 e->locks = ev->locks;
67 if (pflags) *pflags = &e->event_flags;
68 ev->legacy = e;
69 return e;
70 }
71
72 case EFL_POINTER_ACTION_OUT:
73 TYPE_CHK(MOUSE_OUT);
74 {
75 Evas_Event_Mouse_Out *e = _event_alloc(ev->legacy);
76 e->canvas.x = ev->cur.x;
77 e->canvas.y = ev->cur.y;
78 COORD_DUP(e);
79 e->data = ev->data;
80 e->timestamp = ev->timestamp;
81 e->event_flags = (Evas_Event_Flags)ev->event_flags;
82 e->dev = ev->device;
83 e->event_src = ev->source;
84 e->modifiers = ev->modifiers;
85 e->locks = ev->locks;
86 if (pflags) *pflags = &e->event_flags;
87 ev->legacy = e;
88 return e;
89 }
90
91 case EFL_POINTER_ACTION_DOWN:
92 if (ev->touch_id == 0)
93 {
94 // filter out MULTI with finger 0, valid for eo, invalid for legacy
95 if (type == EVAS_CALLBACK_MULTI_DOWN)
96 return NULL;
97 TYPE_CHK(MOUSE_DOWN);
98 Evas_Event_Mouse_Down *e = _event_alloc(ev->legacy);
99 e->button = ev->button;
100 e->canvas.x = ev->cur.x;
101 e->canvas.y = ev->cur.y;
102 COORD_DUP(e);
103 e->data = ev->data;
104 e->flags = (Evas_Button_Flags)ev->button_flags;
105 e->timestamp = ev->timestamp;
106 e->event_flags = (Evas_Event_Flags)ev->event_flags;
107 e->dev = ev->device;
108 e->event_src = ev->source;
109 e->modifiers = ev->modifiers;
110 e->locks = ev->locks;
111 if (pflags) *pflags = &e->event_flags;
112 ev->legacy = e;
113 return e;
114 }
115 else
116 {
117 TYPE_CHK(MULTI_DOWN);
118 Evas_Event_Multi_Down *e = _event_alloc(ev->legacy);
119 e->device = ev->touch_id;
120 e->radius = ev->radius;
121 e->radius_x = ev->radius_x;
122 e->radius_y = ev->radius_y;
123 e->pressure = ev->pressure;
124 e->angle = ev->angle;
125 e->canvas.xsub = ev->cur.x;
126 e->canvas.ysub = ev->cur.y;
127 e->canvas.x = ev->cur.x;
128 e->canvas.y = ev->cur.y;
129 COORD_DUP(e);
130 e->data = ev->data;
131 e->flags = (Evas_Button_Flags)ev->button_flags;
132 e->timestamp = ev->timestamp;
133 e->event_flags = (Evas_Event_Flags)ev->event_flags;
134 e->dev = ev->device;
135 e->modifiers = ev->modifiers;
136 e->locks = ev->locks;
137 if (pflags) *pflags = &e->event_flags;
138 ev->legacy = e;
139 return e;
140 }
141
142 case EFL_POINTER_ACTION_UP:
143 if (ev->touch_id == 0)
144 {
145 // filter out MULTI with finger 0, valid for eo, invalid for legacy
146 if (type == EVAS_CALLBACK_MULTI_UP)
147 return NULL;
148 TYPE_CHK(MOUSE_UP);
149 Evas_Event_Mouse_Up *e = _event_alloc(ev->legacy);
150 e->button = ev->button;
151 e->canvas.x = ev->cur.x;
152 e->canvas.y = ev->cur.y;
153 COORD_DUP(e);
154 e->data = ev->data;
155 e->flags = (Evas_Button_Flags)ev->button_flags;
156 e->timestamp = ev->timestamp;
157 e->event_flags = (Evas_Event_Flags)ev->event_flags;
158 e->dev = ev->device;
159 e->event_src = ev->source;
160 e->modifiers = ev->modifiers;
161 e->locks = ev->locks;
162 if (pflags) *pflags = &e->event_flags;
163 ev->legacy = e;
164 return e;
165 }
166 else
167 {
168 TYPE_CHK(MULTI_UP);
169 Evas_Event_Multi_Up *e = _event_alloc(ev->legacy);
170 e->device = ev->touch_id;
171 e->radius = ev->radius;
172 e->radius_x = ev->radius_x;
173 e->radius_y = ev->radius_y;
174 e->pressure = ev->pressure;
175 e->angle = ev->angle;
176 e->canvas.xsub = ev->cur.x;
177 e->canvas.ysub = ev->cur.y;
178 e->canvas.x = ev->cur.x;
179 e->canvas.y = ev->cur.y;
180 COORD_DUP(e);
181 e->data = ev->data;
182 e->flags = (Evas_Button_Flags)ev->button_flags;
183 e->timestamp = ev->timestamp;
184 e->event_flags = (Evas_Event_Flags)ev->event_flags;
185 e->dev = ev->device;
186 e->modifiers = ev->modifiers;
187 e->locks = ev->locks;
188 if (pflags) *pflags = &e->event_flags;
189 ev->legacy = e;
190 return e;
191 }
192
193 case EFL_POINTER_ACTION_MOVE:
194 if (ev->touch_id == 0)
195 {
196 // filter out MULTI with finger 0, valid for eo, invalid for legacy
197 if (type == EVAS_CALLBACK_MULTI_MOVE)
198 return NULL;
199 TYPE_CHK(MOUSE_MOVE);
200 Evas_Event_Mouse_Move *e = _event_alloc(ev->legacy);
201 e->buttons = ev->pressed_buttons;
202 e->cur.canvas.x = ev->cur.x;
203 e->cur.canvas.y = ev->cur.y;
204 e->prev.canvas.x = ev->prev.x;
205 e->prev.canvas.y = ev->prev.y;
206 COORD_DUP_CUR(e);
207 COORD_DUP_PREV(e);
208 e->data = ev->data;
209 e->timestamp = ev->timestamp;
210 e->event_flags = (Evas_Event_Flags)ev->event_flags;
211 e->dev = ev->device;
212 e->event_src = ev->source;
213 e->modifiers = ev->modifiers;
214 e->locks = ev->locks;
215 if (pflags) *pflags = &e->event_flags;
216 ev->legacy = e;
217 return e;
218 }
219 else
220 {
221 TYPE_CHK(MULTI_MOVE);
222 Evas_Event_Multi_Move *e = _event_alloc(ev->legacy);
223 e->device = ev->touch_id;
224 e->radius = ev->radius;
225 e->radius_x = ev->radius_x;
226 e->radius_y = ev->radius_y;
227 e->pressure = ev->pressure;
228 e->angle = ev->angle;
229 e->cur.canvas.xsub = ev->cur.x;
230 e->cur.canvas.ysub = ev->cur.y;
231 e->cur.canvas.x = ev->cur.x;
232 e->cur.canvas.y = ev->cur.y;
233 COORD_DUP_CUR(e);
234 e->data = ev->data;
235 e->timestamp = ev->timestamp;
236 e->event_flags = (Evas_Event_Flags)ev->event_flags;
237 e->dev = ev->device;
238 e->modifiers = ev->modifiers;
239 e->locks = ev->locks;
240 if (pflags) *pflags = &e->event_flags;
241 ev->legacy = e;
242 return e;
243 }
244
245 case EFL_POINTER_ACTION_WHEEL:
246 {
247 TYPE_CHK(MOUSE_WHEEL);
248 Evas_Event_Mouse_Wheel *e = _event_alloc(ev->legacy);
249 e->direction = ev->wheel.horizontal;
250 e->z = ev->wheel.z;
251 e->canvas.x = ev->cur.x;
252 e->canvas.y = ev->cur.y;
253 COORD_DUP(e);
254 e->data = ev->data;
255 e->timestamp = ev->timestamp;
256 e->event_flags = (Evas_Event_Flags)ev->event_flags;
257 e->dev = ev->device;
258 e->modifiers = ev->modifiers;
259 e->locks = ev->locks;
260 if (pflags) *pflags = &e->event_flags;
261 ev->legacy = e;
262 return e;
263 }
264
265 case EFL_POINTER_ACTION_AXIS:
266 {
267 TYPE_CHK(AXIS_UPDATE);
268 Evas_Event_Axis_Update *e = ev->legacy;
269 Evas_Axis *tmp_axis;
270 if (e && e->axis) free(e->axis);
271 e = _event_alloc(ev->legacy);
272 e->data = ev->data;
273 e->timestamp = ev->timestamp;
274 e->dev = ev->device;
275 /* FIXME: Get device id from above device object. 0 for now. */
276 e->device = 0;
277 e->toolid = ev->touch_id;
278 e->axis = malloc(sizeof(Evas_Axis) * 11);
279 e->axis[e->naxis].label = EVAS_AXIS_LABEL_WINDOW_X;
280 e->axis[e->naxis].value = ev->cur.x;
281 e->naxis++;
282 e->axis[e->naxis].label = EVAS_AXIS_LABEL_WINDOW_Y;
283 e->axis[e->naxis].value = ev->cur.y;
284 e->naxis++;
285 if (ev->has_raw)
286 {
287 e->axis[e->naxis].label = EVAS_AXIS_LABEL_X;
288 e->axis[e->naxis].value = ev->raw.x;
289 e->naxis++;
290 e->axis[e->naxis].label = EVAS_AXIS_LABEL_Y;
291 e->axis[e->naxis].value = ev->raw.y;
292 e->naxis++;
293 }
294 if (ev->has_norm)
295 {
296 e->axis[e->naxis].label = EVAS_AXIS_LABEL_NORMAL_X;
297 e->axis[e->naxis].value = ev->norm.x;
298 e->naxis++;
299 e->axis[e->naxis].label = EVAS_AXIS_LABEL_NORMAL_Y;
300 e->axis[e->naxis].value = ev->norm.y;
301 e->naxis++;
302 }
303 if (_efl_input_value_has(ev, EFL_INPUT_VALUE_PRESSURE))
304 {
305 e->axis[e->naxis].label = EVAS_AXIS_LABEL_PRESSURE;
306 e->axis[e->naxis].value = ev->pressure;
307 e->naxis++;
308 }
309 if (_efl_input_value_has(ev, EFL_INPUT_VALUE_DISTANCE))
310 {
311 e->axis[e->naxis].label = EVAS_AXIS_LABEL_DISTANCE;
312 e->axis[e->naxis].value = ev->distance;
313 e->naxis++;
314 }
315 if (_efl_input_value_has(ev, EFL_INPUT_VALUE_AZIMUTH))
316 {
317 e->axis[e->naxis].label = EVAS_AXIS_LABEL_AZIMUTH;
318 e->axis[e->naxis].value = ev->azimuth;
319 e->naxis++;
320 }
321 if (_efl_input_value_has(ev, EFL_INPUT_VALUE_TILT))
322 {
323 e->axis[e->naxis].label = EVAS_AXIS_LABEL_TILT;
324 e->axis[e->naxis].value = ev->tilt;
325 e->naxis++;
326 }
327 if (_efl_input_value_has(ev, EFL_INPUT_VALUE_TWIST))
328 {
329 e->axis[e->naxis].label = EVAS_AXIS_LABEL_TWIST;
330 e->axis[e->naxis].value = ev->twist;
331 e->naxis++;
332 }
333 tmp_axis = realloc(e->axis, e->naxis * sizeof(Evas_Axis));
334 if (tmp_axis) e->axis = tmp_axis;
335 if (pflags) *pflags = NULL;
336 ev->legacy = e;
337 return e;
338 }
339
340 default:
341 return NULL;
342 }
343 }
344
345 void *
efl_input_key_legacy_info_fill(Efl_Input_Key * evt,Evas_Event_Flags ** pflags)346 efl_input_key_legacy_info_fill(Efl_Input_Key *evt, Evas_Event_Flags **pflags)
347 {
348 Efl_Input_Key_Data *ev;
349
350 ev = efl_data_scope_get(evt, EFL_INPUT_KEY_CLASS);
351 if (!ev) return NULL;
352
353 if (ev->pressed)
354 {
355 Evas_Event_Key_Down *e = _event_alloc(ev->legacy);
356 e->timestamp = ev->timestamp;
357 e->keyname = (char *) ev->keyname;
358 e->key = ev->key;
359 e->string = ev->string;
360 e->compose = ev->compose;
361 e->keycode = ev->keycode;
362 e->data = ev->data;
363 e->modifiers = ev->modifiers;
364 e->locks = ev->locks;
365 e->event_flags = (Evas_Event_Flags)ev->event_flags;
366 e->dev = ev->device;
367 if (pflags) *pflags = &e->event_flags;
368 ev->legacy = e;
369 return e;
370 }
371 else
372 {
373 Evas_Event_Key_Up *e = _event_alloc(ev->legacy);
374 e->timestamp = ev->timestamp;
375 e->keyname = (char *) ev->keyname;
376 e->key = ev->key;
377 e->string = ev->string;
378 e->compose = ev->compose;
379 e->keycode = ev->keycode;
380 e->data = ev->data;
381 e->modifiers = ev->modifiers;
382 e->locks = ev->locks;
383 e->event_flags = (Evas_Event_Flags)ev->event_flags;
384 e->dev = ev->device;
385 if (pflags) *pflags = &e->event_flags;
386 ev->legacy = e;
387 return e;
388 }
389 }
390
391 void *
efl_input_hold_legacy_info_fill(Efl_Input_Hold * evt,Evas_Event_Flags ** pflags)392 efl_input_hold_legacy_info_fill(Efl_Input_Hold *evt, Evas_Event_Flags **pflags)
393 {
394 Efl_Input_Hold_Data *ev = efl_data_scope_get(evt, EFL_INPUT_HOLD_CLASS);
395 Evas_Event_Hold *e;
396
397 if (!ev) return NULL;
398
399 e = _event_alloc(ev->legacy);
400 e->timestamp = ev->timestamp;
401 e->dev = ev->device;
402 e->hold = ev->hold;
403 e->event_flags = (Evas_Event_Flags)ev->event_flags;
404 if (pflags) *pflags = &e->event_flags;
405 ev->legacy = e;
406
407 return e;
408 }
409