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