1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4 
5 #define EFL_INPUT_EVENT_PROTECTED
6 
7 #include "evas_common_private.h"
8 #include "evas_private.h"
9 
10 #define MY_CLASS EFL_INPUT_POINTER_CLASS
11 
12 
13 /* Pointer Event
14  *
15  * This is a storage class only, should not require ANY knowledge about
16  * Ecore, Evas or anything else. Note: locks & modifiers require evas. :(
17  *
18  * This is intended to replace Ecore and Evas structs for mouse events.
19  *
20  * Do not add any logic here.
21  */
22 
23 /* internal eo */
24 EOAPI Eo*
efl_input_pointer_instance_get(Efl_Object * owner,void ** priv)25 efl_input_pointer_instance_get(Efl_Object *owner, void **priv)
26 {
27    Efl_Input_Pointer_Data *ev;
28    Efl_Input_Pointer *evt;
29 
30    evt = efl_input_event_instance_get(EFL_INPUT_POINTER_CLASS, owner);
31    if (!evt) return NULL;
32 
33    ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
34    ev->fake = EINA_FALSE;
35    if (priv) *priv = ev;
36 
37    return evt;
38 }
39 
40 EOLIAN static void
_efl_input_pointer_class_destructor(Efl_Class * klass)41 _efl_input_pointer_class_destructor(Efl_Class *klass)
42 {
43    efl_input_event_instance_clean(klass);
44 }
45 
46 EAPI void
efl_input_pointer_finalize(Efl_Input_Pointer * obj)47 efl_input_pointer_finalize(Efl_Input_Pointer *obj)
48 {
49    const Evas_Pointer_Data *pdata;
50    Efl_Input_Pointer_Data *ev;
51    Evas_Public_Data *evas;
52    Evas *eo_evas;
53 
54    ev = efl_data_scope_safe_get(obj, MY_CLASS);
55    EINA_SAFETY_ON_NULL_RETURN(ev);
56 
57    eo_evas = efl_provider_find(obj, EVAS_CANVAS_CLASS);
58    evas = efl_data_scope_get(eo_evas, EVAS_CANVAS_CLASS);
59    if (!evas) return;
60 
61    /* FIXME: modifiers & locks should be seat-based! */
62    ev->modifiers = &evas->modifiers;
63    ev->locks = &evas->locks;
64 
65    pdata = _evas_pointer_data_by_device_get(evas, ev->device);
66    if (!pdata) return;
67 
68    ev->prev.x = pdata->seat->x;
69    ev->prev.y = pdata->seat->y;
70    ev->pressed_buttons = pdata->button;
71 }
72 
73 EOLIAN static Efl_Object *
_efl_input_pointer_efl_object_constructor(Eo * obj,Efl_Input_Pointer_Data * pd)74 _efl_input_pointer_efl_object_constructor(Eo *obj, Efl_Input_Pointer_Data *pd)
75 {
76    obj = efl_constructor(efl_super(obj, MY_CLASS));
77    pd->fake = 1;
78    efl_input_reset(obj);
79    return obj;
80 }
81 
82 static inline void
_efl_input_pointer_free(Efl_Input_Pointer_Data * pd)83 _efl_input_pointer_free(Efl_Input_Pointer_Data *pd)
84 {
85    free(pd->legacy);
86    efl_unref(pd->device);
87 }
88 
89 EOLIAN static void
_efl_input_pointer_efl_object_destructor(Eo * obj,Efl_Input_Pointer_Data * pd)90 _efl_input_pointer_efl_object_destructor(Eo *obj, Efl_Input_Pointer_Data *pd)
91 {
92    _efl_input_pointer_free(pd);
93    efl_destructor(efl_super(obj, MY_CLASS));
94 }
95 
96 EOLIAN static void
_efl_input_pointer_efl_input_event_reset(Eo * obj,Efl_Input_Pointer_Data * pd)97 _efl_input_pointer_efl_input_event_reset(Eo *obj, Efl_Input_Pointer_Data *pd)
98 {
99    Eina_Bool fake = pd->fake;
100    _efl_input_pointer_free(pd);
101    memset(pd, 0, sizeof(*pd));
102    pd->eo = obj;
103    pd->fake = fake;
104 }
105 
106 EOLIAN static Efl_Input_Event *
_efl_input_pointer_efl_duplicate_duplicate(const Eo * obj,Efl_Input_Pointer_Data * pd)107 _efl_input_pointer_efl_duplicate_duplicate(const Eo *obj, Efl_Input_Pointer_Data *pd)
108 {
109    Efl_Input_Pointer_Data *ev;
110    Efl_Input_Focus *evt;
111 
112    if (efl_invalidated_get(obj))
113      {
114         ERR("Object %s has already been invalidated and can't be duplicated.", efl_debug_name_get(obj));
115         return NULL;
116      }
117    if (!efl_parent_get(obj))
118      {
119         ERR("Object %s has not parent during duplicate.", efl_debug_name_get(obj));
120         return NULL;
121      }
122    evt = efl_add(MY_CLASS, efl_parent_get(obj),
123                  efl_allow_parent_unref_set(efl_added, EINA_TRUE));
124    ev = efl_data_scope_get(evt, MY_CLASS);
125    if (!ev) return NULL;
126 
127    memcpy(ev, pd, sizeof(*ev));
128    ev->eo = evt;
129    ev->legacy = NULL;
130    ev->evas_done = 0;
131    ev->win_fed = 0;
132    ev->fake = 1;
133    ev->device = efl_ref(pd->device);
134 
135    return evt;
136 }
137 
138 EOLIAN static void
_efl_input_pointer_action_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Pointer_Action act)139 _efl_input_pointer_action_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Pointer_Action act)
140 {
141    pd->action = act;
142 }
143 
144 EOLIAN static Efl_Pointer_Action
_efl_input_pointer_action_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)145 _efl_input_pointer_action_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
146 {
147    return pd->action;
148 }
149 
150 EOLIAN static void
_efl_input_pointer_button_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,int but)151 _efl_input_pointer_button_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int but)
152 {
153    _efl_input_value_mark(pd, EFL_INPUT_VALUE_BUTTON);
154    pd->button = but;
155 }
156 
157 EOLIAN static int
_efl_input_pointer_button_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)158 _efl_input_pointer_button_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
159 {
160    return pd->button;
161 }
162 
163 EOLIAN static void
_efl_input_pointer_button_pressed_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,int button,Eina_Bool pressed)164 _efl_input_pointer_button_pressed_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int button, Eina_Bool pressed)
165 {
166    if (button < 0) return;
167    if (button > 31) return;
168    _efl_input_value_mark(pd, EFL_INPUT_VALUE_BUTTONS_PRESSED);
169    if (pressed)
170      pd->button_flags |= (1 << button);
171    else
172      pd->button_flags &= ~(1 << button);
173 }
174 
175 EOLIAN static Eina_Bool
_efl_input_pointer_button_pressed_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,int button)176 _efl_input_pointer_button_pressed_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int button)
177 {
178    if (button < 0) return EINA_FALSE;
179    if (button > 31) return EINA_FALSE;
180    return (pd->button_flags & (1 << button)) != 0;
181 }
182 
183 EOLIAN static void
_efl_input_pointer_position_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Position2D pos)184 _efl_input_pointer_position_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Position2D pos)
185 {
186    _efl_input_value_mark(pd, EFL_INPUT_VALUE_X);
187    _efl_input_value_mark(pd, EFL_INPUT_VALUE_Y);
188    pd->cur.x = (double) pos.x;
189    pd->cur.y = (double) pos.y;
190 }
191 
192 EOLIAN static Eina_Position2D
_efl_input_pointer_position_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)193 _efl_input_pointer_position_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
194 {
195    return EINA_POSITION2D((int) pd->cur.x, (int) pd->cur.y);
196 }
197 
198 EOLIAN static void
_efl_input_pointer_precise_position_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Vector2 pos)199 _efl_input_pointer_precise_position_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Vector2 pos)
200 {
201    _efl_input_value_mark(pd, EFL_INPUT_VALUE_X);
202    _efl_input_value_mark(pd, EFL_INPUT_VALUE_Y);
203    pd->cur = pos;
204 }
205 
206 EOLIAN static Eina_Vector2
_efl_input_pointer_precise_position_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)207 _efl_input_pointer_precise_position_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
208 {
209    return pd->cur;
210 }
211 
212 EOLIAN static void
_efl_input_pointer_previous_position_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Position2D pos)213 _efl_input_pointer_previous_position_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Position2D pos)
214 {
215    _efl_input_value_mark(pd, EFL_INPUT_VALUE_PREVIOUS_X);
216    _efl_input_value_mark(pd, EFL_INPUT_VALUE_PREVIOUS_Y);
217    pd->prev.x = (double) pos.x;
218    pd->prev.y = (double) pos.y;
219 }
220 
221 EOLIAN static Eina_Position2D
_efl_input_pointer_previous_position_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)222 _efl_input_pointer_previous_position_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
223 {
224    return EINA_POSITION2D((int) pd->prev.x, (int) pd->prev.y);
225 }
226 
227 EOLIAN static void
_efl_input_pointer_efl_input_event_device_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Device * dev)228 _efl_input_pointer_efl_input_event_device_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Input_Device *dev)
229 {
230    efl_replace(&pd->device, dev);
231 }
232 
233 EOLIAN static Efl_Input_Device *
_efl_input_pointer_efl_input_event_device_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)234 _efl_input_pointer_efl_input_event_device_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
235 {
236    return pd->device;
237 }
238 
239 EOLIAN static void
_efl_input_pointer_source_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Gfx_Entity * src)240 _efl_input_pointer_source_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Gfx_Entity *src)
241 {
242    /* ref? */
243    pd->source = src;
244 }
245 
246 EOLIAN static Efl_Gfx_Entity *
_efl_input_pointer_source_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)247 _efl_input_pointer_source_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
248 {
249    return pd->source;
250 }
251 
252 EOLIAN static void
_efl_input_pointer_button_flags_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Pointer_Flags flags)253 _efl_input_pointer_button_flags_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Pointer_Flags flags)
254 {
255    pd->button_flags = flags;
256 }
257 
258 EOLIAN static Efl_Pointer_Flags
_efl_input_pointer_button_flags_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)259 _efl_input_pointer_button_flags_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
260 {
261    return pd->button_flags;
262 }
263 
264 EOLIAN static void
_efl_input_pointer_efl_input_event_event_flags_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Flags flags)265 _efl_input_pointer_efl_input_event_event_flags_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Input_Flags flags)
266 {
267    pd->event_flags = flags;
268 }
269 
270 EOLIAN static Efl_Input_Flags
_efl_input_pointer_efl_input_event_event_flags_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)271 _efl_input_pointer_efl_input_event_event_flags_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
272 {
273    return pd->event_flags;
274 }
275 
276 EOLIAN static void
_efl_input_pointer_efl_input_event_timestamp_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,double ms)277 _efl_input_pointer_efl_input_event_timestamp_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, double ms)
278 {
279    _efl_input_value_mark(pd, EFL_INPUT_VALUE_TIMESTAMP);
280    pd->timestamp = (unsigned int) ms;
281 }
282 
283 EOLIAN static double
_efl_input_pointer_efl_input_event_timestamp_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)284 _efl_input_pointer_efl_input_event_timestamp_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
285 {
286    return (double) pd->timestamp;
287 }
288 
289 EOLIAN static void
_efl_input_pointer_wheel_horizontal_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Bool dir)290 _efl_input_pointer_wheel_horizontal_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Bool dir)
291 {
292    _efl_input_value_mark(pd, EFL_INPUT_VALUE_WHEEL_HORIZONTAL);
293    pd->wheel.horizontal = !!dir;
294 }
295 
296 EOLIAN static Eina_Bool
_efl_input_pointer_wheel_horizontal_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)297 _efl_input_pointer_wheel_horizontal_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
298 {
299    return pd->wheel.horizontal;
300 }
301 
302 EOLIAN static void
_efl_input_pointer_wheel_delta_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,int dist)303 _efl_input_pointer_wheel_delta_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int dist)
304 {
305    _efl_input_value_mark(pd, EFL_INPUT_VALUE_WHEEL_DELTA);
306    pd->wheel.z = dist;
307 }
308 
309 EOLIAN static int
_efl_input_pointer_wheel_delta_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)310 _efl_input_pointer_wheel_delta_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
311 {
312    return pd->wheel.z;
313 }
314 
315 EOLIAN static int
_efl_input_pointer_touch_id_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)316 _efl_input_pointer_touch_id_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
317 {
318    return pd->touch_id;
319 }
320 
321 EOLIAN static void
_efl_input_pointer_touch_id_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,int id)322 _efl_input_pointer_touch_id_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int id)
323 {
324    _efl_input_value_mark(pd, EFL_INPUT_VALUE_TOUCH_ID);
325    pd->touch_id = id;
326 }
327 
328 EOLIAN static Eina_Bool
_efl_input_pointer_efl_input_state_modifier_enabled_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Modifier mod,const Efl_Input_Device * seat)329 _efl_input_pointer_efl_input_state_modifier_enabled_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd,
330                                                         Efl_Input_Modifier mod, const Efl_Input_Device *seat)
331 {
332    const char *name;
333 
334    if (!pd->modifiers) return EINA_FALSE;
335    if (!seat)
336      {
337         seat = efl_input_device_seat_get(pd->device);
338         if (!seat) return EINA_FALSE;
339      }
340    name = _efl_input_modifier_to_string(mod);
341    if (!name) return EINA_FALSE;
342    return evas_seat_key_modifier_is_set(pd->modifiers, name, seat);
343 }
344 
345 EOLIAN static Eina_Bool
_efl_input_pointer_efl_input_state_lock_enabled_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Lock lock,const Efl_Input_Device * seat)346 _efl_input_pointer_efl_input_state_lock_enabled_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd,
347                                                     Efl_Input_Lock lock, const Efl_Input_Device *seat)
348 {
349    const char *name;
350 
351    if (!pd->locks) return EINA_FALSE;
352    if (!seat)
353      {
354         seat = efl_input_device_seat_get(pd->device);
355         if (!seat) return EINA_FALSE;
356      }
357    name = _efl_input_lock_to_string(lock);
358    if (!name) return EINA_FALSE;
359    return evas_seat_key_lock_is_set(pd->locks, name, seat);
360 }
361 
362 EOLIAN static void
_efl_input_pointer_double_click_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Bool val)363 _efl_input_pointer_double_click_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Bool val)
364 {
365    if (val)
366      pd->button_flags |= EFL_POINTER_FLAGS_DOUBLE_CLICK;
367    else
368      pd->button_flags &= ~EFL_POINTER_FLAGS_DOUBLE_CLICK;
369 }
370 
371 EOLIAN static Eina_Bool
_efl_input_pointer_double_click_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)372 _efl_input_pointer_double_click_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
373 {
374    return !!(pd->button_flags & EFL_POINTER_FLAGS_DOUBLE_CLICK);
375 }
376 
377 EOLIAN static void
_efl_input_pointer_triple_click_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Eina_Bool val)378 _efl_input_pointer_triple_click_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Eina_Bool val)
379 {
380    if (val)
381      pd->button_flags |= EFL_POINTER_FLAGS_TRIPLE_CLICK;
382    else
383      pd->button_flags &= ~EFL_POINTER_FLAGS_TRIPLE_CLICK;
384 }
385 
386 EOLIAN static Eina_Bool
_efl_input_pointer_triple_click_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)387 _efl_input_pointer_triple_click_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
388 {
389    return !!(pd->button_flags & EFL_POINTER_FLAGS_TRIPLE_CLICK);
390 }
391 
392 EOLIAN static Eina_Bool
_efl_input_pointer_efl_input_event_fake_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd)393 _efl_input_pointer_efl_input_event_fake_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd)
394 {
395    // read-only
396    return pd->fake;
397 }
398 
399 EOLIAN static Eina_Bool
_efl_input_pointer_value_has_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Value key)400 _efl_input_pointer_value_has_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Input_Value key)
401 {
402    if (!pd || (key <= EFL_INPUT_VALUE_NONE) || (key > EFL_INPUT_VALUE_SLIDER))
403      return EINA_FALSE;
404    if (key == EFL_INPUT_VALUE_DX)
405      {
406         return _efl_input_value_has(pd, EFL_INPUT_VALUE_X) &&
407               _efl_input_value_has(pd, EFL_INPUT_VALUE_PREVIOUS_X);
408      }
409    if (key == EFL_INPUT_VALUE_DY)
410      {
411         return _efl_input_value_has(pd, EFL_INPUT_VALUE_Y) &&
412               _efl_input_value_has(pd, EFL_INPUT_VALUE_PREVIOUS_Y);
413      }
414    return _efl_input_value_has(pd, key);
415 }
416 
417 EOLIAN static Eina_Bool
_efl_input_pointer_value_set(Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Value key,double val)418 _efl_input_pointer_value_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Input_Value key, double val)
419 {
420    if ((key <= EFL_INPUT_VALUE_NONE) || (key > EFL_INPUT_VALUE_SLIDER))
421      return EINA_FALSE;
422 
423    // note: not a fan of setting ints based on a double...
424    switch (key)
425      {
426       case EFL_INPUT_VALUE_TIMESTAMP:
427         pd->timestamp = (unsigned int) (val * 1000.0);
428         break;
429 
430       case EFL_INPUT_VALUE_BUTTON:
431         pd->button = (int) val;
432         break;
433 
434       case EFL_INPUT_VALUE_BUTTONS_PRESSED:
435         pd->pressed_buttons = (int) val;
436         break;
437 
438       case EFL_INPUT_VALUE_TOUCH_ID:
439         pd->touch_id = (int) val;
440         break;
441 
442       case EFL_INPUT_VALUE_X:
443         pd->cur.x = val;
444         break;
445 
446       case EFL_INPUT_VALUE_Y:
447         pd->cur.y = val;
448         break;
449 
450       case EFL_INPUT_VALUE_DX:
451       case EFL_INPUT_VALUE_DY:
452         return EINA_FALSE;
453 
454       case EFL_INPUT_VALUE_PREVIOUS_X:
455         pd->prev.x = val;
456         break;
457 
458       case EFL_INPUT_VALUE_PREVIOUS_Y:
459         pd->prev.y = val;
460         break;
461 
462       case EFL_INPUT_VALUE_RADIUS:
463         pd->radius = val;
464         break;
465 
466       case EFL_INPUT_VALUE_RADIUS_X:
467         pd->radius_x = val;
468         break;
469 
470       case EFL_INPUT_VALUE_RADIUS_Y:
471         pd->radius_y = val;
472         break;
473 
474       case EFL_INPUT_VALUE_PRESSURE:
475         return pd->pressure;
476 
477       case EFL_INPUT_VALUE_DISTANCE:
478         return EINA_FALSE; // TODO
479 
480       case EFL_INPUT_VALUE_AZIMUTH:
481         return EINA_FALSE; // TODO
482 
483       case EFL_INPUT_VALUE_TILT:
484         return EINA_FALSE; // TODO
485 
486       case EFL_INPUT_VALUE_TILT_X:
487         return EINA_FALSE; // TODO
488 
489       case EFL_INPUT_VALUE_TILT_Y:
490         return EINA_FALSE; // TODO
491 
492       case EFL_INPUT_VALUE_TWIST:
493         return EINA_FALSE; // TODO
494 
495       case EFL_INPUT_VALUE_WHEEL_DELTA:
496         pd->wheel.z = (int) val;
497         break;
498 
499       case EFL_INPUT_VALUE_WHEEL_ANGLE:
500         return EINA_FALSE; // TODO
501 
502       case EFL_INPUT_VALUE_WHEEL_HORIZONTAL:
503         pd->wheel.horizontal = (((int) val) == 1);
504         break;
505 
506       case EFL_INPUT_VALUE_SLIDER:
507         return EINA_FALSE; // TODO
508 
509       default:
510         return EINA_FALSE;
511      }
512 
513    _efl_input_value_mark(pd, key);
514    return EINA_TRUE;
515 }
516 
517 EOLIAN static double
_efl_input_pointer_value_get(const Eo * obj EINA_UNUSED,Efl_Input_Pointer_Data * pd,Efl_Input_Value key)518 _efl_input_pointer_value_get(const Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Input_Value key)
519 {
520    switch (key)
521      {
522       case EFL_INPUT_VALUE_TIMESTAMP:
523         return (double) pd->timestamp / 1000.0;
524 
525       case EFL_INPUT_VALUE_BUTTON:
526         return (double) pd->button;
527 
528       case EFL_INPUT_VALUE_BUTTONS_PRESSED:
529         return (double) pd->pressed_buttons;
530 
531       case EFL_INPUT_VALUE_TOUCH_ID:
532         return (double) pd->touch_id;
533 
534       case EFL_INPUT_VALUE_X:
535         return pd->cur.x;
536 
537       case EFL_INPUT_VALUE_Y:
538         return pd->cur.y;
539 
540       case EFL_INPUT_VALUE_DX:
541         return pd->cur.x - pd->prev.x;
542 
543       case EFL_INPUT_VALUE_DY:
544         return pd->cur.y - pd->prev.y;
545 
546       case EFL_INPUT_VALUE_PREVIOUS_X:
547         return pd->prev.x;
548 
549       case EFL_INPUT_VALUE_PREVIOUS_Y:
550         return pd->prev.y;
551 
552       case EFL_INPUT_VALUE_RAW_X:
553         if (!_efl_input_value_has(pd, EFL_INPUT_VALUE_RAW_X))
554           return pd->cur.x;
555         return pd->raw.x;
556 
557       case EFL_INPUT_VALUE_RAW_Y:
558         if (!_efl_input_value_has(pd, EFL_INPUT_VALUE_RAW_Y))
559           return pd->cur.y;
560         return pd->raw.y;
561 
562       case EFL_INPUT_VALUE_RADIUS:
563         return pd->radius;
564 
565       case EFL_INPUT_VALUE_RADIUS_X:
566         return pd->radius_x;
567 
568       case EFL_INPUT_VALUE_RADIUS_Y:
569         return pd->radius_y;
570 
571       case EFL_INPUT_VALUE_PRESSURE:
572         return pd->pressure;
573 
574       case EFL_INPUT_VALUE_DISTANCE:
575         return 0.0; // TODO
576 
577       case EFL_INPUT_VALUE_AZIMUTH:
578         return 0.0; // TODO
579 
580       case EFL_INPUT_VALUE_TILT:
581         return 0.0; // TODO
582 
583       case EFL_INPUT_VALUE_TILT_X:
584         return 0.0; // TODO
585 
586       case EFL_INPUT_VALUE_TILT_Y:
587         return 0.0; // TODO
588 
589       case EFL_INPUT_VALUE_TWIST:
590         return 0.0; // TODO
591 
592       case EFL_INPUT_VALUE_WHEEL_DELTA:
593         return (double) pd->wheel.z;
594 
595       case EFL_INPUT_VALUE_WHEEL_ANGLE:
596         return 0.0; // TODO (emulate??)
597 
598       case EFL_INPUT_VALUE_WHEEL_HORIZONTAL:
599         return (double) pd->wheel.horizontal;
600 
601       case EFL_INPUT_VALUE_SLIDER:
602         return 0.0; // TODO
603 
604       case EFL_INPUT_VALUE_NONE:
605       default:
606         return 0;
607      }
608 }
609 
610 EOLIAN static void *
_efl_input_pointer_efl_input_event_legacy_info_get(Eo * obj,Efl_Input_Pointer_Data * pd)611 _efl_input_pointer_efl_input_event_legacy_info_get(Eo *obj, Efl_Input_Pointer_Data *pd)
612 {
613    if (pd->legacy) return pd->legacy;
614    return efl_input_pointer_legacy_info_fill(NULL, obj, EVAS_CALLBACK_LAST, NULL);
615 }
616 
617 /* Internal EO APIs */
618 
619 #define EFL_INPUT_POINTER_EXTRA_OPS \
620    EFL_OBJECT_OP_FUNC(efl_input_legacy_info_get, _efl_input_pointer_efl_input_event_legacy_info_get)
621 
622 #include "efl_input_pointer.eo.c"
623