1 #include "evas_common.h"
2 #include "evas_private.h"
5 _evas_event_object_list_in_get(Evas *e, Eina_List *in,
6 const Eina_Inlist *list, Evas_Object *stop,
7 int x, int y, int *no_rep);
10 _evas_event_havemap_adjust(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Eina_Bool mouse_grabbed)
12 if (obj->smart.parent)
13 _evas_event_havemap_adjust(obj->smart.parent, x, y, mouse_grabbed);
15 if ((!obj->cur.usemap) || (!obj->cur.map) || (!obj->cur.map->count == 4))
18 evas_map_coords_get(obj->cur.map, *x, *y, x, y, mouse_grabbed);
19 *x += obj->cur.geometry.x;
20 *y += obj->cur.geometry.y;
24 _evas_event_framespace_adjust(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
26 if (obj->is_frame) return;
28 if ((!obj->smart.parent) && (obj->smart.smart))
32 evas = obj->layer->evas;
33 if (x) *x -= evas->framespace.x;
34 if (y) *y -= evas->framespace.y;
39 _evas_event_object_list_raw_in_get(Evas *e, Eina_List *in,
40 const Eina_Inlist *list, Evas_Object *stop,
41 int x, int y, int *no_rep)
47 for (obj = _EINA_INLIST_CONTAINER(obj, list);
49 obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
56 if (evas_event_passes_through(obj)) continue;
57 if ((obj->cur.visible) && (obj->delete_me == 0) &&
58 (!obj->clip.clipees) &&
59 (evas_object_clippers_is_visible(obj)))
65 if ((obj->cur.usemap) && (obj->cur.map) &&
66 (obj->cur.map->count == 4))
68 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
71 if (!evas_map_coords_get(obj->cur.map, x, y,
73 &(obj->cur.map->my), 0))
79 in = _evas_event_object_list_in_get
81 evas_object_smart_members_get_direct(obj),
83 obj->cur.geometry.x + obj->cur.map->mx,
84 obj->cur.geometry.y + obj->cur.map->my,
91 if (!obj->child_has_map)
92 evas_object_smart_bouding_box_update(obj);
93 if (obj->child_has_map ||
94 (obj->cur.bounding_box.x <= x &&
95 obj->cur.bounding_box.x + obj->cur.bounding_box.w >= x &&
96 obj->cur.bounding_box.y <= y &&
97 obj->cur.bounding_box.y + obj->cur.bounding_box.h >= y) ||
98 (obj->cur.geometry.x <= x &&
99 obj->cur.geometry.y + obj->cur.geometry.w >= x &&
100 obj->cur.geometry.y <= y &&
101 obj->cur.geometry.y + obj->cur.geometry.h >= y))
102 in = _evas_event_object_list_in_get
103 (e, in, evas_object_smart_members_get_direct(obj),
108 if (!obj->repeat_events)
117 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
121 if ((obj->cur.usemap) && (obj->cur.map) &&
122 (obj->cur.map->count == 4))
124 if (!evas_map_coords_get(obj->cur.map, x, y,
126 &(obj->cur.map->my), 0))
132 if (inside && ((!obj->precise_is_inside) ||
133 (evas_object_is_inside(obj, x, y))))
135 if (!evas_event_freezes_through(obj))
136 in = eina_list_append(in, obj);
137 if (!obj->repeat_events)
151 _evas_event_object_list_in_get(Evas *e, Eina_List *in,
152 const Eina_Inlist *list, Evas_Object *stop,
153 int x, int y, int *no_rep)
155 if (!list) return NULL;
156 return _evas_event_object_list_raw_in_get(e, in, list->last, stop, x, y,
161 evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
164 Eina_List *in = NULL;
166 if ((!e->layers) || (e->events_frozen > 0)) return NULL;
167 EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
170 in = _evas_event_object_list_in_get(e, in,
171 EINA_INLIST_GET(lay->objects),
172 stop, x, y, &no_rep);
173 if (no_rep) return in;
179 evas_event_list_copy(Eina_List *list)
181 Eina_List *l, *new_l = NULL;
184 EINA_LIST_FOREACH(list, l, data)
185 new_l = eina_list_append(new_l, data);
188 /* public functions */
191 evas_event_default_flags_set(Evas *e, Evas_Event_Flags flags)
193 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
196 e->default_event_flags = flags;
199 EAPI Evas_Event_Flags
200 evas_event_default_flags_get(const Evas *e)
202 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
203 return EVAS_EVENT_FLAG_ON_HOLD;
205 return e->default_event_flags;
209 evas_event_freeze(Evas *e)
211 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
218 evas_event_thaw(Evas *e)
220 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
224 if (e->events_frozen == 0)
228 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
232 EINA_INLIST_FOREACH(lay->objects, obj)
234 evas_object_clip_recalc(obj);
235 evas_object_recalc_clippees(obj);
239 if (e->events_frozen < 0)
240 evas_debug_generic(" Thaw of events when already thawed!!!\n");
244 evas_event_freeze_get(const Evas *e)
246 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
249 return e->events_frozen;
253 evas_event_thaw_eval(Evas *e)
255 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
258 if (e->events_frozen != 0) return;
260 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y,
261 e->last_timestamp, NULL);
265 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
268 Evas_Event_Mouse_Down ev;
273 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
277 if ((b < 1) || (b > 32)) return;
279 e->pointer.button |= (1 << (b - 1));
282 if (e->events_frozen > 0) return;
283 e->last_timestamp = timestamp;
285 _evas_object_event_new();
287 event_id = _evas_event_counter;
289 ev.output.x = e->pointer.x;
290 ev.output.y = e->pointer.y;
291 ev.canvas.x = e->pointer.x;
292 ev.canvas.y = e->pointer.y;
293 ev.data = (void *)data;
294 ev.modifiers = &(e->modifiers);
295 ev.locks = &(e->locks);
297 ev.timestamp = timestamp;
298 ev.event_flags = e->default_event_flags;
299 ev.dev = _evas_device_top_get(e);
300 if (ev.dev) _evas_device_ref(ev.dev);
303 /* append new touch point to the touch point list */
304 _evas_touch_point_append(e, 0, e->pointer.x, e->pointer.y);
305 /* If this is the first finger down, i.e no other fingers pressed,
306 * get a new event list, otherwise, keep the current grabbed list. */
307 if (e->pointer.mouse_grabbed == 0)
309 Eina_List *ins = evas_event_objects_event_list(e,
313 /* free our old list of ins */
314 e->pointer.object.in = eina_list_free(e->pointer.object.in);
315 /* and set up the new one */
316 e->pointer.object.in = ins;
317 /* adjust grabbed count by the nuymber of currently held down
319 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
321 copy = evas_event_list_copy(e->pointer.object.in);
322 EINA_LIST_FOREACH(copy, l, obj)
324 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
325 (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
327 obj->mouse_grabbed += addgrab + 1;
328 e->pointer.mouse_grabbed += addgrab + 1;
329 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
336 EINA_LIST_FOREACH(copy, l, obj)
338 if (obj->delete_me) continue;
339 ev.canvas.x = e->pointer.x;
340 ev.canvas.y = e->pointer.y;
341 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
342 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
344 if (e->events_frozen <= 0)
345 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev, event_id);
346 if (e->delete_me) break;
347 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
350 if (copy) eina_list_free(copy);
351 e->last_mouse_down_counter++;
352 _evas_post_event_callback_call(e);
353 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
354 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
355 if (ev.dev) _evas_device_unref(ev.dev);
360 _post_up_handle(Evas *e, unsigned int timestamp, const void *data)
362 Eina_List *l, *copy, *ins, *ll;
363 Evas_Event_Mouse_Out ev;
368 _evas_object_event_new();
370 event_id = _evas_event_counter;
371 ev.buttons = e->pointer.button;
372 ev.output.x = e->pointer.x;
373 ev.output.y = e->pointer.y;
374 ev.canvas.x = e->pointer.x;
375 ev.canvas.y = e->pointer.y;
376 ev.data = (void *)data;
377 ev.modifiers = &(e->modifiers);
378 ev.locks = &(e->locks);
379 ev.timestamp = timestamp;
380 ev.event_flags = e->default_event_flags;
381 ev.dev = _evas_device_top_get(e);
382 if (ev.dev) _evas_device_ref(ev.dev);
384 /* get new list of ins */
385 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
386 /* go thru old list of in objects */
387 copy = evas_event_list_copy(e->pointer.object.in);
388 EINA_LIST_FOREACH(copy, ll, obj)
390 ev.canvas.x = e->pointer.x;
391 ev.canvas.y = e->pointer.y;
392 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
393 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
394 if ((!eina_list_data_find(ins, obj)) ||
395 (!e->pointer.inside))
400 if (e->events_frozen <= 0)
401 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
404 if (e->delete_me) break;
406 _evas_post_event_callback_call(e);
408 if (copy) copy = eina_list_free(copy);
409 if (e->pointer.inside)
411 Evas_Event_Mouse_In ev_in;
412 Evas_Object *obj_itr;
414 _evas_object_event_new();
416 event_id = _evas_event_counter;
417 ev_in.buttons = e->pointer.button;
418 ev_in.output.x = e->pointer.x;
419 ev_in.output.y = e->pointer.y;
420 ev_in.canvas.x = e->pointer.x;
421 ev_in.canvas.y = e->pointer.y;
422 ev_in.data = (void *)data;
423 ev_in.modifiers = &(e->modifiers);
424 ev_in.locks = &(e->locks);
425 ev_in.timestamp = timestamp;
426 ev_in.event_flags = e->default_event_flags;
428 EINA_LIST_FOREACH(ins, l, obj_itr)
430 ev_in.canvas.x = e->pointer.x;
431 ev_in.canvas.y = e->pointer.y;
432 _evas_event_framespace_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y);
433 _evas_event_havemap_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y, obj_itr->mouse_grabbed);
434 if (!eina_list_data_find(e->pointer.object.in, obj_itr))
436 if (!obj_itr->mouse_in)
438 obj_itr->mouse_in = 1;
439 if (e->events_frozen <= 0)
440 evas_object_event_callback_call(obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in, event_id);
443 if (e->delete_me) break;
446 _evas_post_event_callback_call(e);
450 ins = eina_list_free(ins);
453 if (e->pointer.mouse_grabbed == 0)
455 /* free our old list of ins */
456 eina_list_free(e->pointer.object.in);
457 /* and set up the new one */
458 e->pointer.object.in = ins;
462 /* free our cur ins */
465 if (e->pointer.inside)
466 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
467 if (ev.dev) _evas_device_unref(ev.dev);
472 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
476 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
480 if ((b < 1) || (b > 32)) return;
481 if (e->pointer.downs <= 0) return;
483 e->pointer.button &= ~(1 << (b - 1));
486 if (e->events_frozen > 0) return;
487 e->last_timestamp = timestamp;
490 Evas_Event_Mouse_Up ev;
494 _evas_object_event_new();
496 event_id = _evas_event_counter;
498 ev.output.x = e->pointer.x;
499 ev.output.y = e->pointer.y;
500 ev.canvas.x = e->pointer.x;
501 ev.canvas.y = e->pointer.y;
502 ev.data = (void *)data;
503 ev.modifiers = &(e->modifiers);
504 ev.locks = &(e->locks);
506 ev.timestamp = timestamp;
507 ev.event_flags = e->default_event_flags;
508 ev.dev = _evas_device_top_get(e);
509 if (ev.dev) _evas_device_ref(ev.dev);
512 /* update released touch point */
513 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
514 copy = evas_event_list_copy(e->pointer.object.in);
515 EINA_LIST_FOREACH(copy, l, obj)
517 ev.canvas.x = e->pointer.x;
518 ev.canvas.y = e->pointer.y;
519 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
520 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
521 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) &&
522 (obj->mouse_grabbed > 0))
524 obj->mouse_grabbed--;
525 e->pointer.mouse_grabbed--;
529 if ((e->events_frozen <= 0) &&
530 (!evas_event_freezes_through(obj)))
531 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id);
533 if (e->delete_me) break;
534 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
536 if (e->pointer.nogrep > 0) e->pointer.nogrep--;
540 if (copy) copy = eina_list_free(copy);
541 e->last_mouse_up_counter++;
542 _evas_post_event_callback_call(e);
543 if (ev.dev) _evas_device_unref(ev.dev);
546 if (e->pointer.mouse_grabbed == 0)
548 _post_up_handle(e, timestamp, data);
551 if (e->pointer.mouse_grabbed < 0)
553 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
554 e->pointer.mouse_grabbed);
556 /* remove released touch point from the touch point list */
557 _evas_touch_point_remove(e, 0);
563 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
567 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
571 if (e->events_frozen > 0) return;
574 for (i = 0; i < 32; i++)
576 if ((e->pointer.button & (1 << i)))
577 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
579 // FIXME: multi cancel too?
584 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
587 Evas_Event_Mouse_Wheel ev;
591 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
595 if (e->events_frozen > 0) return;
596 e->last_timestamp = timestamp;
598 _evas_object_event_new();
600 event_id = _evas_event_counter;
601 ev.direction = direction;
603 ev.output.x = e->pointer.x;
604 ev.output.y = e->pointer.y;
605 ev.canvas.x = e->pointer.x;
606 ev.canvas.y = e->pointer.y;
607 ev.data = (void *) data;
608 ev.modifiers = &(e->modifiers);
609 ev.locks = &(e->locks);
610 ev.timestamp = timestamp;
611 ev.event_flags = e->default_event_flags;
612 ev.dev = _evas_device_top_get(e);
613 if (ev.dev) _evas_device_ref(ev.dev);
616 copy = evas_event_list_copy(e->pointer.object.in);
618 EINA_LIST_FOREACH(copy, l, obj)
620 ev.canvas.x = e->pointer.x;
621 ev.canvas.y = e->pointer.y;
622 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
623 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
624 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
625 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id);
626 if (e->delete_me) break;
628 if (copy) copy = eina_list_free(copy);
629 _evas_post_event_callback_call(e);
631 if (ev.dev) _evas_device_unref(ev.dev);
636 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
638 Evas_Object *nogrep_obj = NULL;
640 //// Evas_Coord pcx, pcy;
642 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
648 //// pcx = e->pointer.canvas_x;
649 //// pcy = e->pointer.canvas_y;
651 if (e->events_frozen > 0) return;
652 e->last_timestamp = timestamp;
656 //// e->pointer.canvas_x = x;
657 //// e->pointer.canvas_y = y;
658 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
659 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
660 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
662 /* update moved touch point */
663 if ((px != x) || (py != y))
664 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
665 /* if our mouse button is grabbed to any objects */
666 if (e->pointer.mouse_grabbed > 0)
668 /* go thru old list of in objects */
669 Eina_List *outs = NULL;
673 Evas_Event_Mouse_Move ev;
677 _evas_object_event_new();
679 event_id = _evas_event_counter;
680 ev.buttons = e->pointer.button;
681 ev.cur.output.x = e->pointer.x;
682 ev.cur.output.y = e->pointer.y;
683 ev.cur.canvas.x = e->pointer.x;
684 ev.cur.canvas.y = e->pointer.y;
685 ev.prev.output.x = px;
686 ev.prev.output.y = py;
687 ev.prev.canvas.x = px;
688 ev.prev.canvas.y = py;
689 ev.data = (void *)data;
690 ev.modifiers = &(e->modifiers);
691 ev.locks = &(e->locks);
692 ev.timestamp = timestamp;
693 ev.event_flags = e->default_event_flags;
694 ev.dev = _evas_device_top_get(e);
695 if (ev.dev) _evas_device_ref(ev.dev);
696 copy = evas_event_list_copy(e->pointer.object.in);
697 EINA_LIST_FOREACH(copy, l, obj)
699 ev.cur.canvas.x = e->pointer.x;
700 ev.cur.canvas.y = e->pointer.y;
701 _evas_event_framespace_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
702 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x,
705 if ((e->events_frozen <= 0) &&
706 (evas_object_clippers_is_visible(obj) ||
707 obj->mouse_grabbed) &&
708 (!evas_event_passes_through(obj)) &&
709 (!evas_event_freezes_through(obj)) &&
710 (!obj->clip.clipees))
712 if ((px != x) || (py != y))
713 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
716 outs = eina_list_append(outs, obj);
717 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
718 (e->pointer.nogrep > 0))
720 eina_list_free(copy);
724 if (e->delete_me) break;
726 _evas_post_event_callback_call(e);
727 if (ev.dev) _evas_device_unref(ev.dev);
730 Evas_Event_Mouse_Out ev;
733 _evas_object_event_new();
735 event_id = _evas_event_counter;
736 ev.buttons = e->pointer.button;
737 ev.output.x = e->pointer.x;
738 ev.output.y = e->pointer.y;
739 ev.canvas.x = e->pointer.x;
740 ev.canvas.y = e->pointer.y;
741 ev.data = (void *)data;
742 ev.modifiers = &(e->modifiers);
743 ev.locks = &(e->locks);
744 ev.timestamp = timestamp;
745 ev.event_flags = e->default_event_flags;
746 ev.dev = _evas_device_top_get(e);
747 if (ev.dev) _evas_device_ref(ev.dev);
749 if (copy) eina_list_free(copy);
755 outs = eina_list_remove(outs, obj);
756 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
758 ev.canvas.x = e->pointer.x;
759 ev.canvas.y = e->pointer.y;
760 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
761 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
762 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
768 if (e->events_frozen <= 0)
769 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
774 _evas_post_event_callback_call(e);
775 if (ev.dev) _evas_device_unref(ev.dev);
782 Evas_Event_Mouse_Move ev;
783 Evas_Event_Mouse_Out ev2;
784 Evas_Event_Mouse_In ev3;
786 int event_id = 0, event_id2 = 0;
788 _evas_object_event_new();
790 event_id = _evas_event_counter;
791 ev.buttons = e->pointer.button;
792 ev.cur.output.x = e->pointer.x;
793 ev.cur.output.y = e->pointer.y;
794 ev.cur.canvas.x = e->pointer.x;
795 ev.cur.canvas.y = e->pointer.y;
796 ev.prev.output.x = px;
797 ev.prev.output.y = py;
798 ev.prev.canvas.x = px;
799 ev.prev.canvas.y = py;
800 ev.data = (void *)data;
801 ev.modifiers = &(e->modifiers);
802 ev.locks = &(e->locks);
803 ev.timestamp = timestamp;
804 ev.event_flags = e->default_event_flags;
805 ev.dev = _evas_device_top_get(e);
806 if (ev.dev) _evas_device_ref(ev.dev);
808 ev2.buttons = e->pointer.button;
809 ev2.output.x = e->pointer.x;
810 ev2.output.y = e->pointer.y;
811 ev2.canvas.x = e->pointer.x;
812 ev2.canvas.y = e->pointer.y;
813 ev2.data = (void *)data;
814 ev2.modifiers = &(e->modifiers);
815 ev2.locks = &(e->locks);
816 ev2.timestamp = timestamp;
817 ev2.event_flags = e->default_event_flags;
820 ev3.buttons = e->pointer.button;
821 ev3.output.x = e->pointer.x;
822 ev3.output.y = e->pointer.y;
823 ev3.canvas.x = e->pointer.x;
824 ev3.canvas.y = e->pointer.y;
825 ev3.data = (void *)data;
826 ev3.modifiers = &(e->modifiers);
827 ev3.locks = &(e->locks);
828 ev3.timestamp = timestamp;
829 ev3.event_flags = e->default_event_flags;
832 /* get all new in objects */
833 ins = evas_event_objects_event_list(e, NULL, x, y);
834 /* go thru old list of in objects */
835 copy = evas_event_list_copy(e->pointer.object.in);
836 EINA_LIST_FOREACH(copy, l, obj)
838 /* if its under the pointer and its visible and its in the new */
840 // FIXME: i don't think we need this
841 // evas_object_clip_recalc(obj);
842 if ((e->events_frozen <= 0) &&
843 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
844 (evas_object_clippers_is_visible(obj) ||
845 obj->mouse_grabbed) &&
846 eina_list_data_find(ins, obj) &&
847 (!evas_event_passes_through(obj)) &&
848 (!evas_event_freezes_through(obj)) &&
849 (!obj->clip.clipees) &&
850 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
853 if ((px != x) || (py != y))
855 ev.cur.canvas.x = e->pointer.x;
856 ev.cur.canvas.y = e->pointer.y;
857 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
858 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
861 /* otherwise it has left the object */
867 ev2.canvas.x = e->pointer.x;
868 ev2.canvas.y = e->pointer.y;
869 _evas_event_framespace_adjust(obj, &ev2.canvas.x, &ev2.canvas.y);
870 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
871 if (e->events_frozen <= 0)
872 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
875 if (e->delete_me) break;
877 _evas_post_event_callback_call(e);
879 _evas_object_event_new();
881 event_id2 = _evas_event_counter;
882 if (copy) copy = eina_list_free(copy);
883 /* go thru our current list of ins */
884 EINA_LIST_FOREACH(ins, l, obj)
886 ev3.canvas.x = e->pointer.x;
887 ev3.canvas.y = e->pointer.y;
888 _evas_event_framespace_adjust(obj, &ev3.canvas.x, &ev3.canvas.y);
889 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
890 /* if its not in the old list of ins send an enter event */
891 if (!eina_list_data_find(e->pointer.object.in, obj))
896 if (e->events_frozen <= 0)
897 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
900 if (e->delete_me) break;
902 if (e->pointer.mouse_grabbed == 0)
904 /* free our old list of ins */
905 eina_list_free(e->pointer.object.in);
906 /* and set up the new one */
907 e->pointer.object.in = ins;
911 /* free our cur ins */
914 _evas_post_event_callback_call(e);
915 if (ev.dev) _evas_device_unref(ev.dev);
921 Eina_List *ins = NULL;
922 Eina_List *newin = NULL;
923 Eina_List *l, *copy, *lst = NULL;
924 Evas_Event_Mouse_Move ev;
925 Evas_Event_Mouse_Out ev2;
926 Evas_Event_Mouse_In ev3;
927 Evas_Object *obj, *below_obj;
928 int event_id = 0, event_id2 = 0;
929 int norep = 0, breaknext = 0;
931 _evas_object_event_new();
933 event_id = _evas_event_counter;
934 ev.buttons = e->pointer.button;
935 ev.cur.output.x = e->pointer.x;
936 ev.cur.output.y = e->pointer.y;
937 ev.cur.canvas.x = e->pointer.x;
938 ev.cur.canvas.y = e->pointer.y;
939 ev.prev.output.x = px;
940 ev.prev.output.y = py;
941 ev.prev.canvas.x = px;
942 ev.prev.canvas.y = py;
943 ev.data = (void *)data;
944 ev.modifiers = &(e->modifiers);
945 ev.locks = &(e->locks);
946 ev.timestamp = timestamp;
947 ev.event_flags = e->default_event_flags;
948 ev.dev = _evas_device_top_get(e);
949 if (ev.dev) _evas_device_ref(ev.dev);
951 ev2.buttons = e->pointer.button;
952 ev2.output.x = e->pointer.x;
953 ev2.output.y = e->pointer.y;
954 ev2.canvas.x = e->pointer.x;
955 ev2.canvas.y = e->pointer.y;
956 ev2.data = (void *)data;
957 ev2.modifiers = &(e->modifiers);
958 ev2.locks = &(e->locks);
959 ev2.timestamp = timestamp;
960 ev2.event_flags = e->default_event_flags;
963 ev3.buttons = e->pointer.button;
964 ev3.output.x = e->pointer.x;
965 ev3.output.y = e->pointer.y;
966 ev3.canvas.x = e->pointer.x;
967 ev3.canvas.y = e->pointer.y;
968 ev3.data = (void *)data;
969 ev3.modifiers = &(e->modifiers);
970 ev3.locks = &(e->locks);
971 ev3.timestamp = timestamp;
972 ev3.event_flags = e->default_event_flags;
975 /* go thru old list of in objects */
976 copy = evas_event_list_copy(e->pointer.object.in);
977 EINA_LIST_FOREACH(copy, l, obj)
984 if (obj == nogrep_obj) breaknext = 1;
987 /* get all new in objects */
988 below_obj = evas_object_below_get(nogrep_obj);
990 ins = _evas_event_object_list_raw_in_get(e, NULL,
991 EINA_INLIST_GET(below_obj), NULL,
992 e->pointer.x, e->pointer.y,
994 EINA_LIST_FOREACH(copy, l, obj)
996 newin = eina_list_append(newin, obj);
997 if (obj == nogrep_obj) break;
999 EINA_LIST_FOREACH(ins, l, obj)
1001 newin = eina_list_append(newin, obj);
1004 EINA_LIST_FOREACH(lst, l, obj)
1006 /* if its under the pointer and its visible and its in the new */
1008 // FIXME: i don't think we need this
1009 // evas_object_clip_recalc(obj);
1010 if ((e->events_frozen <= 0) &&
1011 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1012 (evas_object_clippers_is_visible(obj) ||
1013 obj->mouse_grabbed) &&
1014 eina_list_data_find(newin, obj) &&
1015 (!evas_event_passes_through(obj)) &&
1016 (!evas_event_freezes_through(obj)) &&
1017 (!obj->clip.clipees) &&
1018 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
1021 if ((px != x) || (py != y))
1023 ev.cur.canvas.x = e->pointer.x;
1024 ev.cur.canvas.y = e->pointer.y;
1025 _evas_event_framespace_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
1026 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1027 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
1030 /* otherwise it has left the object */
1036 ev2.canvas.x = e->pointer.x;
1037 ev2.canvas.y = e->pointer.y;
1038 _evas_event_framespace_adjust(obj, &ev2.canvas.x, &ev2.canvas.y);
1039 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
1040 if (e->events_frozen <= 0)
1041 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
1044 if (e->delete_me) break;
1046 _evas_post_event_callback_call(e);
1048 _evas_object_event_new();
1050 event_id2 = _evas_event_counter;
1051 if (copy) copy = eina_list_free(copy);
1052 /* go thru our current list of ins */
1053 EINA_LIST_FOREACH(newin, l, obj)
1055 ev3.canvas.x = e->pointer.x;
1056 ev3.canvas.y = e->pointer.y;
1057 _evas_event_framespace_adjust(obj, &ev3.canvas.x, &ev3.canvas.y);
1058 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
1059 /* if its not in the old list of ins send an enter event */
1060 if (!eina_list_data_find(e->pointer.object.in, obj))
1065 if (e->events_frozen <= 0)
1066 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
1069 if (e->delete_me) break;
1071 /* free our old list of ins */
1072 eina_list_free(e->pointer.object.in);
1073 /* and set up the new one */
1074 e->pointer.object.in = newin;
1076 _evas_post_event_callback_call(e);
1077 if (ev.dev) _evas_device_unref(ev.dev);
1083 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
1087 Evas_Event_Mouse_In ev;
1091 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1094 e->pointer.inside = 1;
1096 if (e->events_frozen > 0) return;
1097 e->last_timestamp = timestamp;
1099 if (e->pointer.mouse_grabbed != 0) return;
1101 _evas_object_event_new();
1103 event_id = _evas_event_counter;
1104 ev.buttons = e->pointer.button;
1105 ev.output.x = e->pointer.x;
1106 ev.output.y = e->pointer.y;
1107 ev.canvas.x = e->pointer.x;
1108 ev.canvas.y = e->pointer.y;
1109 ev.data = (void *)data;
1110 ev.modifiers = &(e->modifiers);
1111 ev.locks = &(e->locks);
1112 ev.timestamp = timestamp;
1113 ev.event_flags = e->default_event_flags;
1114 ev.dev = _evas_device_top_get(e);
1115 if (ev.dev) _evas_device_ref(ev.dev);
1118 /* get new list of ins */
1119 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
1120 EINA_LIST_FOREACH(ins, l, obj)
1122 ev.canvas.x = e->pointer.x;
1123 ev.canvas.y = e->pointer.y;
1124 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
1125 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1126 if (!eina_list_data_find(e->pointer.object.in, obj))
1131 if (e->events_frozen <= 0)
1132 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id);
1135 if (e->delete_me) break;
1137 /* free our old list of ins */
1138 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1139 /* and set up the new one */
1140 e->pointer.object.in = ins;
1141 _evas_post_event_callback_call(e);
1142 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
1143 if (ev.dev) _evas_device_unref(ev.dev);
1148 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
1150 Evas_Event_Mouse_Out ev;
1153 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1156 e->pointer.inside = 0;
1158 if (e->events_frozen > 0) return;
1159 e->last_timestamp = timestamp;
1161 _evas_object_event_new();
1163 event_id = _evas_event_counter;
1164 ev.buttons = e->pointer.button;
1165 ev.output.x = e->pointer.x;
1166 ev.output.y = e->pointer.y;
1167 ev.canvas.x = e->pointer.x;
1168 ev.canvas.y = e->pointer.y;
1169 ev.data = (void *)data;
1170 ev.modifiers = &(e->modifiers);
1171 ev.locks = &(e->locks);
1172 ev.timestamp = timestamp;
1173 ev.event_flags = e->default_event_flags;
1174 ev.dev = _evas_device_top_get(e);
1175 if (ev.dev) _evas_device_ref(ev.dev);
1178 /* if our mouse button is inside any objects */
1180 /* go thru old list of in objects */
1181 Eina_List *l, *copy;
1184 copy = evas_event_list_copy(e->pointer.object.in);
1185 EINA_LIST_FOREACH(copy, l, obj)
1187 ev.canvas.x = e->pointer.x;
1188 ev.canvas.y = e->pointer.y;
1189 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
1190 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1194 if (!obj->delete_me)
1196 if (e->events_frozen <= 0)
1197 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
1199 obj->mouse_grabbed = 0;
1201 if (e->delete_me) break;
1203 if (copy) copy = eina_list_free(copy);
1204 /* free our old list of ins */
1205 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1206 e->pointer.mouse_grabbed = 0;
1207 _evas_post_event_callback_call(e);
1209 if (ev.dev) _evas_device_unref(ev.dev);
1214 evas_event_feed_multi_down(Evas *e,
1215 int d, int x, int y,
1216 double rad, double radx, double rady,
1217 double pres, double ang,
1218 double fx, double fy,
1219 Evas_Button_Flags flags, unsigned int timestamp,
1222 Eina_List *l, *copy;
1223 Evas_Event_Multi_Down ev;
1228 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1233 if (e->events_frozen > 0) return;
1234 e->last_timestamp = timestamp;
1236 _evas_object_event_new();
1238 event_id = _evas_event_counter;
1249 ev.canvas.xsub = fx;
1250 ev.canvas.ysub = fy;
1251 ev.data = (void *)data;
1252 ev.modifiers = &(e->modifiers);
1253 ev.locks = &(e->locks);
1255 ev.timestamp = timestamp;
1256 ev.event_flags = e->default_event_flags;
1257 ev.dev = _evas_device_top_get(e);
1258 if (ev.dev) _evas_device_ref(ev.dev);
1261 /* append new touch point to the touch point list */
1262 _evas_touch_point_append(e, d, x, y);
1263 if (e->pointer.mouse_grabbed == 0)
1265 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
1267 copy = evas_event_list_copy(e->pointer.object.in);
1268 EINA_LIST_FOREACH(copy, l, obj)
1270 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
1272 obj->mouse_grabbed += addgrab + 1;
1273 e->pointer.mouse_grabbed += addgrab + 1;
1276 EINA_LIST_FOREACH(copy, l, obj)
1280 ev.canvas.xsub = fx;
1281 ev.canvas.ysub = fy;
1282 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
1283 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1284 if (x != ev.canvas.x)
1285 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1286 if (y != ev.canvas.y)
1287 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1288 if (e->events_frozen <= 0)
1289 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id);
1290 if (e->delete_me) break;
1292 if (copy) eina_list_free(copy);
1293 _evas_post_event_callback_call(e);
1294 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
1295 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
1296 if (ev.dev) _evas_device_unref(ev.dev);
1301 evas_event_feed_multi_up(Evas *e,
1302 int d, int x, int y,
1303 double rad, double radx, double rady,
1304 double pres, double ang,
1305 double fx, double fy,
1306 Evas_Button_Flags flags, unsigned int timestamp,
1309 Eina_List *l, *copy;
1310 Evas_Event_Multi_Up ev;
1314 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1318 if (e->pointer.downs <= 0) return;
1320 if (e->events_frozen > 0) return;
1321 e->last_timestamp = timestamp;
1323 _evas_object_event_new();
1325 event_id = _evas_event_counter;
1336 ev.canvas.xsub = fx;
1337 ev.canvas.ysub = fy;
1338 ev.data = (void *)data;
1339 ev.modifiers = &(e->modifiers);
1340 ev.locks = &(e->locks);
1342 ev.timestamp = timestamp;
1343 ev.event_flags = e->default_event_flags;
1344 ev.dev = _evas_device_top_get(e);
1345 if (ev.dev) _evas_device_ref(ev.dev);
1348 /* update released touch point */
1349 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
1350 copy = evas_event_list_copy(e->pointer.object.in);
1351 EINA_LIST_FOREACH(copy, l, obj)
1355 ev.canvas.xsub = fx;
1356 ev.canvas.ysub = fy;
1357 _evas_event_framespace_adjust(obj, &ev.canvas.x, &ev.canvas.y);
1358 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1359 if (x != ev.canvas.x)
1360 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1361 if (y != ev.canvas.y)
1362 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1363 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1364 (obj->mouse_grabbed > 0))
1366 obj->mouse_grabbed--;
1367 e->pointer.mouse_grabbed--;
1369 if (e->events_frozen <= 0)
1370 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id);
1371 if (e->delete_me) break;
1373 if (copy) copy = eina_list_free(copy);
1374 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1375 _evas_post_event_callback_call(e);
1376 /* remove released touch point from the touch point list */
1377 _evas_touch_point_remove(e, d);
1378 if (ev.dev) _evas_device_unref(ev.dev);
1383 evas_event_feed_multi_move(Evas *e,
1384 int d, int x, int y,
1385 double rad, double radx, double rady,
1386 double pres, double ang,
1387 double fx, double fy,
1388 unsigned int timestamp, const void *data)
1390 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1394 if (e->events_frozen > 0) return;
1395 e->last_timestamp = timestamp;
1397 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
1400 /* update moved touch point */
1401 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
1402 /* if our mouse button is grabbed to any objects */
1403 if (e->pointer.mouse_grabbed > 0)
1405 /* go thru old list of in objects */
1406 Eina_List *l, *copy;
1407 Evas_Event_Multi_Move ev;
1411 _evas_object_event_new();
1413 event_id = _evas_event_counter;
1415 ev.cur.output.x = x;
1416 ev.cur.output.y = y;
1417 ev.cur.canvas.x = x;
1418 ev.cur.canvas.y = y;
1424 ev.cur.canvas.xsub = fx;
1425 ev.cur.canvas.ysub = fy;
1426 ev.data = (void *)data;
1427 ev.modifiers = &(e->modifiers);
1428 ev.locks = &(e->locks);
1429 ev.timestamp = timestamp;
1430 ev.event_flags = e->default_event_flags;
1431 ev.dev = _evas_device_top_get(e);
1432 if (ev.dev) _evas_device_ref(ev.dev);
1434 copy = evas_event_list_copy(e->pointer.object.in);
1435 EINA_LIST_FOREACH(copy, l, obj)
1437 if ((e->events_frozen <= 0) &&
1438 (evas_object_clippers_is_visible(obj) || obj->mouse_grabbed) &&
1439 (!evas_event_passes_through(obj)) &&
1440 (!evas_event_freezes_through(obj)) &&
1441 (!obj->clip.clipees))
1443 ev.cur.canvas.x = x;
1444 ev.cur.canvas.y = y;
1445 ev.cur.canvas.xsub = fx;
1446 ev.cur.canvas.ysub = fy;
1447 _evas_event_framespace_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
1448 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1449 if (x != ev.cur.canvas.x)
1450 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1451 if (y != ev.cur.canvas.y)
1452 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1453 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1455 if (e->delete_me) break;
1457 _evas_post_event_callback_call(e);
1458 if (ev.dev) _evas_device_unref(ev.dev);
1463 Eina_List *l, *copy;
1464 Evas_Event_Multi_Move ev;
1468 _evas_object_event_new();
1470 event_id = _evas_event_counter;
1472 ev.cur.output.x = x;
1473 ev.cur.output.y = y;
1474 ev.cur.canvas.x = x;
1475 ev.cur.canvas.y = y;
1481 ev.cur.canvas.xsub = fx;
1482 ev.cur.canvas.ysub = fy;
1483 ev.data = (void *)data;
1484 ev.modifiers = &(e->modifiers);
1485 ev.locks = &(e->locks);
1486 ev.timestamp = timestamp;
1487 ev.event_flags = e->default_event_flags;
1488 ev.dev = _evas_device_top_get(e);
1489 if (ev.dev) _evas_device_ref(ev.dev);
1491 /* get all new in objects */
1492 ins = evas_event_objects_event_list(e, NULL, x, y);
1493 /* go thru old list of in objects */
1494 copy = evas_event_list_copy(e->pointer.object.in);
1495 EINA_LIST_FOREACH(copy, l, obj)
1497 /* if its under the pointer and its visible and its in the new */
1499 // FIXME: i don't think we need this
1500 // evas_object_clip_recalc(obj);
1501 if ((e->events_frozen <= 0) &&
1502 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1503 (evas_object_clippers_is_visible(obj) ||
1504 obj->mouse_grabbed) &&
1505 eina_list_data_find(ins, obj) &&
1506 (!evas_event_passes_through(obj)) &&
1507 (!evas_event_freezes_through(obj)) &&
1508 (!obj->clip.clipees) &&
1509 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
1512 ev.cur.canvas.x = x;
1513 ev.cur.canvas.y = y;
1514 ev.cur.canvas.xsub = fx;
1515 ev.cur.canvas.ysub = fy;
1516 _evas_event_framespace_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y);
1517 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1518 if (x != ev.cur.canvas.x)
1519 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1520 if (y != ev.cur.canvas.y)
1521 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1522 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1524 if (e->delete_me) break;
1526 if (copy) copy = eina_list_free(copy);
1527 if (e->pointer.mouse_grabbed == 0)
1529 /* free our old list of ins */
1530 eina_list_free(e->pointer.object.in);
1531 /* and set up the new one */
1532 e->pointer.object.in = ins;
1536 /* free our cur ins */
1537 eina_list_free(ins);
1539 _evas_post_event_callback_call(e);
1540 if (ev.dev) _evas_device_unref(ev.dev);
1546 evas_event_feed_key_down(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
1549 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1553 if (!keyname) return;
1554 if (e->events_frozen > 0) return;
1555 e->last_timestamp = timestamp;
1558 Evas_Event_Key_Down ev;
1559 Eina_Bool exclusive;
1561 _evas_object_event_new();
1563 event_id = _evas_event_counter;
1564 exclusive = EINA_FALSE;
1565 ev.keyname = (char *)keyname;
1566 ev.data = (void *)data;
1567 ev.modifiers = &(e->modifiers);
1568 ev.locks = &(e->locks);
1571 ev.compose = compose;
1572 ev.timestamp = timestamp;
1573 ev.event_flags = e->default_event_flags;
1574 ev.dev = _evas_device_top_get(e);
1575 if (ev.dev) _evas_device_ref(ev.dev);
1583 EINA_LIST_FOREACH(e->grabs, l, g)
1587 g->just_added = EINA_FALSE;
1590 if (g->delete_me) continue;
1591 if (((e->modifiers.mask & g->modifiers) ||
1592 (g->modifiers == e->modifiers.mask)) &&
1593 (!strcmp(keyname, g->keyname)))
1595 if (!(e->modifiers.mask & g->not_modifiers))
1597 if (e->events_frozen <= 0 &&
1598 !evas_event_freezes_through(g->object))
1599 evas_object_event_callback_call(g->object,
1600 EVAS_CALLBACK_KEY_DOWN,
1602 if (g->exclusive) exclusive = EINA_TRUE;
1605 if (e->delete_me) break;
1608 if (e->walking_grabs <= 0)
1610 while (e->delete_grabs > 0)
1613 for (l = e->grabs; l;)
1615 g = eina_list_data_get(l);
1616 l = eina_list_next(l);
1618 evas_key_grab_free(g->object, g->keyname, g->modifiers,
1624 if ((e->focused) && (!exclusive))
1626 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1627 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN,
1630 _evas_post_event_callback_call(e);
1631 if (ev.dev) _evas_device_unref(ev.dev);
1636 evas_event_feed_key_up(Evas *e, const char *keyname, const char *key, const char *string, const char *compose, unsigned int timestamp, const void *data)
1639 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1642 if (!keyname) return;
1643 if (e->events_frozen > 0) return;
1644 e->last_timestamp = timestamp;
1647 Evas_Event_Key_Up ev;
1648 Eina_Bool exclusive;
1650 _evas_object_event_new();
1652 event_id = _evas_event_counter;
1653 exclusive = EINA_FALSE;
1654 ev.keyname = (char *)keyname;
1655 ev.data = (void *)data;
1656 ev.modifiers = &(e->modifiers);
1657 ev.locks = &(e->locks);
1660 ev.compose = compose;
1661 ev.timestamp = timestamp;
1662 ev.event_flags = e->default_event_flags;
1663 ev.dev = _evas_device_top_get(e);
1664 if (ev.dev) _evas_device_ref(ev.dev);
1672 EINA_LIST_FOREACH(e->grabs, l, g)
1676 g->just_added = EINA_FALSE;
1679 if (g->delete_me) continue;
1680 if (((e->modifiers.mask & g->modifiers) ||
1681 (g->modifiers == e->modifiers.mask)) &&
1682 (!((e->modifiers.mask & g->not_modifiers) ||
1683 (g->not_modifiers == ~e->modifiers.mask))) &&
1684 (!strcmp(keyname, g->keyname)))
1686 if (e->events_frozen <= 0 &&
1687 !evas_event_freezes_through(g->object))
1688 evas_object_event_callback_call(g->object,
1689 EVAS_CALLBACK_KEY_UP, &ev, event_id);
1690 if (g->exclusive) exclusive = EINA_TRUE;
1692 if (e->delete_me) break;
1695 if (e->walking_grabs <= 0)
1697 while (e->delete_grabs > 0)
1699 Eina_List *ll, *l_next;
1703 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1706 evas_key_grab_free(gr->object, gr->keyname,
1707 gr->modifiers, gr->not_modifiers);
1712 if ((e->focused) && (!exclusive))
1714 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1715 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP,
1718 _evas_post_event_callback_call(e);
1719 if (ev.dev) _evas_device_unref(ev.dev);
1724 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1726 Eina_List *l, *copy;
1731 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1735 if (e->events_frozen > 0) return;
1736 e->last_timestamp = timestamp;
1738 _evas_object_event_new();
1740 event_id = _evas_event_counter;
1742 ev.data = (void *)data;
1743 ev.timestamp = timestamp;
1744 ev.event_flags = e->default_event_flags;
1745 ev.dev = _evas_device_top_get(e);
1746 if (ev.dev) _evas_device_ref(ev.dev);
1749 copy = evas_event_list_copy(e->pointer.object.in);
1750 EINA_LIST_FOREACH(copy, l, obj)
1752 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
1753 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev, event_id);
1754 if (e->delete_me) break;
1756 if (copy) copy = eina_list_free(copy);
1757 _evas_post_event_callback_call(e);
1758 if (ev.dev) _evas_device_unref(ev.dev);
1760 _evas_object_event_new();
1764 evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze)
1766 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1771 if (obj->freeze_events == freeze) return;
1772 obj->freeze_events = freeze;
1773 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE);
1777 evas_object_freeze_events_get(const Evas_Object *obj)
1779 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1782 return obj->freeze_events;
1786 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1788 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1792 if (obj->pass_events == pass) return;
1793 obj->pass_events = pass;
1794 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE);
1795 if (evas_object_is_in_output_rect(obj,
1796 obj->layer->evas->pointer.x,
1797 obj->layer->evas->pointer.y, 1, 1) &&
1798 ((!obj->precise_is_inside) ||
1799 (evas_object_is_inside(obj,
1800 obj->layer->evas->pointer.x,
1801 obj->layer->evas->pointer.y))))
1802 evas_event_feed_mouse_move(obj->layer->evas,
1803 obj->layer->evas->pointer.x,
1804 obj->layer->evas->pointer.y,
1805 obj->layer->evas->last_timestamp,
1810 evas_object_pass_events_get(const Evas_Object *obj)
1812 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1815 return obj->pass_events;
1819 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1821 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1825 if (obj->repeat_events == repeat) return;
1826 obj->repeat_events = repeat;
1827 if (evas_object_is_in_output_rect(obj,
1828 obj->layer->evas->pointer.x,
1829 obj->layer->evas->pointer.y, 1, 1) &&
1830 ((!obj->precise_is_inside) ||
1831 (evas_object_is_inside(obj,
1832 obj->layer->evas->pointer.x,
1833 obj->layer->evas->pointer.y))))
1834 evas_event_feed_mouse_move(obj->layer->evas,
1835 obj->layer->evas->pointer.x,
1836 obj->layer->evas->pointer.y,
1837 obj->layer->evas->last_timestamp,
1842 evas_object_repeat_events_get(const Evas_Object *obj)
1844 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1847 return obj->repeat_events;
1851 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1853 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1856 obj->no_propagate = !prop;
1860 evas_object_propagate_events_get(const Evas_Object *obj)
1862 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1865 return !(obj->no_propagate);
1869 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1871 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1874 obj->pointer_mode = setting;
1877 EAPI Evas_Object_Pointer_Mode
1878 evas_object_pointer_mode_get(const Evas_Object *obj)
1880 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1881 return EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
1883 return obj->pointer_mode;
1887 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1889 if (!event_copy) return;
1893 case EVAS_CALLBACK_MOUSE_IN:
1895 Evas_Event_Mouse_In *ev = event_copy;
1896 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1899 case EVAS_CALLBACK_MOUSE_OUT:
1901 Evas_Event_Mouse_Out *ev = event_copy;
1902 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1905 case EVAS_CALLBACK_MOUSE_DOWN:
1907 Evas_Event_Mouse_Down *ev = event_copy;
1908 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1911 case EVAS_CALLBACK_MOUSE_UP:
1913 Evas_Event_Mouse_Up *ev = event_copy;
1914 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1917 case EVAS_CALLBACK_MOUSE_MOVE:
1919 Evas_Event_Mouse_Move *ev = event_copy;
1920 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1923 case EVAS_CALLBACK_MOUSE_WHEEL:
1925 Evas_Event_Mouse_Wheel *ev = event_copy;
1926 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1929 case EVAS_CALLBACK_MULTI_DOWN:
1931 Evas_Event_Multi_Down *ev = event_copy;
1932 evas_event_feed_multi_down(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);
1935 case EVAS_CALLBACK_MULTI_UP:
1937 Evas_Event_Multi_Up *ev = event_copy;
1938 evas_event_feed_multi_up(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);
1941 case EVAS_CALLBACK_MULTI_MOVE:
1943 Evas_Event_Multi_Move *ev = event_copy;
1944 evas_event_feed_multi_move(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);
1947 case EVAS_CALLBACK_KEY_DOWN:
1949 Evas_Event_Key_Down *ev = event_copy;
1950 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1953 case EVAS_CALLBACK_KEY_UP:
1955 Evas_Event_Key_Up *ev = event_copy;
1956 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1959 default: /* All non-input events are not handeled */
1965 evas_event_down_count_get(const Evas *e)
1967 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1970 return e->pointer.downs;