1 #define EFL_INPUT_EVENT_PROTECTED
3 #include "evas_common_private.h"
4 #include "evas_private.h"
6 int _evas_event_counter = 0;
9 _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
10 const Eina_Inlist *ilist,
11 const Eina_List *list,
13 int x, int y, int *no_rep, Eina_Bool source);
15 /* FIXME: use eina_list_clone */
17 evas_event_list_copy(Eina_List *list);
20 _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev);
23 _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev);
26 _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev);
29 _canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y,
30 unsigned int timestamp, const void *data);
33 _evas_event_feed_check(Evas_Public_Data *e)
35 if (EINA_LIKELY(!e->running_post_events)) return;
36 /* TIZEN_ONLY(20190906): do not to cause abort by input event feed from post
38 * e.g. "drag,start" callback of elm_interface_scroller
39 * is called in mouse move post event. If app sets size
40 * of an object in "drag,start" callback, then it may
41 * cause mouse move event again in the mouse move post
42 * event and the CRI log message is called. But since
43 * "drag,start" callback is called only once, the mouse
44 * move event is not called recursively.
46 //CRI("Feeding new input events from a post-event callback is risky!");
47 DBG("Feeding new input events from a post-event callback is risky!");
51 static inline Eina_Bool
52 _evas_event_object_pointer_allow(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object_Pointer_Data *obj_pdata)
54 return (obj->is_event_parent || evas_object_clippers_is_visible(eo_obj, obj) || obj_pdata->mouse_grabbed) &&
55 (!evas_event_passes_through(eo_obj, obj)) &&
56 (!evas_event_freezes_through(eo_obj, obj)) &&
60 static inline Eina_Bool
61 _evas_event_object_pointer_allow_precise(Eo *eo_obj, Evas_Object_Protected_Data *obj, int x, int y, const Eina_List *ins)
63 return eina_list_data_find(ins, eo_obj) &&
64 ((!obj->precise_is_inside) || evas_object_is_inside(eo_obj, obj, x, y));
67 #define EVAS_EVENT_FEED_SAFETY_CHECK(evas) _evas_event_feed_check(evas)
70 _evas_event_havemap_adjust_f_inline(Evas_Object_Protected_Data *obj, Eina_Vector2 *point, Eina_Bool mouse_grabbed)
72 Eina_Bool ret = EINA_FALSE;
74 if (obj->smart.parent)
76 Evas_Object_Protected_Data *smart_parent_obj = efl_data_scope_get(obj->smart.parent, EFL_CANVAS_OBJECT_CLASS);
77 ret |= _evas_event_havemap_adjust_f_inline(smart_parent_obj, point, mouse_grabbed);
80 if ((!obj->map->cur.usemap) || (!obj->map->cur.map)) return ret;
82 //FIXME: Unless map_coords_get() supports grab mode and extrapolate coords
83 //outside map, this should check the return value for outside case.
85 //FIXME: When Mouse Out, it fails. but the coordiates might be transformed as well.
86 if (evas_map_coords_get(obj->map->cur.map, point->x, point->y, &point->x, &point->y, mouse_grabbed))
88 point->x += obj->cur->geometry.x;
89 point->y += obj->cur->geometry.y;
96 _evas_event_havemap_adjust_f(Evas_Object_Protected_Data *obj, Eina_Vector2 *cur_pt, Eina_Vector2 *prev_pt, Eina_Bool mouse_grabbed)
98 Eina_Vector2 tmp_pt = *cur_pt;
99 if (!_evas_event_havemap_adjust_f_inline(obj, &tmp_pt, mouse_grabbed)) return;
101 prev_pt->x += (tmp_pt.x - cur_pt->x);
102 prev_pt->y += (tmp_pt.y - cur_pt->y);
108 # define DDD(...) do { for (int _i = 0; _i < spaces; _i++) printf(" "); printf(__VA_ARGS__); } while (0)
109 # define D(...) do { printf(__VA_ARGS__); } while (0)
110 # define DDD_STATIC static
112 # define DDD(...) do { } while (0)
113 # define D(...) do { } while (0)
119 walk_clippers_print(int spaces, Evas_Object_Protected_Data *obj)
121 DDD("<<< CLIP %p c[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i]\n",
123 obj->cur->geometry.x, obj->cur->geometry.y,
124 obj->cur->geometry.w, obj->cur->geometry.h,
125 obj->cur->cache.clip.x, obj->cur->cache.clip.y,
126 obj->cur->cache.clip.w, obj->cur->cache.clip.h
128 if (obj->cur->clipper) walk_clippers_print(spaces + 1, obj->cur->clipper);
133 clip_calc(Evas_Object_Protected_Data *obj, Eina_Rectangle *c)
136 RECTS_CLIP_TO_RECT(c->x, c->y, c->w, c->h,
137 obj->cur->geometry.x, obj->cur->geometry.y,
138 obj->cur->geometry.w, obj->cur->geometry.h);
139 clip_calc(obj->cur->clipper, c);
143 _evas_event_object_list_raw_in_get_single(Evas *eo_e, Evas_Object_Protected_Data *obj, Eina_List *in, Evas_Object *stop,
144 int x, int y, int *no_rep, Eina_Bool source, int spaces EINA_UNUSED)
148 Evas_Object *eo_obj = obj->object;
152 DDD("***** NO REP - STOP *****\n");
156 //TIZEN_ONLY(20190708):evas_event: fix proxy event is not passed through
157 if (evas_event_passes_through(eo_obj, obj)) return in;
160 //TIZEN_ONLY(20230203):evas_event: only frame object is operated in frame area.
161 int vx = 0, vy = 0, vw = 0, vh = 0;
163 evas_output_viewport_get(eo_e, &vx, &vy, &vw, &vh);
164 evas_output_framespace_get(eo_e, NULL, NULL, &fw, &fh);
166 if ((!RECTS_INTERSECT(x, y, 1, 1, vx, vy, vw - fw, vh - fh)) && (!obj->is_frame)) return in;
169 if ((!obj->cur->visible) && (!obj->is_event_parent)) return in;
170 // XXX: this below DYNAMICALLY calculates the current clip rect
171 // by walking clippers to each parent clipper until there are
172 // no more of them. this is a necessary hack because cache.clip
173 // cooreds are broken. somewhere along the way in the past few years
174 // someone has forgotten to flag them as dirty and update them
175 // so a clicp recalce caqn work... somewhere. maybe a prexy or map fix
176 // or an optimization. finding this is really hard, so i'm going
177 // for plan b and doing this on the fly. it's only for event or
178 // callback handling so its a small percentage of the time, but
179 // it's better that we get this right
181 if (EINA_UNLIKELY((!!obj->map) && (obj->map->cur.map)
182 && (obj->map->cur.usemap)))
183 c = obj->map->cur.map->normal_geometry;
188 Eina_Rectangle bounding_box = { 0, };
190 evas_object_smart_bounding_box_update(obj);
191 evas_object_smart_bounding_box_get(obj, &bounding_box, NULL);
196 if (obj->clip.clipees) return in;
197 c = obj->cur->geometry;
200 clip_calc(obj->cur->clipper, &c);
201 // only worry about objects that intersect INCLUDING clippint
202 if ((!RECTS_INTERSECT(x, y, 1, 1, c.x, c.y, c.w, c.h)) && (!obj->child_has_map))
207 Eina_Rectangle bounding_box = { 0, 0, 0, 0 };
209 evas_object_smart_bounding_box_get(obj, &bounding_box, NULL);
210 DDD("___ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] b[%6i %6i %6ix%6i] %s\n",
212 obj->cur->geometry.x, obj->cur->geometry.y,
213 obj->cur->geometry.w, obj->cur->geometry.h,
214 obj->cur->cache.clip.x, obj->cur->cache.clip.y,
215 obj->cur->cache.clip.w, obj->cur->cache.clip.h,
216 bounding_box.x, bounding_box.y,
217 bounding_box.w, bounding_box.h,
222 DDD("___ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] %s\n",
224 obj->cur->geometry.x, obj->cur->geometry.y,
225 obj->cur->geometry.w, obj->cur->geometry.h,
226 obj->cur->cache.clip.x, obj->cur->cache.clip.y,
227 obj->cur->cache.clip.w, obj->cur->cache.clip.h,
230 if (!strcmp(obj->type, "e_layout"))
232 if (obj->cur->clipper)
233 walk_clippers_print(spaces + 1, obj->cur->clipper);
243 Eina_Rectangle bounding_box = { 0, 0, 0, 0 };
245 evas_object_smart_bounding_box_get(obj, &bounding_box, NULL);
246 DDD("OBJ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] b[%6i %6i %6ix%6i] %s\n",
248 obj->cur->geometry.x, obj->cur->geometry.y,
249 obj->cur->geometry.w, obj->cur->geometry.h,
250 obj->cur->cache.clip.x, obj->cur->cache.clip.y,
251 obj->cur->cache.clip.w, obj->cur->cache.clip.h,
252 bounding_box.x, bounding_box.y,
253 bounding_box.w, bounding_box.h,
258 DDD("OBJ %p g[%6i %6i %6ix%6i] c[%6i %6i %6ix%6i] %s\n",
260 obj->cur->geometry.x, obj->cur->geometry.y,
261 obj->cur->geometry.w, obj->cur->geometry.h,
262 obj->cur->cache.clip.x, obj->cur->cache.clip.y,
263 obj->cur->cache.clip.w, obj->cur->cache.clip.h,
266 // if (!strcmp(obj->type, "e_layout"))
268 if (obj->cur->clipper)
269 walk_clippers_print(spaces + 1, obj->cur->clipper);
276 if (evas_object_is_source_invisible(eo_obj, obj)) return in;
278 if ((obj->delete_me == 0) &&
279 ((source) || ((obj->cur->visible || obj->is_event_parent) && (!obj->clip.clipees) &&
280 (obj->is_event_parent || evas_object_clippers_is_visible(eo_obj, obj)))))
284 DDD("CHILDREN ->\n");
285 Evas_Object_Protected_Data *clip = obj->cur->clipper;
288 if (clip && clip->mask->is_mask && clip->precise_is_inside)
289 if (!evas_object_is_inside(clip->object, clip, x, y))
292 if ((obj->map->cur.usemap) && (obj->map->cur.map))
294 inside = evas_object_is_in_output_rect(eo_obj, obj, x, y, 1, 1);
297 if (!evas_map_coords_get(obj->map->cur.map, x, y,
298 &(obj->map->cur.map->mx),
299 &(obj->map->cur.map->my), 0))
305 in = _evas_event_object_list_in_get
307 evas_object_smart_members_get_direct(eo_obj),
310 obj->cur->geometry.x + obj->map->cur.map->mx,
311 obj->cur->geometry.y + obj->map->cur.map->my,
318 Eina_Rectangle bounding_box = { 0, };
320 if (!obj->child_has_map)
321 evas_object_smart_bounding_box_update(obj);
323 evas_object_smart_bounding_box_get(obj, &bounding_box, NULL);
325 if (obj->child_has_map ||
326 (bounding_box.x <= x &&
327 bounding_box.x + bounding_box.w >= x &&
328 bounding_box.y <= y &&
329 bounding_box.y + bounding_box.h >= y) ||
330 (obj->cur->geometry.x <= x &&
331 obj->cur->geometry.x + obj->cur->geometry.w >= x &&
332 obj->cur->geometry.y <= y &&
333 obj->cur->geometry.y + obj->cur->geometry.h >= y))
334 in = _evas_event_object_list_in_get
335 (eo_e, in, evas_object_smart_members_get_direct(eo_obj), NULL,
336 stop, x, y, &norep, source);
340 if (!obj->repeat_events)
343 DDD("***** NO REP1 *****\n");
348 else if (obj->is_event_parent)
351 in = _evas_event_object_list_in_get(eo_e, in,
352 NULL, evas_object_event_grabber_members_list(eo_obj),
353 stop, x, y, &norep, source);
356 if (!obj->repeat_events)
359 DDD("***** NO REP1 *****\n");
366 Evas_Object_Protected_Data *clip = obj->cur->clipper;
367 if (clip && clip->mask->is_mask && clip->precise_is_inside)
368 inside = evas_object_is_inside(clip->object, clip, x, y);
370 inside = evas_object_is_in_output_rect(eo_obj, obj, x, y, 1, 1);
374 if ((obj->map->cur.usemap) && (obj->map->cur.map))
376 if (!evas_map_coords_get(obj->map->cur.map, x, y,
377 &(obj->map->cur.map->mx),
378 &(obj->map->cur.map->my), 0))
384 if (inside && ((!obj->precise_is_inside) ||
385 (evas_object_is_inside(eo_obj, obj, x, y))))
387 if (!evas_event_freezes_through(eo_obj, obj))
389 DDD("----------------> ADD obj %p\n", obj->object);
390 in = eina_list_append(in, eo_obj);
392 if (!obj->repeat_events)
395 DDD("***** NO REP2 *****\n");
405 _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
406 const Eina_Inlist *ilist,
407 const Eina_List *list,
409 int x, int y, int *no_rep, Eina_Bool source,
410 Eina_Bool must_walk_last)
412 Evas_Object_Protected_Data *obj = NULL;
413 DDD_STATIC int spaces = 0;
415 if ((!ilist) && (!list)) return in;
422 if (must_walk_last) last = eina_inlist_last(ilist);
423 else last = ilist->last;
424 for (obj = _EINA_INLIST_CONTAINER(obj, last);
426 obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
428 if (obj->events->parent) continue;
429 in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces);
430 if (*no_rep) goto end;
437 EINA_LIST_REVERSE_FOREACH(list, l, obj)
439 in = _evas_event_object_list_raw_in_get_single(eo_e, obj, in, stop, x, y, no_rep, source, spaces);
440 if (*no_rep) goto end;
451 _transform_to_src_space_f(Evas_Object_Protected_Data *obj, Evas_Object_Protected_Data *src,
452 Eina_Vector2 *cur_pt, Eina_Vector2 *prev_pt)
454 double obj_w = obj->cur->geometry.w, obj_h = obj->cur->geometry.h;
455 double src_w = src->cur->geometry.w, src_h = src->cur->geometry.h;
458 cur_pt->x -= obj->cur->geometry.x;
459 cur_pt->y -= obj->cur->geometry.y;
461 if (!EINA_DBL_EQ(obj_w, src_w)) cur_pt->x *= (src_w / obj_w);
462 if (!EINA_DBL_EQ(obj_h, src_h)) cur_pt->y *= (src_h / obj_h);
464 cur_pt->x += src->cur->geometry.x;
465 cur_pt->y += src->cur->geometry.y;
468 prev_pt->x -= obj->cur->geometry.x;
469 prev_pt->y -= obj->cur->geometry.y;
471 if (!EINA_DBL_EQ(obj_w, src_w)) prev_pt->x *= (src_w / obj_w);
472 if (!EINA_DBL_EQ(obj_h, src_h)) prev_pt->y *= (src_h / obj_h);
474 prev_pt->x += src->cur->geometry.x;
475 prev_pt->y += src->cur->geometry.y;
478 static Efl_Input_Device *
479 _evas_event_legacy_device_get(Eo *evas, Eina_Bool mouse)
481 Efl_Input_Device *dev = _evas_device_top_get(evas);
482 //The user did not push a device, use the default mouse/keyboard instead.
485 Evas_Public_Data *e = efl_data_scope_get(evas, EVAS_CANVAS_CLASS);
486 //TIZEN_ONLY(20180530): add storing last mouse device.
489 if (e->last_mouse) return e->last_mouse;
490 return e->default_mouse;
493 return e->default_keyboard;
498 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
500 _source_child_del_cb(void *data, const Efl_Event *event)
503 Eo *obj = event->object;
504 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
506 if (!src || src->delete_me) return;
508 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
509 proxy_write->src_event_in = eina_list_remove(proxy_write->src_event_in, obj);
510 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
514 _source_child_callback_add(Evas_Object *eo_src)
516 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
517 Evas_Object *eo_child;
520 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
522 efl_event_callback_add(eo_child, EFL_EVENT_DEL, _source_child_del_cb, eo_src);
527 _source_child_callback_del(Evas_Object *eo_src)
529 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
530 Evas_Object *eo_child;
533 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
535 efl_event_callback_del(eo_child, EFL_EVENT_DEL, _source_child_del_cb, eo_src);
541 _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
542 Efl_Input_Pointer *parent_ev,
543 Evas_Pointer_Data *pdata,
546 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
547 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
548 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
549 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
550 Evas_Object_Protected_Data *child;
551 Evas_Object *eo_child;
553 Efl_Input_Pointer_Data *ev;
554 Efl_Input_Pointer *evt;
555 Eina_Vector2 cur_pt, prev_pt;
560 if (obj->delete_me || src->delete_me || e->is_frozen) return;
562 evt = efl_duplicate(parent_ev);
563 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
566 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
573 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
575 Evas_Object_Pointer_Data *obj_pdata;
577 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
578 obj_pdata = _evas_object_pointer_data_get(pdata, child);
581 ERR("Could not find the object pointer data for device %p",
585 srcgrab += obj_pdata->mouse_grabbed;
590 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
592 if (proxy_write->src_event_in)
594 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
595 _source_child_callback_del(eo_src);
596 proxy_write->src_event_in = eina_list_free(proxy_write->src_event_in);
602 proxy_write->src_event_in = _evas_event_object_list_raw_in_get
603 (eo_e, proxy_write->src_event_in,
604 evas_object_smart_members_get_direct(eo_src), NULL,
605 NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
607 else if (src->is_event_parent)
609 proxy_write->src_event_in = _evas_event_object_list_raw_in_get
610 (eo_e, proxy_write->src_event_in,
611 NULL, evas_object_event_grabber_members_list(eo_src),
612 NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
615 proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src);
617 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
619 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
620 _source_child_callback_add(eo_src);
624 if (pdata->seat->mouse_grabbed == 0)
626 if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
629 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
631 Evas_Object_Pointer_Data *obj_pdata;
633 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
634 obj_pdata = _evas_object_pointer_data_get(pdata, child);
637 ERR("Could not find the object pointer data for device %p",
641 if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
642 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
644 obj_pdata->mouse_grabbed += (addgrab + 1);
645 pdata->seat->mouse_grabbed += (addgrab + 1);
646 if (obj_pdata->pointer_mode ==
647 EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
649 pdata->seat->nogrep++;
655 copy = evas_event_list_copy(src->proxy->src_event_in);
656 EINA_LIST_FOREACH(copy, l, eo_child)
658 Evas_Object_Pointer_Data *obj_pdata;
659 Evas_Object_Pointer_Mode pointer_mode;
661 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
662 obj_pdata = _evas_object_pointer_data_get(pdata, child);
665 ERR("Could not find the object pointer data for device %p",
669 pointer_mode = obj_pdata->pointer_mode;
674 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
676 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_DOWN, evt,
677 event_id, EFL_EVENT_POINTER_DOWN);
678 if (e->delete_me) break;
679 if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
682 eina_list_free(copy);
688 _evas_event_mouse_in_set(Evas_Pointer_Seat *pseat,
689 Evas_Object_Protected_Data *obj, Eina_Bool mouse_in)
691 Evas_Pointer_Data *pdata;
692 Evas_Object_Pointer_Data *obj_pdata;
694 if ((!pseat) || (!obj)) return;
696 EINA_INLIST_FOREACH(pseat->pointers, pdata)
698 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
700 obj_pdata->mouse_in = mouse_in;
705 _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
706 Efl_Input_Pointer *parent_ev,
707 Evas_Pointer_Data *pdata,
710 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
711 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
712 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
713 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
714 Evas_Object_Protected_Data *child;
715 Evas_Object *eo_child;
717 Efl_Input_Pointer_Data *ev;
718 Efl_Input_Pointer *evt;
719 Eina_Vector2 cur_pt_real, prev_pt_real, cur_pt, prev_pt;
720 Evas_Object_Pointer_Data *obj_pdata;
722 if (obj->delete_me || src->delete_me || e->is_frozen) return;
724 evt = efl_duplicate(parent_ev);
725 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
728 cur_pt_real = ev->cur;
729 prev_pt_real = ev->prev;
731 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
738 if (pdata->seat->mouse_grabbed)
740 Eina_List *outs = NULL;
741 Eina_List *copy = evas_event_list_copy(src->proxy->src_event_in);
743 EINA_LIST_FOREACH(copy, l, eo_child)
745 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
746 //FIXME: When object is deleted in the src_event_in list,
747 //the src_event_in list should be updated. But now there is no way.
748 //So add checking NULL logic, please delete it if you make a better way.
749 if (!child) continue;
751 obj_pdata = _evas_object_pointer_data_get(pdata, child);
754 ERR("Could not find the object pointer data for device %p",
759 if (_evas_event_object_pointer_allow(eo_child, child, obj_pdata))
764 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
766 ev->action = EFL_POINTER_ACTION_MOVE;
767 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
768 event_id, EFL_EVENT_POINTER_MOVE);
771 outs = eina_list_append(outs, eo_child);
772 if (e->delete_me || e->is_frozen) break;
773 //FIXME: take care nograb object
775 eina_list_free(copy);
777 EINA_LIST_FREE(outs, eo_child)
779 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
780 if (child->delete_me) continue;
781 obj_pdata = _evas_object_pointer_data_get(pdata, child);
784 ERR("Could not find the object pointer data for device %p",
788 if ((obj_pdata->mouse_grabbed == 0) && (!e->delete_me))
790 if (obj_pdata->mouse_in) continue; /* FIXME: dubious logic! */
791 _evas_event_mouse_in_set(pdata->seat, child, 0);
792 if (e->is_frozen) continue;
794 ev->cur = cur_pt_real;
795 ev->prev = prev_pt_real;
797 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
799 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
800 efl_event_callback_del(eo_child, EFL_EVENT_DEL, _source_child_del_cb, eo_src);
802 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
803 proxy_write->src_event_in = eina_list_remove(proxy_write->src_event_in, eo_child);
804 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
806 ev->action = EFL_POINTER_ACTION_OUT;
807 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_OUT, evt,
808 event_id, EFL_EVENT_POINTER_OUT);
814 Eina_List *ins = NULL;
815 Eina_List *copy = evas_event_list_copy(src->proxy->src_event_in);
820 ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src),
821 NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
823 else if (src->is_event_parent)
826 ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL,
827 evas_object_event_grabber_members_list(eo_src),
828 NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
831 ins = eina_list_append(ins, eo_src);
833 EINA_LIST_FOREACH(copy, l, eo_child)
835 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
836 //FIXME: When object is deleted in the src_event_in list,
837 //the src_event_in list should be updated. But now there is no way.
838 //So add checking NULL logic, please delete it if you make a better way.
839 if (!child) continue;
841 obj_pdata = _evas_object_pointer_data_get(pdata, child);
844 ERR("Could not find the object pointer data for device %p",
851 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
853 if (evas_object_is_in_output_rect(eo_child, child,
854 ev->cur.x, ev->cur.y, 1, 1) &&
855 _evas_event_object_pointer_allow(eo_child, child, obj_pdata) &&
856 _evas_event_object_pointer_allow_precise(eo_child, child, ev->cur.x, ev->cur.y, ins))
858 ev->action = EFL_POINTER_ACTION_MOVE;
859 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
860 event_id, EFL_EVENT_POINTER_MOVE);
862 else if (obj_pdata->mouse_in)
864 _evas_event_mouse_in_set(pdata->seat, child, 0);
865 if (e->is_frozen) continue;
866 ev->action = EFL_POINTER_ACTION_OUT;
867 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_OUT, evt,
868 event_id, EFL_EVENT_POINTER_OUT);
869 if (e->delete_me) break;
872 if (e->delete_me || e->is_frozen) break;
874 eina_list_free(copy);
876 int event_id2 = _evas_object_event_new();
877 EINA_LIST_FOREACH(ins, l, eo_child)
879 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
880 obj_pdata = _evas_object_pointer_data_get(pdata, child);
883 ERR("Could not find the object pointer data for device %p",
887 if (!eina_list_data_find(src->proxy->src_event_in, eo_child))
889 if (!obj_pdata->mouse_in)
891 _evas_event_mouse_in_set(pdata->seat, child, 1);
892 if (e->is_frozen) continue;
897 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
899 ev->action = EFL_POINTER_ACTION_IN;
900 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_IN, evt,
901 event_id2, EFL_EVENT_POINTER_IN);
902 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
904 ev->action = EFL_POINTER_ACTION_MOVE;
905 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
906 event_id2, EFL_EVENT_POINTER_MOVE);
908 if (e->delete_me) break;
913 if (pdata->seat->mouse_grabbed == 0)
915 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
916 _source_child_callback_del(eo_src);
919 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
921 eina_list_free(proxy_write->src_event_in);
922 proxy_write->src_event_in = ins;
924 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
926 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
927 _source_child_callback_add(eo_src);
932 if (ins) eina_list_free(ins);
940 _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e,
941 Efl_Input_Pointer *parent_ev,
942 Evas_Pointer_Data *pdata,
943 int event_id, Eina_Bool cancel)
945 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
946 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
947 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
948 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
949 Evas_Object_Protected_Data *child;
950 Evas_Object *eo_child;
952 Efl_Input_Pointer_Data *ev;
953 Efl_Input_Pointer *evt;
954 Eina_Vector2 cur_pt, prev_pt;
956 if (obj->delete_me || src->delete_me || e->is_frozen) return;
958 evt = efl_duplicate(parent_ev);
959 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
962 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
969 copy = evas_event_list_copy(src->proxy->src_event_in);
970 EINA_LIST_FOREACH(copy, l, eo_child)
972 Evas_Object_Pointer_Data *obj_pdata;
973 Evas_Object_Pointer_Mode pointer_mode;
975 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
976 obj_pdata = _evas_object_pointer_data_get(pdata, child);
979 ERR("Could not find the object pointer data for device %p",
983 if ((!cancel) && ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
984 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
985 (obj_pdata->mouse_grabbed > 0))
987 obj_pdata->mouse_grabbed--;
988 pdata->seat->mouse_grabbed--;
991 pointer_mode = obj_pdata->pointer_mode;
996 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
999 efl_event_callback_call(eo_child, EFL_EVENT_POINTER_CANCEL, evt);
1001 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_UP, evt,
1002 event_id, EFL_EVENT_POINTER_UP);
1003 if (e->delete_me) break;
1004 if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
1006 if ((!cancel) && (pdata->seat->nogrep > 0)) pdata->seat->nogrep--;
1010 eina_list_free(copy);
1016 _evas_event_source_hold_events(Evas_Object *eo_obj, int event_id, Efl_Input_Hold *evt)
1018 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1019 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
1020 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1021 Evas_Object_Protected_Data *child;
1022 Evas_Object *eo_child;
1025 if (obj->layer->evas->is_frozen) return;
1027 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
1029 if (src->delete_me) return;
1030 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1031 evas_object_event_callback_call(eo_child, child,
1032 EVAS_CALLBACK_HOLD, evt,
1033 event_id, EFL_EVENT_HOLD);
1034 if (src->layer->evas->delete_me) break;
1039 _evas_event_source_wheel_events(Evas_Object *eo_obj, Evas *eo_e,
1040 Efl_Input_Pointer *parent_ev, int event_id)
1042 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1043 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
1044 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1045 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1046 Evas_Object_Protected_Data *child;
1047 Evas_Object *eo_child;
1048 Eina_List *copy, *l;
1049 Efl_Input_Pointer_Data *ev;
1050 Efl_Input_Pointer *evt;
1051 Eina_Vector2 cur_pt, prev_pt;
1052 Evas_Pointer_Data *pdata;
1054 if (obj->delete_me || src->delete_me || obj->layer->evas->is_frozen) return;
1056 evt = efl_duplicate(parent_ev);
1057 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1060 pdata = _evas_pointer_data_by_device_get(e, ev->device);
1063 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1067 ev->source = eo_obj;
1069 copy = evas_event_list_copy(src->proxy->src_event_in);
1070 EINA_LIST_FOREACH(copy, l, eo_child)
1072 Evas_Object_Pointer_Data *obj_pdata;
1074 if (src->delete_me) return;
1075 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1076 //FIXME: When object is deleted in the src_event_in list,
1077 //the src_event_in list should be updated. But now there is no way.
1078 //So add checking NULL logic, please delete it if you make a better way.
1079 if (!child) continue;
1081 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1084 ERR("Could not find the object pointer data for device %p",
1090 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1092 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_WHEEL, evt,
1093 event_id, EFL_EVENT_POINTER_WHEEL);
1094 if (e->delete_me) break;
1096 eina_list_free(copy);
1102 _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
1103 Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
1106 Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
1107 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1108 Evas_Object_Protected_Data *child;
1109 Evas_Object *eo_child;
1110 Eina_List *copy, *l;
1111 Efl_Input_Pointer_Data *ev;
1112 Efl_Input_Pointer *evt;
1113 Eina_Vector2 cur_pt, prev_pt;
1114 Evas_Object_Pointer_Data *obj_pdata;
1117 if (obj->delete_me || src->delete_me || obj->layer->evas->is_frozen) return;
1119 evt = efl_duplicate(parent_ev);
1120 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1123 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1127 ev->source = obj->object;
1128 ev->action = EFL_POINTER_ACTION_DOWN;
1130 if (pdata->seat->mouse_grabbed == 0)
1132 if (pdata->seat->downs > 1)
1133 addgrab = pdata->seat->downs - 1;
1134 else /* this is the first touch, which means it's also a move event, which means we need to redo this */
1136 Eina_List *ins = NULL;
1141 ins = _evas_event_object_list_raw_in_get
1142 (e->evas, ins, evas_object_smart_members_get_direct(eo_src), NULL, NULL,
1143 ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1145 if (src->is_event_parent)
1148 ins = _evas_event_object_list_raw_in_get
1149 (e->evas, ins, NULL, evas_object_event_grabber_members_list(eo_src), NULL,
1150 ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1153 ins = eina_list_append(ins, eo_src);
1154 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
1156 eina_list_free(proxy_write->src_event_in);
1157 proxy_write->src_event_in = ins;
1159 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
1163 EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
1165 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1166 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1169 ERR("Could not find the object pointer data for device %p",
1173 if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
1175 obj_pdata->mouse_grabbed += (addgrab + 1);
1176 pdata->seat->mouse_grabbed += (addgrab + 1);
1180 copy = evas_event_list_copy(src->proxy->src_event_in);
1181 EINA_LIST_FOREACH(copy, l, eo_child)
1183 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1184 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1187 ERR("Could not find the object pointer data for device %p",
1194 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1196 evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_DOWN, evt,
1197 event_id, EFL_EVENT_FINGER_DOWN);
1198 if (e->delete_me) break;
1200 eina_list_free(copy);
1206 _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
1207 Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
1210 Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
1211 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1212 Evas_Object_Protected_Data *child;
1213 Evas_Object *eo_child;
1214 Eina_List *copy, *l;
1215 Efl_Input_Pointer_Data *ev;
1216 Efl_Input_Pointer *evt;
1217 Eina_Vector2 cur_pt, prev_pt;
1219 if (obj->delete_me || src->delete_me || obj->layer->evas->is_frozen) return;
1221 evt = efl_duplicate(parent_ev);
1222 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1225 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1230 ev->source = obj->object;
1231 ev->action = EFL_POINTER_ACTION_UP;
1233 copy = evas_event_list_copy(src->proxy->src_event_in);
1234 EINA_LIST_FOREACH(copy, l, eo_child)
1236 Evas_Object_Pointer_Data *obj_pdata;
1238 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1240 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1243 ERR("Could not find the object pointer data for device %p",
1248 if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
1249 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
1250 (obj_pdata->mouse_grabbed > 0))
1252 obj_pdata->mouse_grabbed--;
1253 pdata->seat->mouse_grabbed--;
1257 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1259 evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_UP, evt,
1260 event_id, EFL_EVENT_FINGER_UP);
1261 if (e->delete_me || e->is_frozen) break;
1263 eina_list_free(copy);
1269 _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Public_Data *e,
1270 Efl_Input_Pointer *parent_ev, Evas_Pointer_Data *pdata,
1273 Evas_Object *eo_src = _evas_object_image_source_get(obj->object);
1274 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1275 Evas_Object_Protected_Data *child;
1276 Evas_Object *eo_child;
1277 Eina_List *copy, *l;
1278 Efl_Input_Pointer_Data *ev;
1279 Efl_Input_Pointer *evt;
1280 Eina_Vector2 cur_pt, prev_pt;
1281 Evas_Object_Pointer_Data *obj_pdata;
1282 Evas *eo_e = e->evas;
1284 if (obj->delete_me || src->delete_me || e->is_frozen) return;
1286 evt = efl_duplicate(parent_ev);
1287 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1290 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1294 ev->source = obj->object;
1295 ev->action = EFL_POINTER_ACTION_UP;
1297 /* Why a new event id here? Other 'source' events keep the same id. */
1298 event_id = _evas_object_event_new();
1300 if (pdata->seat->mouse_grabbed > 0)
1302 copy = evas_event_list_copy(src->proxy->src_event_in);
1303 EINA_LIST_FOREACH(copy, l, eo_child)
1305 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1306 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1309 ERR("Could not find the object pointer data for device %p",
1313 if (_evas_event_object_pointer_allow(eo_child, child, obj_pdata))
1317 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1319 evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
1320 event_id, EFL_EVENT_FINGER_MOVE);
1321 if (e->delete_me || e->is_frozen) break;
1324 eina_list_free(copy);
1328 Eina_List *ins = NULL;
1333 ins = _evas_event_object_list_raw_in_get
1334 (eo_e, ins, evas_object_smart_members_get_direct(eo_src), NULL, NULL,
1335 ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1337 if (src->is_event_parent)
1340 ins = _evas_event_object_list_raw_in_get
1341 (eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src), NULL,
1342 ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1345 ins = eina_list_append(ins, eo_src);
1347 copy = evas_event_list_copy(src->proxy->src_event_in);
1348 EINA_LIST_FOREACH(copy, l, eo_child)
1350 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1351 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1354 ERR("Could not find the object pointer data for device %p",
1361 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1363 if (evas_object_is_in_output_rect(eo_child, child, ev->cur.x, ev->cur.y, 1, 1) &&
1364 _evas_event_object_pointer_allow(eo_child, child, obj_pdata) &&
1365 _evas_event_object_pointer_allow_precise(eo_child, child, ev->cur.x, ev->cur.y, ins))
1367 evas_object_event_callback_call(obj->object, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
1368 event_id, EFL_EVENT_FINGER_MOVE);
1369 if (e->delete_me || e->is_frozen) break;
1372 eina_list_free(copy);
1373 if (pdata->seat->mouse_grabbed == 0)
1375 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
1376 _source_child_callback_del(eo_src);
1379 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
1381 eina_list_free(proxy_write->src_event_in);
1382 proxy_write->src_event_in = ins;
1384 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
1386 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
1387 _source_child_callback_add(eo_src);
1391 eina_list_free(ins);
1398 _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e,
1399 Efl_Input_Pointer *parent_ev, int event_id)
1401 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1402 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
1403 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1404 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1405 Evas_Object_Protected_Data *child;
1406 Evas_Object *eo_child;
1407 Eina_List *ins = NULL, *l;
1408 Efl_Input_Pointer_Data *ev;
1409 Efl_Input_Pointer *evt;
1410 Eina_Vector2 cur_pt, prev_pt;
1411 Evas_Pointer_Data *pdata;
1413 if (obj->delete_me || src->delete_me || e->is_frozen) return;
1414 evt = efl_duplicate(parent_ev);
1416 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1419 pdata = _evas_pointer_data_by_device_get(e, ev->device);
1422 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1426 ev->source = eo_obj;
1427 ev->action = EFL_POINTER_ACTION_IN;
1432 ins = _evas_event_object_list_raw_in_get(eo_e, ins, evas_object_smart_members_get_direct(eo_src),
1433 NULL, NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1436 else if (src->is_event_parent)
1439 ins = _evas_event_object_list_raw_in_get(eo_e, ins, NULL, evas_object_event_grabber_members_list(eo_src),
1440 NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE, EINA_FALSE);
1444 ins = eina_list_append(ins, eo_src);
1446 EINA_LIST_FOREACH(ins, l, eo_child)
1448 Evas_Object_Pointer_Data *obj_pdata;
1450 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1451 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1454 ERR("Could not find the object pointer data for device %p",
1459 if (!eina_list_data_find(src->proxy->src_event_in, eo_child))
1461 if (obj_pdata->mouse_in) continue;
1462 _evas_event_mouse_in_set(pdata->seat, child, 1);
1466 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1468 ev->action = EFL_POINTER_ACTION_IN;
1469 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_IN, evt,
1470 event_id, EFL_EVENT_POINTER_IN);
1471 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
1473 ev->action = EFL_POINTER_ACTION_MOVE;
1474 evas_object_event_callback_call(eo_child, child, EVAS_CALLBACK_MOUSE_MOVE, evt,
1475 event_id, EFL_EVENT_POINTER_MOVE);
1477 if (e->delete_me || e->is_frozen) break;
1481 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
1482 _source_child_callback_del(eo_src);
1485 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
1487 eina_list_free(proxy_write->src_event_in);
1488 proxy_write->src_event_in = ins;
1490 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
1492 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
1493 _source_child_callback_add(eo_src);
1500 _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
1501 Efl_Input_Pointer *parent_ev, int event_id)
1503 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1504 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
1505 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
1506 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1507 Evas_Object_Protected_Data *child;
1508 Evas_Object *eo_child;
1509 Eina_List *copy, *l;
1510 Efl_Input_Pointer_Data *ev;
1511 Efl_Input_Pointer *evt;
1512 Eina_Vector2 cur_pt, prev_pt;
1513 Evas_Pointer_Data *pdata;
1515 if (obj->delete_me || src->delete_me || e->is_frozen) return;
1517 evt = efl_duplicate(parent_ev);
1518 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1521 pdata = _evas_pointer_data_by_device_get(e, ev->device);
1524 _transform_to_src_space_f(obj, src, &ev->cur, &ev->prev);
1528 ev->source = eo_obj;
1529 ev->action = EFL_POINTER_ACTION_OUT;
1531 copy = evas_event_list_copy(src->proxy->src_event_in);
1532 EINA_LIST_FOREACH(copy, l, eo_child)
1534 Evas_Object_Pointer_Data *obj_pdata;
1535 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
1536 obj_pdata = _evas_object_pointer_data_get(pdata, child);
1539 ERR("Could not find the object pointer data for device %p",
1544 if (!obj_pdata->mouse_in) continue;
1545 _evas_event_mouse_in_set(pdata->seat, child, 0);
1546 if (child->delete_me) continue;
1550 _evas_event_havemap_adjust_f(child, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1552 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
1553 event_id, EFL_EVENT_POINTER_OUT);
1554 if (e->is_frozen) continue;
1556 eina_list_free(copy);
1558 //TIZEN_ONLY(20200213): remove child object from list when child is deleted.
1559 _source_child_callback_del(eo_src);
1562 EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
1563 proxy_write->src_event_in = eina_list_free(proxy_write->src_event_in);
1564 EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
1570 _evas_event_object_list_in_get(Evas *eo_e, Eina_List *in,
1571 const Eina_Inlist *ilist,
1572 const Eina_List *list,
1574 int x, int y, int *no_rep, Eina_Bool source)
1576 return _evas_event_object_list_raw_in_get(eo_e, in, ilist, list, stop, x, y,
1577 no_rep, source, EINA_FALSE);
1581 _evas_event_objects_event_list_no_frozen_check(Evas *eo_e, Evas_Object *stop, int x, int y)
1583 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1585 Eina_List *in = NULL;
1587 if (!e->layers) return NULL;
1589 D("@@@@@ layer count = %i\n", eina_inlist_count(EINA_INLIST_GET(e->layers)));
1590 EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
1593 D("############################# check layer %i\n", lay->layer);
1594 in = _evas_event_object_list_in_get(eo_e, in,
1595 EINA_INLIST_GET(lay->objects), NULL,
1596 stop, x, y, &no_rep, EINA_FALSE);
1597 if (no_rep) return in;
1603 _evas_canvas_tree_objects_at_xy_get(Eo *eo_e, Evas_Public_Data *e EINA_UNUSED, Evas_Object *stop, int x, int y)
1605 return _evas_event_objects_event_list_no_frozen_check(eo_e, stop, x, y);
1609 evas_event_objects_event_list(Evas *eo_e, Evas_Object *stop, int x, int y)
1611 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1613 if ((!e->layers) || (e->is_frozen)) return NULL;
1614 D("------------------------------GET EVETNS AT ............... %i %i\n", x, y);
1615 return _evas_event_objects_event_list_no_frozen_check(eo_e, stop, x, y);
1619 evas_event_list_copy(Eina_List *list)
1621 Eina_List *l, *new_l = NULL;
1624 EINA_LIST_FOREACH(list, l, data)
1625 new_l = eina_list_append(new_l, data);
1628 /* public functions */
1631 _evas_canvas_event_default_flags_set(Eo *eo_e EINA_UNUSED, Evas_Public_Data *e, Evas_Event_Flags flags)
1633 e->default_event_flags = flags;
1636 EOLIAN Evas_Event_Flags
1637 _evas_canvas_event_default_flags_get(const Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
1639 return e->default_event_flags;
1643 _canvas_event_thaw_eval_internal(Eo *eo_e, Evas_Public_Data *e)
1645 Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, NULL);
1647 _canvas_event_feed_mouse_move_legacy(eo_e, e, pdata->seat->x, pdata->seat->y,
1648 e->last_timestamp, NULL);
1652 evas_event_freeze(Evas *eo_e)
1654 efl_event_freeze(eo_e);
1658 evas_event_thaw(Evas *eo_e)
1660 efl_event_thaw(eo_e);
1664 _evas_canvas_efl_object_event_freeze(Eo *eo_e, Evas_Public_Data *e)
1666 efl_event_freeze(efl_super(eo_e, EVAS_CANVAS_CLASS));
1667 e->is_frozen = EINA_TRUE;
1671 _evas_canvas_efl_object_event_thaw(Eo *eo_e, Evas_Public_Data *e)
1674 efl_event_thaw(efl_super(eo_e, EVAS_CANVAS_CLASS));
1675 fcount = efl_event_freeze_count_get(efl_super(eo_e, EVAS_CANVAS_CLASS));
1680 e->is_frozen = EINA_FALSE;
1681 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
1683 Evas_Object_Protected_Data *obj;
1685 EINA_INLIST_FOREACH(lay->objects, obj)
1687 evas_object_clip_recalc(obj);
1688 evas_object_recalc_clippees(obj);
1692 _canvas_event_thaw_eval_internal(eo_e, e);
1697 evas_event_freeze_get(const Evas *eo_e)
1699 return efl_event_freeze_count_get(eo_e);
1703 evas_event_thaw_eval(Evas *eo_e)
1705 if (!evas_event_freeze_get(eo_e))
1707 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
1708 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
1709 _canvas_event_thaw_eval_internal(eo_e, e);
1714 _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
1716 Efl_Input_Pointer *evt;
1717 Eina_List *l, *copy;
1718 Evas_Object *eo_obj;
1722 Evas_Pointer_Data *pdata;
1723 Evas_Object_Pointer_Data *obj_pdata;
1725 static const int value_flags =
1726 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
1727 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
1728 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
1729 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID) |
1730 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
1732 if (!e || !ev) return;
1733 EVAS_EVENT_FEED_SAFETY_CHECK(e);
1735 pdata = _evas_pointer_data_by_device_get(e, ev->device);
1739 DBG("ButtonEvent:down time=%u button=%d downs=%d",
1740 ev->timestamp, b, pdata->seat->downs);
1741 if ((b < 1) || (b > 32)) return;
1743 pdata->button |= (1u << (b - 1));
1744 pdata->seat->downs++;
1746 if (e->is_frozen) return;
1747 e->last_timestamp = ev->timestamp;
1751 event_id = _evas_object_event_new();
1753 ev->cur.x = pdata->seat->x;
1754 ev->cur.y = pdata->seat->y;
1755 ev->modifiers = &(e->modifiers);
1756 ev->locks = &(e->locks);
1757 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
1759 ev->action = EFL_POINTER_ACTION_DOWN;
1760 ev->value_flags |= value_flags;
1761 if (ev->device) efl_ref(ev->device);
1764 /* append new touch point to the touch point list */
1765 _evas_touch_point_append(e->evas, 0, pdata->seat->x, pdata->seat->y);
1766 /* If this is the first finger down, i.e no other fingers pressed,
1767 * get a new event list, otherwise, keep the current grabbed list. */
1768 if (pdata->seat->mouse_grabbed == 0)
1770 Eina_List *ins = evas_event_objects_event_list(eo_e,
1774 /* free our old list of ins */
1775 eina_list_free(pdata->seat->object.in);
1776 /* and set up the new one */
1777 pdata->seat->object.in = ins;
1778 /* adjust grabbed count by the nuymber of currently held down
1779 * fingers/buttons */
1780 if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
1782 copy = evas_event_list_copy(pdata->seat->object.in);
1783 EINA_LIST_FOREACH(copy, l, eo_obj)
1785 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1786 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
1789 ERR("Could not find the object pointer data for device %p",
1794 if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
1795 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
1797 obj_pdata->mouse_grabbed += addgrab + 1;
1798 pdata->seat->mouse_grabbed += addgrab + 1;
1799 if (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
1801 pdata->seat->nogrep++;
1806 EINA_LIST_FOREACH(copy, l, eo_obj)
1808 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1809 Evas_Object_Pointer_Mode pointer_mode;
1810 if (obj->delete_me) continue;
1811 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
1814 ERR("Could not find the object pointer data for device %p",
1818 pointer_mode = obj_pdata->pointer_mode;
1820 ev->cur.x = pdata->seat->x;
1821 ev->cur.y = pdata->seat->y;
1822 ev->prev.x = pdata->seat->prev.x;
1823 ev->prev.y = pdata->seat->prev.y;
1824 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1826 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, evt,
1827 event_id, EFL_EVENT_POINTER_DOWN);
1828 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
1829 _evas_event_source_mouse_down_events(eo_obj, eo_e, evt, pdata, event_id);
1830 if (e->is_frozen || e->delete_me) break;
1831 if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
1834 if (copy) eina_list_free(copy);
1835 e->last_mouse_down_counter++;
1836 _evas_post_event_callback_call(eo_e, e, event_id);
1837 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
1838 _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_STILL);
1841 if (ev->device) efl_unref(ev->device);
1845 _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
1846 Evas_Pointer_Data *pdata)
1848 Eina_List *l, *copy, *ins, *ll;
1849 Efl_Input_Pointer_Data *ev;
1850 Efl_Input_Pointer *evt;
1851 Evas_Object *eo_obj;
1852 Evas *eo_e = e->evas;
1853 Evas_Object_Pointer_Data *obj_pdata;
1856 /* Duplicating UP event */
1857 evt = efl_duplicate(parent_ev);
1858 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
1861 event_id = _evas_object_event_new();
1863 /* Actually we want an OUT */
1864 ev->action = EFL_POINTER_ACTION_OUT;
1866 /* get new list of ins */
1867 ins = evas_event_objects_event_list(eo_e, NULL, pdata->seat->x, pdata->seat->y);
1868 /* go thru old list of in objects */
1869 copy = evas_event_list_copy(pdata->seat->object.in);
1870 EINA_LIST_FOREACH(copy, ll, eo_obj)
1872 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
1873 if ((!eina_list_data_find(ins, eo_obj)) || (!pdata->seat->inside))
1875 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
1878 ERR("Could not find the object pointer data for device %p",
1882 if (!obj_pdata->mouse_in) continue;
1883 _evas_event_mouse_in_set(pdata->seat, obj, 0);
1886 ev->cur.x = pdata->seat->x;
1887 ev->cur.y = pdata->seat->y;
1888 ev->prev.x = pdata->seat->prev.x;
1889 ev->prev.y = pdata->seat->prev.y;
1891 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1893 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
1894 event_id, EFL_EVENT_POINTER_OUT);
1895 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
1896 _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
1897 if (e->delete_me) break;
1901 _evas_post_event_callback_call(eo_e, e, event_id);
1903 eina_list_free(copy);
1905 if (pdata->seat->inside)
1907 Evas_Object *eo_obj_itr;
1909 event_id = _evas_object_event_new();
1910 ev->action = EFL_POINTER_ACTION_IN;
1912 EINA_LIST_FOREACH(ins, l, eo_obj_itr)
1914 Evas_Object_Protected_Data *obj_itr = efl_data_scope_get(eo_obj_itr, EFL_CANVAS_OBJECT_CLASS);
1915 if (!eina_list_data_find(pdata->seat->object.in, eo_obj_itr))
1917 obj_pdata = _evas_object_pointer_data_get(pdata, obj_itr);
1920 ERR("Could not find the object pointer data for device %p",
1924 if (obj_pdata->mouse_in) continue;
1925 _evas_event_mouse_in_set(pdata->seat, obj_itr, 1);
1926 if (e->is_frozen) continue;
1928 ev->cur.x = pdata->seat->x;
1929 ev->cur.y = pdata->seat->y;
1930 ev->prev.x = pdata->seat->prev.x;
1931 ev->prev.y = pdata->seat->prev.y;
1933 _evas_event_havemap_adjust_f(obj_itr, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
1935 ev->action = EFL_POINTER_ACTION_IN;
1936 evas_object_event_callback_call(eo_obj_itr, obj_itr, EVAS_CALLBACK_MOUSE_IN, evt,
1937 event_id, EFL_EVENT_POINTER_IN);
1938 if ((pdata->seat->x != pdata->seat->prev.x) && (pdata->seat->y != pdata->seat->prev.y))
1940 ev->action = EFL_POINTER_ACTION_MOVE;
1941 evas_object_event_callback_call(eo_obj_itr, obj_itr, EVAS_CALLBACK_MOUSE_MOVE, evt,
1942 event_id, EFL_EVENT_POINTER_MOVE);
1944 if ((obj_itr->proxy->is_proxy) &&
1945 (obj_itr->proxy->src_events))
1946 _evas_event_source_mouse_in_events(eo_obj_itr, eo_e, evt, event_id);
1947 if (e->delete_me) break;
1950 _evas_post_event_callback_call(eo_e, e, event_id);
1954 ins = eina_list_free(ins);
1957 if (pdata->seat->mouse_grabbed == 0)
1959 /* free our old list of ins */
1960 eina_list_free(pdata->seat->object.in);
1961 /* and set up the new one */
1962 pdata->seat->object.in = ins;
1966 /* free our cur ins */
1967 eina_list_free(ins);
1969 if (pdata->seat->inside)
1970 _evas_canvas_event_pointer_move_event_dispatch(e, pdata, ev->data);
1976 _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
1978 Efl_Input_Pointer *evt;
1979 Eina_List *l, *copy;
1980 Evas_Object *eo_obj;
1981 int event_id = 0, b;
1983 Evas_Pointer_Data *pdata;
1986 static const int value_flags =
1987 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
1988 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
1989 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
1990 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID) |
1991 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
1993 if (!e || !ev) return;
1994 EVAS_EVENT_FEED_SAFETY_CHECK(e);
1996 pdata = _evas_pointer_data_by_device_get(e, ev->device);
2000 cancel = ev->action == EFL_POINTER_ACTION_CANCEL;
2002 DBG("ButtonEvent:cancel time=%u button=%d downs=%d",
2003 ev->timestamp, b, pdata->seat->downs);
2005 DBG("ButtonEvent:up time=%u button=%d downs=%d",
2006 ev->timestamp, b, pdata->seat->downs);
2007 if ((b < 1) || (b > 32)) return;
2008 if (pdata->seat->downs <= 0) return;
2012 pdata->button &= ~(1u << (b - 1));
2013 pdata->seat->downs--;
2016 if (e->is_frozen) return;
2017 e->last_timestamp = ev->timestamp;
2022 event_id = _evas_object_event_new();
2024 ev->cur.x = pdata->seat->x;
2025 ev->cur.y = pdata->seat->y;
2026 ev->modifiers = &(e->modifiers);
2027 ev->locks = &(e->locks);
2028 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
2030 ev->value_flags |= value_flags;
2031 if (ev->device) efl_ref(ev->device);
2035 /* update released touch point */
2036 _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_UP);
2037 copy = evas_event_list_copy(pdata->seat->object.in);
2038 EINA_LIST_FOREACH(copy, l, eo_obj)
2040 Evas_Object_Pointer_Mode pointer_mode;
2041 Evas_Object_Pointer_Data *obj_pdata;
2042 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2044 if (obj->delete_me) continue;
2045 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2048 ERR("Could not find the object pointer data for device %p",
2052 if ((!cancel) && ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
2053 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
2054 (obj_pdata->mouse_grabbed > 0))
2056 obj_pdata->mouse_grabbed--;
2057 pdata->seat->mouse_grabbed--;
2059 pointer_mode = obj_pdata->pointer_mode;
2060 if ((!e->is_frozen) &&
2061 (!evas_event_freezes_through(eo_obj, obj)))
2063 ev->cur.x = pdata->seat->x;
2064 ev->cur.y = pdata->seat->y;
2065 ev->prev.x = pdata->seat->prev.x;
2066 ev->prev.y = pdata->seat->prev.y;
2068 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2071 efl_event_callback_call(eo_obj, EFL_EVENT_POINTER_CANCEL, evt);
2073 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, evt,
2074 event_id, EFL_EVENT_POINTER_UP);
2075 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2076 _evas_event_source_mouse_up_events(eo_obj, eo_e, evt, pdata, event_id, cancel);
2077 if (e->delete_me) break;
2079 else if (evas_event_freezes_through(eo_obj, obj) &&
2080 (obj->proxy->is_proxy) && (obj->proxy->src_events))
2082 Evas_Object *eo_src = _evas_object_image_source_get(eo_obj);
2083 Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS);
2084 Evas_Object_Protected_Data *child;
2085 Evas_Object *eo_child;
2086 Eina_List *copy_events;
2088 if (src->delete_me) continue;
2089 copy_events = evas_event_list_copy(src->proxy->src_event_in);
2090 EINA_LIST_FREE(copy_events, eo_child)
2092 Evas_Object_Pointer_Data *obj_pdata;
2094 child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
2095 obj_pdata = _evas_object_pointer_data_get(pdata, child);
2098 ERR("Could not find the object pointer data for device %p",
2102 if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
2103 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
2104 (obj_pdata->mouse_grabbed > 0))
2106 obj_pdata->mouse_grabbed--;
2107 pdata->seat->mouse_grabbed--;
2111 if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
2113 if ((!cancel) && (pdata->seat->nogrep > 0)) pdata->seat->nogrep--;
2117 eina_list_free(copy);
2120 e->last_mouse_up_counter++;
2121 _evas_post_event_callback_call(eo_e, e, event_id);
2123 if (pdata->seat->mouse_grabbed == 0)
2124 _post_up_handle(e, evt, pdata);
2126 if (pdata->seat->mouse_grabbed < 0)
2128 ERR("BUG? pdata->seat->mouse_grabbed (=%d) < 0!",
2129 pdata->seat->mouse_grabbed);
2132 /* remove released touch point from the touch point list */
2133 _evas_touch_point_remove(eo_e, 0);
2136 if (ev->device) efl_unref(ev->device);
2140 _canvas_event_feed_mouse_updown(Eo *eo_e, int b, Evas_Button_Flags flags,
2141 unsigned int timestamp, const void *data,
2142 Eina_Bool down, Efl_Input_Device *device, Eina_Bool cancel)
2144 Efl_Input_Pointer_Data *ev = NULL;
2145 Efl_Input_Pointer *evt;
2146 Evas_Public_Data *e;
2148 e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2150 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2152 evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
2155 ev->data = (void *) data;
2156 ev->timestamp = timestamp;
2157 ev->device = efl_ref(device ? device : _evas_event_legacy_device_get(eo_e, EINA_TRUE));
2159 ev->action = EFL_POINTER_ACTION_CANCEL;
2161 ev->action = down ? EFL_POINTER_ACTION_DOWN : EFL_POINTER_ACTION_UP;
2163 ev->button_flags = (Efl_Pointer_Flags)flags;
2169 //ev->window_pos = ?;
2172 /* first, send the cancel action through to trigger POINTER_CANCEL on all
2174 * this does not change canvas state in any way.
2175 * note that the 'down' branch can only occur if 'cancel' is not true
2178 _canvas_event_feed_mouse_down_internal(e, ev);
2180 _canvas_event_feed_mouse_up_internal(e, ev);
2184 /* next, emit actual up event and perform state changes */
2186 _canvas_event_feed_mouse_updown(eo_e, b, flags, timestamp, data, down, device, EINA_FALSE);
2190 _canvas_event_feed_mouse_updown_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
2191 unsigned int timestamp, const void *data,
2194 _canvas_event_feed_mouse_updown(eo_e, b, flags, timestamp, data, down, NULL, EINA_FALSE);
2198 evas_event_feed_mouse_down(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
2200 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2201 _canvas_event_feed_mouse_updown_legacy(eo_e, b, flags, timestamp, data, 1);
2205 evas_event_feed_mouse_up(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
2207 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2208 _canvas_event_feed_mouse_updown_legacy(eo_e, b, flags, timestamp, data, 0);
2211 // TIZEN_ONLY(20160429): add multi_info(radius, pressure and angle) to Evas_Event_Mouse_XXX
2213 _canvas_event_feed_mouse_updown_with_multi_info(Eo *eo_e, int b, Evas_Button_Flags flags,
2214 unsigned int timestamp, const void *data,
2215 Eina_Bool down, Efl_Input_Device *device,
2216 double radius, double radius_x, double radius_y,
2217 double pressure, double angle)
2219 Efl_Input_Pointer_Data *ev = NULL;
2220 Efl_Input_Pointer *evt;
2221 Evas_Public_Data *e;
2223 e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2225 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2227 evt = efl_input_pointer_instance_get(eo_e, (void **) &ev);
2230 ev->data = (void *) data;
2231 ev->timestamp = timestamp;
2232 ev->device = efl_ref(device ? device : _evas_event_legacy_device_get(eo_e, EINA_TRUE));
2233 ev->action = down ? EFL_POINTER_ACTION_DOWN : EFL_POINTER_ACTION_UP;
2235 ev->button_flags = flags;
2236 ev->radius = radius;
2237 ev->radius_x = radius_x;
2238 ev->radius_y = radius_y;
2239 ev->pressure = pressure;
2241 //ev->window_pos = ?;
2245 _canvas_event_feed_mouse_down_internal(e, ev);
2247 _canvas_event_feed_mouse_up_internal(e, ev);
2253 _canvas_event_feed_mouse_updown_with_multi_info_legacy(Eo *eo_e, int b, Evas_Button_Flags flags,
2254 unsigned int timestamp, const void *data,
2256 double radius, double radius_x, double radius_y,
2257 double pressure, double angle)
2259 _canvas_event_feed_mouse_updown_with_multi_info(eo_e, b, flags, timestamp, data, down, NULL, radius, radius_x, radius_y, pressure, angle);
2263 evas_event_feed_mouse_down_with_multi_info(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data, double radius, double radius_x, double radius_y, double pressure, double angle)
2265 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2266 _canvas_event_feed_mouse_updown_with_multi_info_legacy(eo_e, b, flags, timestamp, data, 1, radius, radius_x, radius_y, pressure, angle);
2270 evas_event_feed_mouse_up_with_multi_info(Eo *eo_e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data, double radius, double radius_x, double radius_y, double pressure, double angle)
2272 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2273 _canvas_event_feed_mouse_updown_with_multi_info_legacy(eo_e, b, flags, timestamp, data, 0, radius, radius_x, radius_y, pressure, angle);
2278 _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
2280 Evas_Coord_Touch_Point *point;
2281 Efl_Input_Pointer_Data save;
2283 Evas_Event_Flags flags;
2286 Evas_Pointer_Data *pdata;
2288 static const int value_flags =
2289 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
2290 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
2291 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
2292 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
2294 if (!e || !ev) return;
2295 if (e->is_frozen) return;
2296 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2298 pdata = _evas_pointer_data_by_device_get(e, ev->device);
2305 flags = evas_event_default_flags_get(eo_e);
2306 evas_event_default_flags_set(eo_e, (flags | EVAS_EVENT_FLAG_ON_HOLD));
2308 for (i = 0; i < 32; i++)
2310 if ((pdata->button & (1u << i)))
2311 _canvas_event_feed_mouse_updown(eo_e, i + 1, 0, ev->timestamp, ev->data, 0, ev->device, EINA_TRUE);
2314 ev->action = EFL_POINTER_ACTION_CANCEL;
2315 ev->value_flags |= value_flags;
2316 ev->event_flags = (Efl_Input_Flags)flags;
2317 EINA_LIST_FOREACH_SAFE(e->touch_points, l, ll, point)
2319 if ((point->state == EVAS_TOUCH_POINT_DOWN) ||
2320 (point->state == EVAS_TOUCH_POINT_MOVE) ||
2321 (point->state == EVAS_TOUCH_POINT_STILL))
2323 ev->touch_id = point->id;
2324 ev->cur.x = point->x;
2325 ev->cur.y = point->y;
2327 _canvas_event_feed_multi_up_internal(e, ev);
2330 evas_event_default_flags_set(eo_e, flags);
2337 evas_event_feed_mouse_cancel(Eo *eo_e, unsigned int timestamp, const void *data)
2339 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2340 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2341 Efl_Input_Pointer_Data *ev = NULL;
2342 Efl_Input_Pointer *evt;
2344 evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
2346 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2348 ev->timestamp = timestamp;
2349 ev->data = (void *) data;
2350 ev->device = efl_ref(_evas_event_legacy_device_get(e->evas, EINA_TRUE));
2352 _canvas_event_feed_mouse_cancel_internal(e, ev);
2358 _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe)
2360 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2361 Efl_Input_Pointer_Data *ev = NULL;
2362 Efl_Input_Pointer *evt;
2363 Eina_List *l, *copy;
2364 Evas_Object *eo_obj;
2366 Evas_Pointer_Data *pdata;
2368 static const int value_flags =
2369 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
2370 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
2371 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
2372 _efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_DELTA) |
2373 _efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_HORIZONTAL);
2375 if (e->is_frozen) return;
2376 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2378 pdata = _evas_pointer_data_by_device_get(e, pe->device);
2380 e->last_timestamp = pe->timestamp;
2382 event_id = _evas_object_event_new();
2384 evt = efl_duplicate(pe->eo);
2385 ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
2388 // adjust missing data based on evas state
2389 ev->cur.x = pdata->seat->x;
2390 ev->cur.y = pdata->seat->y;
2391 ev->modifiers = &(e->modifiers);
2392 ev->locks = &(e->locks);
2393 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
2394 ev->action = EFL_POINTER_ACTION_WHEEL;
2395 ev->value_flags |= value_flags;
2398 copy = evas_event_list_copy(pdata->seat->object.in);
2400 EINA_LIST_FOREACH(copy, l, eo_obj)
2402 Evas_Object_Pointer_Data *obj_pdata;
2403 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2404 if (!evas_event_freezes_through(eo_obj, obj))
2406 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2409 ERR("Could not find the object pointer data for device %p",
2413 ev->cur.x = pdata->seat->x;
2414 ev->cur.y = pdata->seat->y;
2415 ev->prev.x = pdata->seat->prev.x;
2416 ev->prev.y = pdata->seat->prev.y;
2418 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2420 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_WHEEL, evt,
2421 event_id, EFL_EVENT_POINTER_WHEEL);
2422 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2423 _evas_event_source_wheel_events(eo_obj, eo_e, evt, event_id);
2424 if (e->delete_me || e->is_frozen) break;
2427 eina_list_free(copy);
2428 _evas_post_event_callback_call(eo_e, e, event_id);
2435 evas_event_feed_mouse_wheel(Eo *eo_e, int direction, int z, unsigned int timestamp, const void *data)
2437 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2438 Efl_Input_Pointer_Data *ev = NULL;
2439 Efl_Input_Pointer *evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
2443 ev->wheel.horizontal = !!direction;
2445 ev->timestamp = timestamp;
2446 ev->data = (void *) data;
2447 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
2449 _canvas_event_feed_mouse_wheel_internal(eo_e, ev);
2454 _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
2456 Evas_Object *nogrep_obj = NULL;
2457 Evas_Object_Protected_Data *obj;
2458 Efl_Input_Pointer *evt;
2459 Eina_List *l, *copy;
2460 Evas_Object *eo_obj;
2461 Eina_Vector2 cur_pt, prev_pt;
2464 Evas_Pointer_Data *pdata;
2465 //TIZEN_ONLY(20200213): add checking mouse grab count
2466 Evas_Object_Pointer_Data *obj_pdata, *obj_pdata2;
2469 // inform which values are valid
2470 static const int value_flags =
2471 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
2472 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
2473 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
2474 _efl_input_value_mask(EFL_INPUT_VALUE_PREVIOUS_X) |
2475 _efl_input_value_mask(EFL_INPUT_VALUE_PREVIOUS_Y) |
2476 _efl_input_value_mask(EFL_INPUT_VALUE_DX) |
2477 _efl_input_value_mask(EFL_INPUT_VALUE_DY) |
2478 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) |
2479 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
2481 if (!e || !ev) return;
2482 if (e->is_frozen) return;
2483 EVAS_EVENT_FEED_SAFETY_CHECK(e);
2487 pdata = _evas_pointer_data_by_device_get(e, ev->device);
2492 Evas_Pointer_Seat *pseat;
2493 if (!e->seats) return;
2494 pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat);
2496 e->last_timestamp = ev->timestamp;
2497 pseat->prev.x = pseat->x;
2498 pseat->prev.y = pseat->y;
2501 pseat->x = ev->cur.x;
2502 pseat->y = ev->cur.y;
2507 e->last_timestamp = ev->timestamp;
2509 ev->prev.x = pdata->seat->x;
2510 ev->prev.y = pdata->seat->y;
2513 prev_pt.x = pdata->seat->prev.x = ev->prev.x;
2514 prev_pt.y = pdata->seat->prev.y = ev->prev.y;
2517 cur_pt.x = pdata->seat->x = ev->cur.x;
2518 cur_pt.y = pdata->seat->y = ev->cur.y;
2520 if ((!pdata->seat->inside) && (pdata->seat->mouse_grabbed == 0)) return;
2523 ev->modifiers = &(e->modifiers);
2524 ev->locks = &(e->locks);
2525 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
2526 ev->pressed_buttons = pdata->button;
2528 ev->value_flags |= value_flags;
2529 if (ev->device) efl_ref(ev->device);
2532 /* update moved touch point */
2533 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2534 _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_MOVE);
2535 /* if our mouse button is grabbed to any objects */
2536 if (pdata->seat->mouse_grabbed > 0)
2538 Eina_List *outs = NULL;
2540 /* Send normal mouse move events */
2541 ev->action = EFL_POINTER_ACTION_MOVE;
2543 event_id = _evas_object_event_new();
2545 /* go thru old list of in objects */
2546 copy = evas_event_list_copy(pdata->seat->object.in);
2547 EINA_LIST_FOREACH(copy, l, eo_obj)
2549 Eina_Bool check_nogrep = EINA_FALSE;
2551 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2552 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2555 ERR("Could not find the object pointer data for device %p",
2559 if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
2560 (pdata->seat->nogrep > 0))
2561 check_nogrep = EINA_TRUE;
2562 if ((!e->is_frozen) &&
2563 _evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
2564 (!evas_object_is_source_invisible(eo_obj, obj) ||
2565 obj_pdata->mouse_grabbed))
2570 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2572 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2574 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
2575 event_id, EFL_EVENT_POINTER_MOVE);
2576 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2577 _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
2581 outs = eina_list_append(outs, eo_obj);
2584 eina_list_free(copy);
2585 eina_list_free(outs);
2586 nogrep_obj = eo_obj;
2589 if (e->delete_me) break;
2591 eina_list_free(copy);
2592 _evas_post_event_callback_call(eo_e, e, event_id);
2595 /* Send mouse out events */
2596 ev->action = EFL_POINTER_ACTION_OUT;
2598 event_id = _evas_object_event_new();
2600 //TIZEN_ONLY(20200213): add checking mouse grab count
2601 Eina_Bool mouse_grabbed = EINA_FALSE;
2603 EINA_LIST_FREE(outs, eo_obj)
2605 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2606 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2609 ERR("Could not find the object pointer data for device %p",
2613 //TIZEN_ONLY(20200213): add checking mouse grab count
2614 mouse_grabbed = EINA_FALSE;
2615 EINA_INLIST_FOREACH(obj->events->pointer_grabs, obj_pdata2)
2617 if (obj_pdata2->mouse_grabbed > 0)
2619 mouse_grabbed = EINA_TRUE;
2624 if ((!mouse_grabbed) && (!e->delete_me))
2626 if (!obj_pdata->mouse_in) continue;
2627 _evas_event_mouse_in_set(pdata->seat, obj, 0);
2628 if (obj->delete_me || e->is_frozen) continue;
2629 pdata->seat->object.in = eina_list_remove(pdata->seat->object.in, eo_obj);
2634 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2636 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
2637 event_id, EFL_EVENT_POINTER_OUT);
2638 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2639 _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
2642 _evas_post_event_callback_call(eo_e, e, event_id);
2648 event_id = _evas_object_event_new();
2650 /* get all new in objects */
2651 ins = evas_event_objects_event_list(eo_e, NULL, cur_pt.x, cur_pt.y);
2652 /* go thru old list of in objects */
2653 copy = evas_event_list_copy(pdata->seat->object.in);
2654 EINA_LIST_FOREACH(copy, l, eo_obj)
2656 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2658 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2661 ERR("Could not find the object pointer data for device %p",
2666 /* if its under the pointer and its visible and its in the new */
2668 // FIXME: i don't think we need this
2669 // evas_object_clip_recalc(eo_obj);
2674 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2676 if ((!e->is_frozen) &&
2677 (evas_object_is_in_output_rect(eo_obj, obj, ev->cur.x, ev->cur.y, 1, 1)) &&
2678 _evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
2679 _evas_event_object_pointer_allow_precise(eo_obj, obj, ev->cur.x, ev->cur.y, ins) &&
2680 (obj_pdata->mouse_grabbed || !evas_object_is_source_invisible(eo_obj, obj)))
2682 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2684 ev->action = EFL_POINTER_ACTION_MOVE;
2685 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
2686 event_id, EFL_EVENT_POINTER_MOVE);
2687 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2688 _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
2691 /* otherwise it has left the object */
2692 else if (obj_pdata->mouse_in)
2694 _evas_event_mouse_in_set(pdata->seat, obj, 0);
2695 if (e->is_frozen) continue;
2696 ev->action = EFL_POINTER_ACTION_OUT;
2697 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
2698 event_id, EFL_EVENT_POINTER_OUT);
2699 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2700 _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
2701 if (e->delete_me) break;
2704 eina_list_free(copy);
2705 _evas_post_event_callback_call(eo_e, e, event_id);
2707 /* new event id for mouse in */
2708 event_id = _evas_object_event_new();
2710 /* go thru our current list of ins */
2711 EINA_LIST_FOREACH(ins, l, eo_obj)
2713 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2714 /* if its not in the old list of ins send an enter event */
2715 if (!eina_list_data_find(pdata->seat->object.in, eo_obj))
2717 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2720 ERR("Could not find the object pointer data for device %p",
2724 if (!obj_pdata->mouse_in)
2726 _evas_event_mouse_in_set(pdata->seat, obj, 1);
2727 if (e->is_frozen) continue;
2732 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2734 ev->action = EFL_POINTER_ACTION_IN;
2735 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
2736 event_id, EFL_EVENT_POINTER_IN);
2737 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2739 ev->action = EFL_POINTER_ACTION_MOVE;
2740 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
2741 event_id, EFL_EVENT_POINTER_MOVE);
2743 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2744 _evas_event_source_mouse_in_events(eo_obj, eo_e, evt, event_id);
2746 if (e->delete_me) break;
2750 if (pdata->seat->mouse_grabbed == 0)
2752 /* free our old list of ins */
2753 eina_list_free(pdata->seat->object.in);
2754 /* and set up the new one */
2755 pdata->seat->object.in = ins;
2759 /* free our cur ins */
2760 eina_list_free(ins);
2762 _evas_post_event_callback_call(eo_e, e, event_id);
2768 Eina_List *ins = NULL, *newin = NULL, *lst = NULL;
2769 Evas_Object *eo_below_obj;
2771 event_id = _evas_object_event_new();
2773 /* go thru old list of in objects */
2774 copy = evas_event_list_copy(pdata->seat->object.in);
2775 EINA_LIST_FOREACH(copy, l, eo_obj)
2777 if (eo_obj == nogrep_obj)
2784 /* get all new in objects */
2785 eo_below_obj = evas_object_below_get(nogrep_obj);
2788 Evas_Object_Protected_Data *below_obj = efl_data_scope_get(eo_below_obj, EFL_CANVAS_OBJECT_CLASS);
2790 ins = _evas_event_object_list_raw_in_get(eo_e, NULL,
2791 EINA_INLIST_GET(below_obj), NULL, NULL,
2792 pdata->seat->x, pdata->seat->y,
2793 &norep, EINA_FALSE, EINA_TRUE);
2796 EINA_LIST_FOREACH(copy, l, eo_obj)
2798 newin = eina_list_append(newin, eo_obj);
2799 if (eo_obj == nogrep_obj) break;
2802 // NOTE: was foreach + append without free (smelled bad)
2803 newin = eina_list_merge(newin, ins);
2804 EINA_LIST_FOREACH(lst, l, eo_obj)
2806 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2807 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2810 ERR("Could not find the object pointer data for device %p",
2814 /* if its under the pointer and its visible and its in the new */
2816 // FIXME: i don't think we need this
2817 // evas_object_clip_recalc(eo_obj);
2822 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2824 if ((!e->is_frozen) &&
2825 evas_object_is_in_output_rect(eo_obj, obj, ev->cur.x, ev->cur.y, 1, 1) &&
2826 _evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
2827 _evas_event_object_pointer_allow_precise(eo_obj, obj, ev->cur.x, ev->cur.y, newin) &&
2828 (obj_pdata->mouse_grabbed || !evas_object_is_source_invisible(eo_obj, obj)))
2830 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2832 ev->action = EFL_POINTER_ACTION_MOVE;
2833 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
2834 event_id, EFL_EVENT_POINTER_MOVE);
2835 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2836 _evas_event_source_mouse_move_events(eo_obj, eo_e, evt, pdata, event_id);
2841 /* otherwise it has left the object */
2842 if (!obj_pdata->mouse_in) continue;
2843 _evas_event_mouse_in_set(pdata->seat, obj, 0);
2844 if (e->is_frozen) continue;
2845 ev->action = EFL_POINTER_ACTION_OUT;
2846 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
2847 event_id, EFL_EVENT_POINTER_OUT);
2848 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2849 _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
2851 if (e->delete_me) break;
2853 eina_list_free(copy);
2854 _evas_post_event_callback_call(eo_e, e, event_id);
2856 event_id = _evas_object_event_new();
2858 /* go thru our current list of ins */
2859 EINA_LIST_FOREACH(newin, l, eo_obj)
2861 obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
2862 /* if its not in the old list of ins send an enter event */
2863 if (!eina_list_data_find(pdata->seat->object.in, eo_obj))
2865 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
2868 ERR("Could not find the object pointer data for device %p",
2872 if (obj_pdata->mouse_in) continue;
2873 _evas_event_mouse_in_set(pdata->seat, obj, 1);
2874 if (e->is_frozen) continue;
2879 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
2881 ev->action = EFL_POINTER_ACTION_IN;
2882 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
2883 event_id, EFL_EVENT_POINTER_IN);
2884 if (!EINA_DBL_EQ(cur_pt.x, prev_pt.x) || !EINA_DBL_EQ(cur_pt.y, prev_pt.y))
2886 ev->action = EFL_POINTER_ACTION_MOVE;
2887 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
2888 event_id, EFL_EVENT_POINTER_MOVE);
2890 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
2891 _evas_event_source_mouse_in_events(eo_obj, eo_e, evt, event_id);
2892 if (e->delete_me) break;
2895 /* free our old list of ins */
2896 eina_list_free(pdata->seat->object.in);
2897 /* and set up the new one */
2898 pdata->seat->object.in = newin;
2900 _evas_post_event_callback_call(eo_e, e, event_id);
2904 if (ev->device) efl_unref(ev->device);
2908 _canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y,
2909 unsigned int timestamp, const void *data)
2911 Efl_Input_Pointer_Data *ev = NULL;
2912 Efl_Input_Pointer *evt;
2914 evt = efl_input_pointer_instance_get(eo_e, (void **) &ev);
2917 ev->data = (void *) data;
2918 ev->timestamp = timestamp;
2919 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
2923 _canvas_event_feed_mouse_move_internal(e, ev);
2929 evas_event_input_mouse_move(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data)
2931 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2932 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2933 _canvas_event_feed_mouse_move_legacy(eo_e, e, x - e->framespace.x, y - e->framespace.y, timestamp, data);
2937 evas_event_feed_mouse_move(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data)
2939 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2940 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2941 _canvas_event_feed_mouse_move_legacy(eo_e, e, x, y, timestamp, data);
2944 // TIZEN_ONLY(20160429): add multi_info(radius, pressure and angle) to Evas_Event_Mouse_XXX
2946 _canvas_event_feed_mouse_move_with_multi_info_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y,
2947 unsigned int timestamp, const void *data,
2948 double radius, double radius_x, double radius_y, double pressure, double angle)
2950 Efl_Input_Pointer_Data *ev = NULL;
2951 Efl_Input_Pointer *evt;
2953 evt = efl_input_pointer_instance_get(eo_e, (void **) &ev);
2956 ev->data = (void *) data;
2957 ev->timestamp = timestamp;
2958 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
2961 ev->radius = radius;
2962 ev->radius_x = radius_x;
2963 ev->radius_y = radius_y;
2964 ev->pressure = pressure;
2967 _canvas_event_feed_mouse_move_internal(e, ev);
2973 evas_event_input_mouse_move_with_multi_info(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data, double radius, double radius_x, double radius_y, double pressure, double angle)
2975 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2976 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2977 _canvas_event_feed_mouse_move_with_multi_info_legacy(eo_e, e, x - e->framespace.x, y - e->framespace.y, timestamp, data, radius, radius_x, radius_y, pressure, angle);
2981 evas_event_feed_mouse_move_with_multi_info(Eo *eo_e, int x, int y, unsigned int timestamp, const void *data, double radius, double radius_x, double radius_y, double pressure, double angle)
2983 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
2984 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2985 _canvas_event_feed_mouse_move_with_multi_info_legacy(eo_e, e, x, y, timestamp, data, radius, radius_x, radius_y, pressure, angle);
2990 _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
2992 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
2993 Efl_Input_Pointer *evt;
2996 Evas_Object *eo_obj;
2998 Evas_Pointer_Data *pdata;
3000 static const int value_flags =
3001 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
3002 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
3003 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
3004 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) |
3005 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
3007 if (!e || !ev) return;
3008 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3012 pdata = _evas_pointer_data_by_device_get(e, ev->device);
3017 Evas_Pointer_Seat *pseat;
3018 if (!e->seats) return;
3019 pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat);
3024 pdata->seat->inside = 1;
3025 if (e->is_frozen) return;
3027 e->last_timestamp = ev->timestamp;
3028 if (pdata->seat->mouse_grabbed != 0) return;
3031 ev->action = EFL_POINTER_ACTION_IN;
3032 ev->pressed_buttons = pdata->button;
3033 ev->cur.x = pdata->seat->x;
3034 ev->cur.y = pdata->seat->y;
3035 ev->modifiers = &(e->modifiers);
3036 ev->locks = &(e->locks);
3037 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3038 ev->value_flags |= value_flags;
3039 if (ev->device) efl_ref(ev->device);
3041 event_id = _evas_object_event_new();
3044 /* get new list of ins */
3045 ins = evas_event_objects_event_list(eo_e, NULL, pdata->seat->x, pdata->seat->y);
3046 EINA_LIST_FOREACH(ins, l, eo_obj)
3048 Evas_Object_Pointer_Data *obj_pdata;
3049 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3050 if ((!obj) || (obj->delete_me)) continue;
3051 if (!eina_list_data_find(pdata->seat->object.in, eo_obj))
3053 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3056 ERR("Could not find the object pointer data for device %p",
3060 if (obj_pdata->mouse_in) continue;
3061 _evas_event_mouse_in_set(pdata->seat, obj, 1);
3063 ev->cur.x = pdata->seat->x;
3064 ev->cur.y = pdata->seat->y;
3065 ev->prev.x = pdata->seat->prev.x;
3066 ev->prev.y = pdata->seat->prev.y;
3067 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3069 ev->action = EFL_POINTER_ACTION_IN;
3071 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt,
3072 event_id, EFL_EVENT_POINTER_IN);
3073 if (!EINA_DBL_EQ(pdata->seat->x, ev->prev.x) &&
3074 !EINA_DBL_EQ(pdata->seat->y, ev->prev.y))
3076 ev->action = EFL_POINTER_ACTION_MOVE;
3077 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_MOVE, evt,
3078 event_id, EFL_EVENT_POINTER_MOVE);
3080 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3081 _evas_event_source_mouse_in_events(eo_obj, eo_e, evt, event_id);
3083 if (e->delete_me || e->is_frozen) break;
3086 /* free our old list of ins */
3087 eina_list_free(pdata->seat->object.in);
3088 /* and set up the new one */
3089 pdata->seat->object.in = ins;
3090 _evas_post_event_callback_call(eo_e, e, event_id);
3091 _canvas_event_feed_mouse_move_internal(e, ev);
3094 if (ev->device) efl_unref(ev->device);
3098 _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
3100 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3101 Efl_Input_Pointer *evt;
3102 Eina_List *l, *copy;
3103 Evas_Object *eo_obj;
3105 Evas_Pointer_Data *pdata;
3107 static const int value_flags =
3108 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
3109 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
3110 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
3111 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) |
3112 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
3114 if (!e || !ev) return;
3115 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3118 pdata = _evas_pointer_data_by_device_get(e, ev->device);
3123 Evas_Pointer_Seat *pseat;
3124 if (!e->seats) return;
3125 pseat = EINA_INLIST_CONTAINER_GET(e->seats, Evas_Pointer_Seat);
3129 pdata->seat->inside = 0;
3131 if (e->is_frozen) return;
3132 e->last_timestamp = ev->timestamp;
3134 event_id = _evas_object_event_new();
3137 ev->action = EFL_POINTER_ACTION_OUT;
3138 ev->pressed_buttons = pdata->button;
3139 ev->cur.x = pdata->seat->x;
3140 ev->cur.y = pdata->seat->y;
3141 ev->modifiers = &(e->modifiers);
3142 ev->locks = &(e->locks);
3143 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3144 ev->value_flags |= value_flags;
3145 if (ev->device) efl_ref(ev->device);
3148 /* if our mouse button is inside any objects */
3149 /* go thru old list of in objects */
3150 copy = evas_event_list_copy(pdata->seat->object.in);
3151 EINA_LIST_FOREACH(copy, l, eo_obj)
3153 Evas_Object_Pointer_Data *obj_pdata;
3154 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3155 if ((!obj) || (obj->delete_me)) continue;
3156 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3159 ERR("Could not find the object pointer data for device %p",
3163 if (!obj_pdata->mouse_in) continue;
3164 _evas_event_mouse_in_set(pdata->seat, obj, 0);
3167 ev->cur.x = pdata->seat->x;
3168 ev->cur.y = pdata->seat->y;
3169 ev->prev.x = pdata->seat->prev.x;
3170 ev->prev.y = pdata->seat->prev.y;
3171 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3173 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt,
3174 event_id, EFL_EVENT_POINTER_OUT);
3175 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3176 _evas_event_source_mouse_out_events(eo_obj, eo_e, evt, event_id);
3178 if (e->delete_me || e->is_frozen) break;
3179 obj_pdata->mouse_grabbed = 0;
3181 eina_list_free(copy);
3183 /* free our old list of ins */
3184 pdata->seat->object.in = eina_list_free(pdata->seat->object.in);
3185 pdata->seat->mouse_grabbed = 0;
3186 _evas_post_event_callback_call(eo_e, e, event_id);
3189 if (ev->device) efl_unref(ev->device);
3193 _canvas_event_feed_mouse_inout_legacy(Eo *eo_e, unsigned int timestamp,
3194 const void *data, Eina_Bool in)
3196 Efl_Input_Pointer_Data *ev = NULL;
3197 Efl_Input_Pointer *evt;
3199 evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
3202 ev->timestamp = timestamp;
3203 ev->data = (void *) data;
3204 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
3207 _canvas_event_feed_mouse_in_internal(eo_e, ev);
3209 _canvas_event_feed_mouse_out_internal(eo_e, ev);
3215 evas_event_feed_mouse_in(Eo *eo_e, unsigned int timestamp, const void *data)
3217 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3218 _canvas_event_feed_mouse_inout_legacy(eo_e, timestamp, data, EINA_TRUE);
3222 evas_event_feed_mouse_out(Eo *eo_e, unsigned int timestamp, const void *data)
3224 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3225 _canvas_event_feed_mouse_inout_legacy(eo_e, timestamp, data, EINA_FALSE);
3229 _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
3231 Efl_Input_Pointer *evt;
3232 Eina_List *l, *copy;
3233 Evas_Object *eo_obj;
3238 Evas_Pointer_Data *pdata;
3239 Evas_Object_Pointer_Data *obj_pdata;
3241 static const int value_flags =
3242 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
3243 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
3244 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
3245 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID) |
3246 _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
3248 if (!e || !ev) return;
3249 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3251 pdata = _evas_pointer_data_by_device_get(e, ev->device);
3254 DBG("ButtonEvent:multi down time=%u button=%d downs=%d",
3255 ev->timestamp, ev->touch_id, pdata->seat->downs);
3256 pdata->seat->downs++;
3257 if (e->is_frozen) return;
3258 e->last_timestamp = ev->timestamp;
3260 event_id = _evas_object_event_new();
3264 ev->action = EFL_POINTER_ACTION_DOWN;
3265 ev->modifiers = &(e->modifiers);
3266 ev->locks = &(e->locks);
3267 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3268 ev->value_flags |= value_flags;
3269 if (ev->device) efl_ref(ev->device);
3272 /* append new touch point to the touch point list */
3273 _evas_touch_point_append(eo_e, ev->touch_id, ev->cur.x, ev->cur.y);
3274 if (pdata->seat->mouse_grabbed == 0)
3276 if (pdata->seat->downs > 1)
3277 addgrab = pdata->seat->downs - 1;
3278 else /* this is the first touch, which means it's also a move event, which means we need to redo this */
3280 /* get all new in objects */
3281 Eina_List *ins = evas_event_objects_event_list(eo_e, NULL, ev->cur.x, ev->cur.y);
3282 /* free our old list of ins */
3283 eina_list_free(pdata->seat->object.in);
3284 /* and set up the new one */
3285 pdata->seat->object.in = ins;
3288 copy = evas_event_list_copy(pdata->seat->object.in);
3289 EINA_LIST_FOREACH(copy, l, eo_obj)
3291 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3292 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3295 ERR("Could not find the object pointer data for device %p",
3299 if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
3301 obj_pdata->mouse_grabbed += addgrab + 1;
3302 pdata->seat->mouse_grabbed += addgrab + 1;
3305 EINA_LIST_FOREACH(copy, l, eo_obj)
3307 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3308 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3311 ERR("Could not find the object pointer data for device %p",
3316 ev->prev.x = pdata->seat->prev.x;
3317 ev->prev.y = pdata->seat->prev.y;
3318 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3320 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_DOWN, evt,
3321 event_id, EFL_EVENT_FINGER_DOWN);
3322 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3323 _evas_event_source_multi_down_events(obj, e, evt, pdata, event_id);
3324 if (e->delete_me || e->is_frozen) break;
3326 eina_list_free(copy);
3328 _evas_post_event_callback_call(eo_e, e, event_id);
3329 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
3330 _evas_touch_point_update(eo_e, ev->touch_id, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_STILL);
3333 if (ev->device) efl_unref(ev->device);
3337 _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
3339 Efl_Input_Pointer *evt;
3340 Eina_List *l, *copy;
3341 Evas_Object *eo_obj;
3345 Evas_Pointer_Data *pdata;
3347 static const int value_flags =
3348 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
3349 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
3350 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
3351 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
3353 if (!e || !ev) return;
3354 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3356 pdata = _evas_pointer_data_by_device_get(e, ev->device);
3359 DBG("ButtonEvent:multi up time=%u device=%d downs=%d",
3360 ev->timestamp, ev->touch_id, pdata->seat->downs);
3361 if (pdata->seat->downs <= 0) return;
3362 pdata->seat->downs--;
3363 if (e->is_frozen) return;
3364 e->last_timestamp = ev->timestamp;
3366 event_id = _evas_object_event_new();
3370 ev->action = EFL_POINTER_ACTION_UP;
3371 ev->modifiers = &(e->modifiers);
3372 ev->locks = &(e->locks);
3373 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3374 ev->value_flags |= value_flags;
3375 if (ev->device) efl_ref(ev->device);
3378 /* update released touch point */
3379 _evas_touch_point_update(eo_e, ev->touch_id, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_UP);
3380 copy = evas_event_list_copy(pdata->seat->object.in);
3381 EINA_LIST_FOREACH(copy, l, eo_obj)
3383 Evas_Object_Pointer_Data *obj_pdata;
3384 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3385 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3388 ERR("Could not find the object pointer data for device %p",
3393 ev->prev.x = pdata->seat->prev.x;
3394 ev->prev.y = pdata->seat->prev.y;
3396 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3397 if (((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
3398 (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) &&
3399 (obj_pdata->mouse_grabbed > 0))
3401 obj_pdata->mouse_grabbed--;
3402 pdata->seat->mouse_grabbed--;
3404 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, evt,
3405 event_id, EFL_EVENT_FINGER_UP);
3406 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3407 _evas_event_source_multi_up_events(obj, e, evt, pdata, event_id);
3408 if (e->delete_me || e->is_frozen) break;
3410 eina_list_free(copy);
3411 if (pdata->seat->mouse_grabbed == 0)
3413 _post_up_handle(e, evt, pdata);
3414 _evas_post_event_callback_call(eo_e, e, event_id);
3417 /* remove released touch point from the touch point list */
3418 _evas_touch_point_remove(eo_e, ev->touch_id);
3421 if (ev->device) efl_unref(ev->device);
3425 _canvas_event_feed_multi_internal(Evas *eo_e, Evas_Public_Data *e,
3426 int d, int x, int y,
3427 double rad, double radx, double rady,
3428 double pres, double ang,
3429 double fx, double fy,
3430 Evas_Button_Flags flags,
3431 unsigned int timestamp,
3432 const void *data, Efl_Pointer_Action action)
3434 Efl_Input_Pointer_Data *ev = NULL;
3435 Efl_Input_Pointer *evt;
3437 evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
3438 if (!e || !ev) return;
3439 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3441 if (EINA_DBL_EQ(fx, 0.0)) fx = x;
3442 if (EINA_DBL_EQ(fy, 0.0)) fy = y;
3444 ev->action = action;
3448 ev->pressure = pres;
3451 ev->radius_x = radx;
3452 ev->radius_y = rady;
3453 ev->button_flags = (Efl_Pointer_Flags)flags;
3454 ev->timestamp = timestamp;
3455 ev->data = (void *) data;
3456 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
3460 case EFL_POINTER_ACTION_DOWN:
3461 _canvas_event_feed_multi_down_internal(e, ev);
3464 case EFL_POINTER_ACTION_UP:
3465 _canvas_event_feed_multi_up_internal(e, ev);
3468 case EFL_POINTER_ACTION_MOVE:
3469 _canvas_event_feed_multi_move_internal(e, ev);
3479 evas_event_input_multi_down(Eo *eo_e, 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)
3481 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3482 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3483 _canvas_event_feed_multi_internal(eo_e, e, d,
3484 x - e->framespace.x, y - e->framespace.y,
3485 rad, radx, rady, pres, ang,
3486 fx, fy, flags, timestamp, data, EFL_POINTER_ACTION_DOWN);
3490 evas_event_feed_multi_down(Eo *eo_e, 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)
3492 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3493 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3494 _canvas_event_feed_multi_internal(eo_e, e, d, x, y, rad, radx, rady, pres, ang,
3495 fx, fy, flags, timestamp, data, EFL_POINTER_ACTION_DOWN);
3499 evas_event_input_multi_up(Eo *eo_e, 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)
3501 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3502 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3503 _canvas_event_feed_multi_internal(eo_e, e, d,
3504 x - e->framespace.x, y - e->framespace.y,
3505 rad, radx, rady, pres, ang,
3506 fx, fy, flags, timestamp, data, EFL_POINTER_ACTION_UP);
3510 evas_event_feed_multi_up(Eo *eo_e, 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)
3512 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3513 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3514 _canvas_event_feed_multi_internal(eo_e, e, d, x, y, rad, radx, rady, pres, ang,
3515 fx, fy, flags, timestamp, data, EFL_POINTER_ACTION_UP);
3519 _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
3521 Efl_Input_Pointer *evt;
3522 Eina_List *l, *copy;
3523 Evas_Object *eo_obj;
3524 Eina_Vector2 cur_pt, prev_pt;
3527 Evas_Pointer_Data *pdata;
3528 Evas_Object_Pointer_Data *obj_pdata;
3530 /* FIXME: Add previous x,y information (from evas touch point list) */
3531 static const int value_flags =
3532 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) |
3533 _efl_input_value_mask(EFL_INPUT_VALUE_X) |
3534 _efl_input_value_mask(EFL_INPUT_VALUE_Y) |
3535 _efl_input_value_mask(EFL_INPUT_VALUE_TOUCH_ID);
3537 if (!e || !ev) return;
3538 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3540 pdata = _evas_pointer_data_by_device_get(e, ev->device);
3543 event_id = _evas_object_event_new();
3545 if (e->is_frozen) return;
3546 e->last_timestamp = ev->timestamp;
3548 if ((!pdata->seat->inside) && (pdata->seat->mouse_grabbed == 0)) return;
3551 ev->modifiers = &(e->modifiers);
3552 ev->locks = &(e->locks);
3553 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3554 ev->action = EFL_POINTER_ACTION_MOVE;
3555 ev->value_flags |= value_flags;
3556 if (ev->device) efl_ref(ev->device);
3562 /* update moved touch point */
3563 _evas_touch_point_update(eo_e, ev->touch_id, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_MOVE);
3564 /* if our mouse button is grabbed to any objects */
3565 if (pdata->seat->mouse_grabbed > 0)
3567 /* go thru old list of in objects */
3568 copy = evas_event_list_copy(pdata->seat->object.in);
3569 EINA_LIST_FOREACH(copy, l, eo_obj)
3571 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3572 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3575 ERR("Could not find the object pointer data for device %p",
3579 if (_evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
3580 (!evas_object_is_source_invisible(eo_obj, obj) ||
3581 obj_pdata->mouse_grabbed))
3585 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3586 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
3587 event_id, EFL_EVENT_FINGER_MOVE);
3588 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3589 _evas_event_source_multi_move_events(obj, e, evt, pdata, event_id);
3591 if (e->delete_me || e->is_frozen) break;
3594 eina_list_free(copy);
3595 _evas_post_event_callback_call(eo_e, e, event_id);
3601 /* get all new in objects */
3602 ins = evas_event_objects_event_list(eo_e, NULL, ev->cur.x, ev->cur.y);
3603 /* go thru old list of in objects */
3604 copy = evas_event_list_copy(pdata->seat->object.in);
3605 EINA_LIST_FOREACH(copy, l, eo_obj)
3607 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
3608 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
3611 ERR("Could not find the object pointer data for device %p",
3615 /* if its under the pointer and its visible and its in the new */
3617 // FIXME: i don't think we need this
3618 // evas_object_clip_recalc(eo_obj);
3623 _evas_event_havemap_adjust_f(obj, &ev->cur, &ev->prev, obj_pdata->mouse_grabbed);
3625 if (evas_object_is_in_output_rect(eo_obj, obj, ev->cur.x, ev->cur.y, 1, 1) &&
3626 _evas_event_object_pointer_allow(eo_obj, obj, obj_pdata) &&
3627 _evas_event_object_pointer_allow_precise(eo_obj, obj, ev->cur.x, ev->cur.y, ins) &&
3628 (obj_pdata->mouse_grabbed || !evas_object_is_source_invisible(eo_obj, obj)))
3630 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_MOVE, evt,
3631 event_id, EFL_EVENT_FINGER_MOVE);
3632 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
3633 _evas_event_source_multi_move_events(obj, e, evt, pdata, event_id);
3635 if (e->delete_me || e->is_frozen) break;
3637 eina_list_free(copy);
3638 if (pdata->seat->mouse_grabbed == 0)
3640 /* free our old list of ins */
3641 eina_list_free(pdata->seat->object.in);
3642 /* and set up the new one */
3643 pdata->seat->object.in = ins;
3647 /* free our cur ins */
3648 eina_list_free(ins);
3650 _evas_post_event_callback_call(eo_e, e, event_id);
3654 if (ev->device) efl_unref(ev->device);
3658 evas_event_input_multi_move(Eo *eo_e, int d, int x, int y, double rad, double radx, double rady, double pres, double ang, double fx, double fy, unsigned int timestamp, const void *data)
3660 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3661 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3662 _canvas_event_feed_multi_internal(eo_e, e, d, x - e->framespace.x, y - e->framespace.y,
3664 pres, ang, fx, fy, EVAS_BUTTON_NONE, timestamp, data,
3665 EFL_POINTER_ACTION_MOVE);
3669 evas_event_feed_multi_move(Eo *eo_e, int d, int x, int y, double rad, double radx, double rady, double pres, double ang, double fx, double fy, unsigned int timestamp, const void *data)
3671 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3672 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3673 _canvas_event_feed_multi_internal(eo_e, e, d, x, y, rad, radx, rady,
3674 pres, ang, fx, fy, EVAS_BUTTON_NONE, timestamp, data,
3675 EFL_POINTER_ACTION_MOVE);
3679 _key_event_dispatch(Evas_Public_Data *e, void *event_info,
3680 Efl_Input_Device *device,
3681 const Efl_Event_Description *efl_event_desc,
3682 Evas_Callback_Type evas_event_type, int event_id)
3687 device = e->default_seat;
3690 const char *name = efl_name_get(device);
3692 device = efl_input_device_seat_get(device);
3695 ERR("Could not find the parent seat from device name '%s'. Using default seat instead", name);
3696 device = e->default_seat;
3700 focused = eina_hash_find(e->focused_objects, &device);
3705 Evas_Object_Protected_Data *focused_obj =
3706 efl_data_scope_get(focused, EFL_CANVAS_OBJECT_CLASS);
3710 WRN("No element focused");
3714 if (!e->is_frozen && !evas_event_freezes_through(focused, focused_obj))
3716 evas_object_event_callback_call(focused, focused_obj,
3717 evas_event_type, event_info,
3718 event_id, efl_event_desc);
3723 _canvas_event_feed_key_down_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
3725 Eina_Bool exclusive = EINA_FALSE;
3726 Efl_Input_Pointer *evt;
3730 if (!e || !ev) return;
3731 if (e->is_frozen) return;
3732 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3735 e->last_timestamp = ev->timestamp;
3738 event_id = _evas_object_event_new();
3741 ev->modifiers = &(e->modifiers);
3742 ev->locks = &(e->locks);
3743 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
3744 if (ev->device) efl_ref(ev->device);
3750 Evas_Modifier_Mask *seat_mask, modifier_mask;
3751 Efl_Input_Device *seat = NULL;
3755 seat = efl_input_device_seat_get(ev->device);
3756 seat_mask = eina_hash_find(e->modifiers.masks, &seat);
3757 modifier_mask = seat_mask ? *seat_mask : 0;
3758 EINA_LIST_FOREACH(e->grabs, l, g)
3762 g->just_added = EINA_FALSE;
3765 if (g->delete_me) continue;
3766 if (!g->object) continue;
3767 if (!g->is_active) continue;
3768 if (((modifier_mask & g->modifiers) ||
3769 (g->modifiers == modifier_mask)) &&
3770 (!strcmp(ev->keyname, g->keyname)))
3772 if (!(modifier_mask & g->not_modifiers))
3774 Evas_Object_Protected_Data *object_obj = efl_data_scope_get(g->object, EFL_CANVAS_OBJECT_CLASS);
3775 if (!e->is_frozen &&
3776 !evas_event_freezes_through(g->object, object_obj))
3778 evas_object_event_callback_call(g->object, object_obj, EVAS_CALLBACK_KEY_DOWN, evt,
3779 event_id, EFL_EVENT_KEY_DOWN);
3781 if (g->exclusive) exclusive = EINA_TRUE;
3784 if (e->delete_me) break;
3787 if (e->walking_grabs <= 0)
3789 while (e->delete_grabs > 0)
3792 for (l = e->grabs; l;)
3794 g = eina_list_data_get(l);
3795 l = eina_list_next(l);
3798 Evas_Object_Protected_Data *g_object_obj = efl_data_scope_get(g->object, EFL_CANVAS_OBJECT_CLASS);
3799 evas_key_grab_free(g->object, g_object_obj, g->keyname,
3800 g->modifiers, g->not_modifiers);
3807 _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_DOWN,
3808 EVAS_CALLBACK_KEY_DOWN, event_id);
3809 _evas_post_event_callback_call(eo_e, e, event_id);
3812 if (ev->device) efl_unref(ev->device);
3816 _canvas_event_feed_key_up_internal(Evas_Public_Data *e, Efl_Input_Key_Data *ev)
3818 Eina_Bool exclusive = EINA_FALSE;
3819 Efl_Input_Pointer *evt;
3823 if (!e || !ev) return;
3824 if (e->is_frozen) return;
3825 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3828 e->last_timestamp = ev->timestamp;
3831 event_id = _evas_object_event_new();
3834 ev->modifiers = &(e->modifiers);
3835 ev->locks = &(e->locks);
3836 ev->event_flags |= (Efl_Input_Flags)e->default_event_flags;
3837 if (ev->device) efl_ref(ev->device);
3843 Evas_Modifier_Mask *seat_mask, modifier_mask;
3844 Efl_Input_Device *seat = NULL;
3848 seat = efl_input_device_seat_get(ev->device);
3849 seat_mask = eina_hash_find(e->modifiers.masks, &seat);
3850 modifier_mask = seat_mask ? *seat_mask : 0;
3851 EINA_LIST_FOREACH(e->grabs, l, g)
3855 g->just_added = EINA_FALSE;
3858 if (g->delete_me) continue;
3859 if (!g->object) continue;
3860 if (!g->is_active) continue;
3861 if (((modifier_mask & g->modifiers) ||
3862 (g->modifiers == modifier_mask)) &&
3863 (!(modifier_mask & g->not_modifiers)) &&
3864 (!strcmp(ev->keyname, g->keyname)))
3866 Evas_Object_Protected_Data *object_obj = efl_data_scope_get(g->object, EFL_CANVAS_OBJECT_CLASS);
3867 if (!e->is_frozen &&
3868 !evas_event_freezes_through(g->object, object_obj))
3870 evas_object_event_callback_call
3871 (g->object, object_obj, EVAS_CALLBACK_KEY_UP, evt,
3872 event_id, EFL_EVENT_KEY_UP);
3874 if (g->exclusive) exclusive = EINA_TRUE;
3876 if (e->delete_me) break;
3879 if (e->walking_grabs <= 0)
3881 while (e->delete_grabs > 0)
3883 Eina_List *ll, *l_next;
3887 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
3891 Evas_Object_Protected_Data *gr_object_obj =
3892 efl_data_scope_get(gr->object, EFL_CANVAS_OBJECT_CLASS);
3893 evas_key_grab_free(gr->object, gr_object_obj, gr->keyname,
3894 gr->modifiers, gr->not_modifiers);
3901 _key_event_dispatch(e, evt, ev->device, EFL_EVENT_KEY_UP,
3902 EVAS_CALLBACK_KEY_UP, event_id);
3903 _evas_post_event_callback_call(eo_e, e, event_id);
3906 if (ev->device) efl_unref(ev->device);
3910 _canvas_event_feed_key_legacy(Eo *eo_e, Evas_Public_Data *e,
3911 const char *keyname, const char *key,
3912 const char *string, const char *compose,
3913 unsigned int timestamp, const void *data,
3914 unsigned int keycode, Eina_Bool down)
3916 Efl_Input_Key_Data *ev = NULL;
3919 if (!keyname) return;
3921 evt = efl_input_key_instance_get( eo_e, (void **) &ev);
3924 ev->keyname = (char *) keyname;
3925 ev->data = (void *) data;
3927 ev->string = string;
3928 ev->compose = compose;
3929 ev->timestamp = timestamp;
3930 ev->keycode = keycode;
3932 ev->no_stringshare = EINA_TRUE;
3933 ev->device = efl_ref(_evas_event_legacy_device_get(e->evas, EINA_FALSE));
3937 _canvas_event_feed_key_down_internal(e, ev);
3939 _canvas_event_feed_key_up_internal(e, ev);
3945 evas_event_feed_key_down(Eo *eo_e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
3947 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3948 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3949 _canvas_event_feed_key_legacy(eo_e, e, keyname, key, string,
3950 compose, timestamp, data, 0, 1);
3954 evas_event_feed_key_up(Eo *eo_e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
3956 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3957 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3958 _canvas_event_feed_key_legacy(eo_e, e, keyname, key, string,
3959 compose, timestamp, data, 0, 0);
3963 evas_event_feed_key_down_with_keycode(Eo *eo_e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data, unsigned int keycode)
3965 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3966 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3967 _canvas_event_feed_key_legacy(eo_e, e, keyname, key, string,
3968 compose, timestamp, data, keycode, 1);
3972 evas_event_feed_key_up_with_keycode(Eo *eo_e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data, unsigned int keycode)
3974 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
3975 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3976 _canvas_event_feed_key_legacy(eo_e, e, keyname, key, string,
3977 compose, timestamp, data, keycode, 0);
3981 evas_event_feed_hold(Eo *eo_e, int hold, unsigned int timestamp, const void *data)
3983 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
3984 Efl_Input_Hold_Data *ev = NULL;
3985 Efl_Input_Hold *evt;
3986 Eina_List *l, *copy;
3987 Evas_Object *eo_obj;
3989 Evas_Pointer_Data *pdata;
3991 if (e->is_frozen) return;
3992 EVAS_EVENT_FEED_SAFETY_CHECK(e);
3993 e->last_timestamp = timestamp;
3995 event_id = _evas_object_event_new();
3997 evt = efl_input_hold_instance_get(eo_e, (void **) &ev);
4001 ev->data = (void *) data;
4002 ev->timestamp = timestamp;
4003 ev->event_flags = (Efl_Input_Flags)e->default_event_flags;
4004 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
4006 pdata = _evas_pointer_data_by_device_get(e, ev->device);
4011 copy = evas_event_list_copy(pdata->seat->object.in);
4012 EINA_LIST_FOREACH(copy, l, eo_obj)
4014 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
4015 if ( !evas_event_freezes_through(eo_obj, obj))
4017 evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_HOLD, evt,
4018 event_id, EFL_EVENT_HOLD);
4019 if ((obj->proxy->is_proxy) && (obj->proxy->src_events))
4020 _evas_event_source_hold_events(eo_obj, event_id, evt);
4022 if (e->delete_me || e->is_frozen) break;
4024 eina_list_free(copy);
4025 _evas_post_event_callback_call(eo_e, e, event_id);
4027 _evas_object_event_new();
4033 _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data *ev)
4035 Efl_Input_Pointer *evt;
4036 Eina_List *l, *copy;
4037 Evas_Object *eo_obj;
4040 Evas_Pointer_Data *pdata;
4042 static const int value_flags =
4043 _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP);
4045 if (!e || !ev) return;
4046 if (e->is_frozen) return;
4047 EVAS_EVENT_FEED_SAFETY_CHECK(e);
4049 pdata = _evas_pointer_data_by_device_get(e, ev->device);
4052 e->last_timestamp = ev->timestamp;
4054 ev->action = EFL_POINTER_ACTION_AXIS;
4055 ev->value_flags |= value_flags;
4056 event_id = _evas_object_event_new();
4059 if (ev->device) efl_ref(ev->device);
4062 copy = evas_event_list_copy(pdata->seat->object.in);
4064 EINA_LIST_FOREACH(copy, l, eo_obj)
4066 Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
4067 if (!evas_event_freezes_through(eo_obj, obj))
4069 evas_object_event_callback_call(eo_obj, obj,
4070 EVAS_CALLBACK_AXIS_UPDATE, evt,
4071 event_id, EFL_EVENT_POINTER_AXIS);
4072 if (e->delete_me || e->is_frozen) break;
4075 eina_list_free(copy);
4076 _evas_post_event_callback_call(eo_e, e, event_id);
4079 if (ev->device) efl_unref(ev->device);
4083 evas_event_feed_axis_update(Evas *eo_e, unsigned int timestamp, int device, int toolid, int naxis, const Evas_Axis *axes, const void *data)
4085 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
4086 Evas_Public_Data *e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
4087 Efl_Input_Pointer_Data *ev = NULL;
4088 Eina_Bool haswinx = 0, haswiny = 0;
4089 Efl_Input_Pointer *evt;
4090 double x = 0, y = 0;
4094 EVAS_EVENT_FEED_SAFETY_CHECK(e);
4096 evt = efl_input_pointer_instance_get( eo_e, (void **) &ev);
4099 ev->data = (void *) data;
4100 ev->timestamp = timestamp;
4101 ev->action = EFL_POINTER_ACTION_AXIS;
4102 ev->touch_id = toolid;
4104 // see also ecore_evas.c
4105 for (n = 0; n < naxis; n++)
4107 const Evas_Axis *axis = &(axes[n]);
4108 switch (axis->label)
4110 case EVAS_AXIS_LABEL_WINDOW_X:
4111 _efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
4113 haswinx = EINA_TRUE;
4116 case EVAS_AXIS_LABEL_WINDOW_Y:
4117 _efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
4119 haswiny = EINA_TRUE;
4122 case EVAS_AXIS_LABEL_X:
4125 _efl_input_value_mark(ev, EFL_INPUT_VALUE_X);
4128 ev->raw.x = axis->value;
4129 ev->has_raw = EINA_TRUE;
4132 case EVAS_AXIS_LABEL_Y:
4135 _efl_input_value_mark(ev, EFL_INPUT_VALUE_Y);
4138 ev->raw.y = axis->value;
4139 ev->has_raw = EINA_TRUE;
4142 case EVAS_AXIS_LABEL_NORMAL_X:
4143 ev->norm.x = axis->value;
4144 ev->has_norm = EINA_TRUE;
4147 case EVAS_AXIS_LABEL_NORMAL_Y:
4148 ev->norm.y = axis->value;
4149 ev->has_norm = EINA_TRUE;
4152 case EVAS_AXIS_LABEL_PRESSURE:
4153 _efl_input_value_mark(ev, EFL_INPUT_VALUE_PRESSURE);
4154 ev->pressure = axis->value;
4157 case EVAS_AXIS_LABEL_DISTANCE:
4158 _efl_input_value_mark(ev, EFL_INPUT_VALUE_DISTANCE);
4159 ev->distance = axis->value;
4162 case EVAS_AXIS_LABEL_AZIMUTH:
4163 _efl_input_value_mark(ev, EFL_INPUT_VALUE_AZIMUTH);
4164 ev->azimuth = axis->value;
4167 case EVAS_AXIS_LABEL_TILT:
4168 _efl_input_value_mark(ev, EFL_INPUT_VALUE_TILT);
4169 ev->tilt = axis->value;
4172 case EVAS_AXIS_LABEL_TWIST:
4173 _efl_input_value_mark(ev, EFL_INPUT_VALUE_TWIST);
4174 ev->twist = axis->value;
4177 case EVAS_AXIS_LABEL_UNKNOWN:
4178 case EVAS_AXIS_LABEL_TOUCH_WIDTH_MAJOR:
4179 case EVAS_AXIS_LABEL_TOUCH_WIDTH_MINOR:
4180 case EVAS_AXIS_LABEL_TOOL_WIDTH_MAJOR:
4181 case EVAS_AXIS_LABEL_TOOL_WIDTH_MINOR:
4183 DBG("Unsupported axis label %d, value %f (discarded)",
4184 axis->label, axis->value);
4192 /* FIXME: set proper device based on the device id (X or WL specific) */
4193 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE)); // FIXME
4196 _canvas_event_feed_axis_update_internal(e, ev);
4202 _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj)
4204 Evas_Public_Data *evas = obj->layer->evas;
4205 Eina_Bool in_output_rect;
4206 Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(evas, NULL);
4209 in_output_rect = evas_object_is_in_output_rect(eo_obj, obj, pdata->seat->x,
4210 pdata->seat->y, 1, 1);
4211 if ((in_output_rect) &&
4212 ((!obj->precise_is_inside) || (evas_object_is_inside(eo_obj, obj,
4216 _canvas_event_feed_mouse_move_legacy(evas->evas, evas,
4217 pdata->seat->x, pdata->seat->y,
4218 evas->last_timestamp, NULL);
4222 _efl_canvas_object_efl_object_event_freeze(Eo *obj, Evas_Object_Protected_Data *pd)
4224 efl_event_freeze(efl_super(obj, EFL_CANVAS_OBJECT_CLASS));
4225 if (efl_event_freeze_count_get(obj) == 1)
4227 pd->freeze_events = EINA_TRUE;
4228 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE,
4234 _efl_canvas_object_efl_object_event_thaw(Eo *obj, Evas_Object_Protected_Data *pd)
4236 if (efl_event_freeze_count_get(obj) == 1)
4238 pd->freeze_events = EINA_FALSE;
4239 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE,
4241 _feed_mouse_move_eval_internal(obj, pd);
4243 efl_event_thaw(efl_super(obj, EFL_CANVAS_OBJECT_CLASS));
4247 evas_object_freeze_events_set(Eo *eo_obj, Eina_Bool freeze)
4249 Evas_Object_Protected_Data *pd = EVAS_OBJECT_DATA_SAFE_GET(eo_obj);
4250 EINA_SAFETY_ON_NULL_RETURN(pd);
4253 if (pd->freeze_events == freeze) return;
4256 efl_event_freeze(eo_obj);
4258 // The following check is needed, as eo does not accept more thaw calls than freeze calls.
4259 // However, evas legacy stuff accepted multiple flase sets
4260 if (efl_event_freeze_count_get(eo_obj) > 0)
4261 efl_event_thaw(eo_obj);
4265 evas_object_freeze_events_get(const Eo *eo_obj EINA_UNUSED)
4267 return (efl_event_freeze_count_get(eo_obj) > 0);
4271 _efl_canvas_object_pass_events_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool pass)
4274 if (obj->pass_events == pass) return;
4275 obj->pass_events = pass;
4276 evas_object_smart_member_cache_invalidate(eo_obj, EINA_TRUE, EINA_FALSE, EINA_FALSE);
4277 _feed_mouse_move_eval_internal(eo_obj, obj);
4281 _efl_canvas_object_pass_events_get(const Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
4283 return obj->pass_events;
4287 _efl_canvas_object_repeat_events_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Bool repeat)
4290 if (obj->repeat_events == repeat) return;
4291 obj->repeat_events = repeat;
4292 _feed_mouse_move_eval_internal(eo_obj, obj);
4296 _efl_canvas_object_repeat_events_get(const Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
4298 return obj->repeat_events;
4302 _efl_canvas_object_propagate_events_set(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Bool prop)
4304 obj->no_propagate = !prop;
4308 _efl_canvas_object_propagate_events_get(const Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
4310 return !(obj->no_propagate);
4314 _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_Data *obj, Efl_Input_Device *dev, Evas_Object_Pointer_Mode setting)
4319 Evas_Pointer_Data *pdata;
4320 Evas_Object_Pointer_Data *obj_pdata;
4322 pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev);
4323 if (!pdata) return EINA_FALSE;
4325 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
4326 EINA_SAFETY_ON_NULL_RETURN_VAL(obj_pdata, EINA_FALSE);
4329 if (obj_pdata->pointer_mode == setting) return EINA_FALSE;
4331 /* adjust by number of pointer down events */
4332 addgrab = pdata->seat->downs;
4333 switch (obj_pdata->pointer_mode)
4335 /* nothing needed */
4336 case EVAS_OBJECT_POINTER_MODE_NOGRAB: break;
4337 /* decrement canvas nogrep (NO Grab/REPeat) counter */
4338 case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN:
4339 if (obj_pdata->mouse_grabbed)
4340 pdata->seat->nogrep--;
4342 /* remove related grabs from canvas and object */
4343 case EVAS_OBJECT_POINTER_MODE_AUTOGRAB:
4344 if (obj_pdata->mouse_grabbed)
4346 pdata->seat->mouse_grabbed -= obj_pdata->mouse_grabbed;
4347 obj_pdata->mouse_grabbed = 0;
4350 /* adjustments for new mode */
4353 /* nothing needed */
4354 case EVAS_OBJECT_POINTER_MODE_NOGRAB: break;
4355 /* increment canvas nogrep (NO Grab/REPeat) counter */
4356 case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN:
4357 pdata->seat->nogrep++;
4358 /* having nogrep set indicates that any object following it in
4359 * the pointer.object.in list will not be receiving events, meaning
4360 * that they will fail to unset any existing grabs/flags. unset them
4361 * now to avoid breaking the canvas
4363 EINA_LIST_FOREACH(pdata->seat->object.in, l, cobj)
4365 Evas_Object_Protected_Data *cobj_data;
4367 /* skip to the current object */
4368 if (cobj != eo_obj) continue;
4369 /* only change objects past it */
4370 EINA_LIST_FOREACH(l->next, l, cobj)
4372 Evas_Object_Pointer_Data *cobj_pdata;
4373 cobj_data = efl_data_scope_get(cobj, EFL_CANVAS_OBJECT_CLASS);
4374 cobj_pdata = _evas_object_pointer_data_get(pdata, cobj_data);
4375 if (!cobj_pdata) continue;
4376 if (!cobj_pdata->mouse_grabbed) continue;
4377 cobj_pdata->mouse_grabbed -= addgrab;
4378 pdata->seat->mouse_grabbed -= addgrab;
4379 if (cobj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
4380 pdata->seat->nogrep--;
4385 /* add all button grabs to this object */
4386 case EVAS_OBJECT_POINTER_MODE_AUTOGRAB:
4387 obj_pdata->mouse_grabbed += addgrab;
4388 pdata->seat->mouse_grabbed += addgrab;
4390 obj_pdata->pointer_mode = setting;
4394 EOLIAN Evas_Object_Pointer_Mode
4395 _efl_canvas_object_pointer_mode_by_device_get(const Eo *eo_obj EINA_UNUSED,
4396 Evas_Object_Protected_Data *obj,
4397 Efl_Input_Device *dev)
4400 Evas_Pointer_Data *pdata;
4401 Evas_Object_Pointer_Data *obj_pdata;
4403 pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev);
4404 EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB);
4406 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
4407 EINA_SAFETY_ON_NULL_RETURN_VAL(obj_pdata, EVAS_OBJECT_POINTER_MODE_AUTOGRAB);
4408 return obj_pdata->pointer_mode;
4412 _efl_canvas_object_pointer_mode_set(Eo *eo_obj, Evas_Object_Protected_Data *obj,
4413 Evas_Object_Pointer_Mode setting)
4415 return _efl_canvas_object_pointer_mode_by_device_set(eo_obj, obj, NULL, setting);
4418 EOLIAN Evas_Object_Pointer_Mode
4419 _efl_canvas_object_pointer_mode_get(const Eo *eo_obj, Evas_Object_Protected_Data *obj)
4421 return _efl_canvas_object_pointer_mode_by_device_get(eo_obj, obj, NULL);
4425 _efl_canvas_object_efl_canvas_pointer_pointer_inside_get(const Eo *eo_obj,
4426 Evas_Object_Protected_Data *obj,
4427 Efl_Input_Device *pointer)
4429 Evas_Object_Protected_Data *in, *parent;
4430 Eo *eo_in, *eo_parent;
4432 Evas_Object_Pointer_Data *obj_pdata;
4433 Evas_Pointer_Data *pdata;
4435 EVAS_OBJECT_DATA_ALIVE_CHECK(obj, EINA_FALSE);
4438 //TIZEN_ONLY(20180530): add storing last mouse device.
4439 //pointer = obj->layer->evas->default_mouse;
4440 pointer = (obj->layer->evas->last_mouse ? obj->layer->evas->last_mouse :
4441 obj->layer->evas->default_mouse);
4444 if (!pointer) return EINA_FALSE;
4446 pdata = _evas_pointer_data_by_device_get(obj->layer->evas, pointer);
4447 if (!pdata) return EINA_FALSE;
4448 obj_pdata = _evas_object_pointer_data_get(pdata, obj);
4449 if (!obj_pdata) return EINA_FALSE;
4451 return obj_pdata->mouse_in;
4453 /* This is to keep the legacy APIs evas_object_pointer_inside_by_device_get() &
4454 * evas_object_pointer_inside_get() old behaviour. */
4455 if (obj->is_pointer_inside_legacy) return EINA_FALSE;
4457 /* For smart objects, this is a bit expensive obj->mouse_in will not be set.
4458 * Alternatively we could count the number of in and out events propagated
4459 * to the smart object, assuming they always match. */
4460 EINA_LIST_FOREACH(pdata->seat->object.in, l, eo_in)
4462 if (EINA_UNLIKELY(eo_in == eo_obj))
4465 in = EVAS_OBJECT_DATA_GET(eo_in);
4466 if (!EVAS_OBJECT_DATA_ALIVE(in)) continue;
4467 eo_parent = in->smart.parent;
4470 if ((eo_parent == eo_obj) && !in->no_propagate)
4472 parent = EVAS_OBJECT_DATA_GET(eo_parent);
4473 if (!EVAS_OBJECT_DATA_ALIVE(parent)) break;
4474 eo_parent = parent->smart.parent;
4482 evas_event_refeed_event(Eo *eo_e, void *event_copy, Evas_Callback_Type event_type)
4484 EINA_SAFETY_ON_FALSE_RETURN(efl_isa(eo_e, EVAS_CANVAS_CLASS));
4485 if (!event_copy) return;
4489 case EVAS_CALLBACK_MOUSE_IN:
4491 Evas_Event_Mouse_In *ev = event_copy;
4492 evas_event_feed_mouse_in(eo_e, ev->timestamp, ev->data);
4495 case EVAS_CALLBACK_MOUSE_OUT:
4497 Evas_Event_Mouse_Out *ev = event_copy;
4498 evas_event_feed_mouse_out(eo_e, ev->timestamp, ev->data);
4501 case EVAS_CALLBACK_MOUSE_DOWN:
4503 Evas_Event_Mouse_Down *ev = event_copy;
4504 evas_event_feed_mouse_down(eo_e, ev->button, ev->flags, ev-> timestamp, ev->data);
4507 case EVAS_CALLBACK_MOUSE_UP:
4509 Evas_Event_Mouse_Up *ev = event_copy;
4510 evas_event_feed_mouse_up(eo_e, ev->button, ev->flags, ev-> timestamp, ev->data);
4513 case EVAS_CALLBACK_MOUSE_MOVE:
4515 Evas_Event_Mouse_Move *ev = event_copy;
4516 evas_event_feed_mouse_move(eo_e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
4519 case EVAS_CALLBACK_MOUSE_WHEEL:
4521 Evas_Event_Mouse_Wheel *ev = event_copy;
4522 evas_event_feed_mouse_wheel(eo_e, ev->direction, ev-> z, ev->timestamp, ev->data);
4525 case EVAS_CALLBACK_MULTI_DOWN:
4527 Evas_Event_Multi_Down *ev = event_copy;
4528 evas_event_feed_multi_down(eo_e, ev->device, ev->canvas.x, ev->canvas.y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, ev->canvas.xsub, ev->canvas.ysub, ev->flags, ev->timestamp, ev->data);
4531 case EVAS_CALLBACK_MULTI_UP:
4533 Evas_Event_Multi_Up *ev = event_copy;
4534 evas_event_feed_multi_up(eo_e, ev->device, ev->canvas.x, ev->canvas.y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, ev->canvas.xsub, ev->canvas.ysub, ev->flags, ev->timestamp, ev->data);
4537 case EVAS_CALLBACK_MULTI_MOVE:
4539 Evas_Event_Multi_Move *ev = event_copy;
4540 evas_event_feed_multi_move(eo_e, ev->device, ev->cur.canvas.x, ev->cur.canvas.y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, ev->cur.canvas.xsub, ev->cur.canvas.ysub, ev->timestamp, ev->data);
4543 case EVAS_CALLBACK_KEY_DOWN:
4545 Evas_Event_Key_Down *ev = event_copy;
4546 evas_event_feed_key_down(eo_e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
4549 case EVAS_CALLBACK_KEY_UP:
4551 Evas_Event_Key_Up *ev = event_copy;
4552 evas_event_feed_key_up(eo_e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
4555 case EVAS_CALLBACK_AXIS_UPDATE:
4557 Evas_Event_Axis_Update *ev = event_copy;
4558 evas_event_feed_axis_update(eo_e, ev->timestamp, ev->device, ev->toolid, ev->naxis, ev->axis, ev->data);
4561 default: /* All non-input events are not handeled */
4568 _evas_canvas_event_down_count_by_device_get(const Eo *eo_e EINA_UNUSED, Evas_Public_Data *e,
4569 Efl_Input_Device *dev)
4571 Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev);
4572 EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, 0);
4573 return pdata->seat->downs;
4577 _evas_canvas_event_down_count_get(const Eo *eo_e EINA_UNUSED, Evas_Public_Data *e)
4579 return _evas_canvas_event_down_count_by_device_get(eo_e, e, NULL);
4583 _evas_canvas_event_pointer_cb(void *data, const Efl_Event *event)
4585 Efl_Input_Pointer_Data *ev = efl_data_scope_get(event->info, EFL_INPUT_POINTER_CLASS);
4586 Evas_Public_Data *e = data;
4587 Evas *eo_e = event->object;
4588 Eina_Bool nodev = 0;
4592 ev->evas_done = EINA_TRUE;
4593 ev->modifiers = &e->modifiers;
4594 ev->locks = &e->locks;
4596 //TIZEN_ONLY(20180530): add storing last mouse device.
4600 ev->device = efl_ref(_evas_event_legacy_device_get(eo_e, EINA_TRUE));
4603 e->last_mouse = ev->device;
4608 case EFL_POINTER_ACTION_MOVE:
4609 if (ev->touch_id == 0)
4610 _canvas_event_feed_mouse_move_internal(e, ev);
4612 _canvas_event_feed_multi_move_internal(e, ev);
4615 case EFL_POINTER_ACTION_DOWN:
4616 if (ev->touch_id == 0)
4617 _canvas_event_feed_mouse_down_internal(e, ev);
4619 _canvas_event_feed_multi_down_internal(e, ev);
4622 case EFL_POINTER_ACTION_UP:
4623 if (ev->touch_id == 0)
4624 _canvas_event_feed_mouse_up_internal(e, ev);
4626 _canvas_event_feed_multi_up_internal(e, ev);
4629 case EFL_POINTER_ACTION_CANCEL:
4630 _canvas_event_feed_mouse_cancel_internal(e, ev);
4633 case EFL_POINTER_ACTION_IN:
4634 _canvas_event_feed_mouse_in_internal(eo_e, ev);
4637 case EFL_POINTER_ACTION_OUT:
4638 _canvas_event_feed_mouse_out_internal(eo_e, ev);
4641 case EFL_POINTER_ACTION_WHEEL:
4642 _canvas_event_feed_mouse_wheel_internal(eo_e, ev);
4645 case EFL_POINTER_ACTION_AXIS:
4646 _canvas_event_feed_axis_update_internal(e, ev);
4650 ERR("unsupported event type: %d", ev->action);
4651 ev->evas_done = EINA_FALSE;
4655 if (nodev) ev->device = NULL;
4659 _evas_canvas_event_key_cb(void *data, const Efl_Event *event)
4661 Efl_Input_Key *evt = event->info;
4662 Evas_Public_Data *e = data;
4663 Efl_Input_Key_Data *ev;
4664 Eina_Bool nodev = 0;
4666 ev = efl_data_scope_get(evt, EFL_INPUT_KEY_CLASS);
4672 ev->device = _evas_event_legacy_device_get(e->evas, EINA_FALSE);
4675 ev->modifiers = &e->modifiers;
4676 ev->locks = &e->locks;
4679 _canvas_event_feed_key_down_internal(e, ev);
4681 _canvas_event_feed_key_up_internal(e, ev);
4683 if (nodev) ev->device = NULL;
4684 ev->evas_done = EINA_TRUE;
4688 _evas_canvas_event_focus_cb(void *data, const Efl_Event *event)
4690 Efl_Input_Device *seat = efl_canvas_scene_seat_default_get(event->object);
4691 Evas_Public_Data *e = data;
4693 EINA_SAFETY_ON_NULL_RETURN(seat);
4695 if (event->desc == EFL_CANVAS_SCENE_EVENT_SCENE_FOCUS_IN)
4697 if (eina_list_data_find(e->focused_by, seat)) return;
4698 e->focused_by = eina_list_append(e->focused_by, seat);
4702 if (!eina_list_data_find(e->focused_by, seat)) return;
4703 e->focused_by = eina_list_remove(e->focused_by, seat);
4707 // note: "hold" event comes from above (elm), not below (ecore)
4708 EFL_CALLBACKS_ARRAY_DEFINE(_evas_canvas_event_pointer_callbacks,
4709 { EFL_EVENT_POINTER_MOVE, _evas_canvas_event_pointer_cb },
4710 { EFL_EVENT_POINTER_DOWN, _evas_canvas_event_pointer_cb },
4711 { EFL_EVENT_POINTER_UP, _evas_canvas_event_pointer_cb },
4712 { EFL_EVENT_POINTER_IN, _evas_canvas_event_pointer_cb },
4713 { EFL_EVENT_POINTER_OUT, _evas_canvas_event_pointer_cb },
4714 { EFL_EVENT_POINTER_CANCEL, _evas_canvas_event_pointer_cb },
4715 { EFL_EVENT_POINTER_WHEEL, _evas_canvas_event_pointer_cb },
4716 { EFL_EVENT_POINTER_AXIS, _evas_canvas_event_pointer_cb },
4717 { EFL_EVENT_FINGER_MOVE, _evas_canvas_event_pointer_cb },
4718 { EFL_EVENT_FINGER_DOWN, _evas_canvas_event_pointer_cb },
4719 { EFL_EVENT_FINGER_UP, _evas_canvas_event_pointer_cb },
4720 { EFL_EVENT_KEY_DOWN, _evas_canvas_event_key_cb },
4721 { EFL_EVENT_KEY_UP, _evas_canvas_event_key_cb },
4722 { EFL_CANVAS_SCENE_EVENT_SCENE_FOCUS_IN, _evas_canvas_event_focus_cb },
4723 { EFL_CANVAS_SCENE_EVENT_SCENE_FOCUS_OUT, _evas_canvas_event_focus_cb })
4726 _evas_canvas_event_init(Evas *eo_e, Evas_Public_Data *e)
4728 efl_event_callback_array_add(eo_e, _evas_canvas_event_pointer_callbacks(), e);
4732 _evas_canvas_event_shutdown(Evas *eo_e, Evas_Public_Data *e)
4734 efl_event_callback_array_del(eo_e, _evas_canvas_event_pointer_callbacks(), e);
4738 _evas_canvas_event_pointer_move_event_dispatch(Evas_Public_Data *edata,
4739 Evas_Pointer_Data *pdata,
4742 Efl_Input_Pointer_Data *ev = NULL;
4743 Efl_Input_Pointer *evt;
4745 evt = efl_input_pointer_instance_get( edata->evas,
4749 ev->data = (void *) data;
4750 ev->timestamp = edata->last_timestamp;
4751 ev->device = efl_ref(pdata->pointer);
4752 ev->cur.x = pdata->seat->x;
4753 ev->cur.y = pdata->seat->y;
4755 _canvas_event_feed_mouse_move_internal(edata, ev);
4761 _evas_canvas_event_pointer_in_rect_mouse_move_feed(Evas_Public_Data *edata,
4763 Evas_Object_Protected_Data *obj_data,
4765 Eina_Bool in_objects_list,
4768 Evas_Pointer_Seat *pseat;
4770 EINA_INLIST_FOREACH(edata->seats, pseat)
4772 if (!pseat->pointers) continue;
4773 if (!evas_object_is_in_output_rect(obj, obj_data, pseat->x,
4776 if ((in_objects_list && eina_list_data_find(pseat->object.in, obj)) || !in_objects_list)
4778 //TIZEN_ONLY(20180530): add storing last mouse device.
4779 //Evas_Pointer_Data *pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4780 Evas_Pointer_Data *pdata = NULL;
4781 if (edata->last_mouse)
4783 pdata = _evas_pointer_data_by_device_get(edata, edata->last_mouse);
4784 //TIZEN_ONLY(20200213): add checking mouse grab count
4785 if (!pdata) pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4789 pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4791 _evas_canvas_event_pointer_move_event_dispatch(edata, pdata, data);
4797 _evas_canvas_event_pointer_in_list_mouse_move_feed(Evas_Public_Data *edata,
4800 Evas_Object_Protected_Data *obj_data,
4805 Evas_Pointer_Seat *pseat;
4807 EINA_INLIST_FOREACH(edata->seats, pseat)
4809 Evas_Pointer_Data *pdata, *found = NULL;
4813 if (!pseat->pointers) continue;
4814 in = evas_object_is_in_output_rect(obj, obj_data, pseat->x,
4816 EINA_LIST_FOREACH(was, l, pdata)
4817 if (pdata->seat == pseat)
4823 if ((xor_rule && ((in && !found) || (!in && found))) ||
4824 (!xor_rule && (in || found)))
4826 //TIZEN_ONLY(20180530): add storing last mouse device.
4827 //TIZEN_ONLY(20181006): Now, last_mouse is always used even pdata is founded.
4828 //if (!pdata) pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4829 if (edata->last_mouse)
4831 pdata = _evas_pointer_data_by_device_get(edata, edata->last_mouse);
4832 //TIZEN_ONLY(20200213): add checking mouse grab count
4833 if (!pdata) pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4837 pdata = EINA_INLIST_CONTAINER_GET(pseat->pointers, Evas_Pointer_Data);
4839 _evas_canvas_event_pointer_move_event_dispatch(edata, pdata, data);