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