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_object_list_raw_in_get(Evas *e, Eina_List *in,
25 const Eina_Inlist *list, Evas_Object *stop,
26 int x, int y, int *no_rep)
32 for (obj = _EINA_INLIST_CONTAINER(obj, list);
34 obj = _EINA_INLIST_CONTAINER(obj, EINA_INLIST_GET(obj)->prev))
41 if (evas_event_passes_through(obj)) continue;
42 if ((obj->cur.visible) && (obj->delete_me == 0) &&
43 (!obj->clip.clipees) &&
44 (evas_object_clippers_is_visible(obj)))
50 if ((obj->cur.usemap) && (obj->cur.map) &&
51 (obj->cur.map->count == 4))
53 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
56 if (!evas_map_coords_get(obj->cur.map, x, y,
58 &(obj->cur.map->my), 0))
64 in = _evas_event_object_list_in_get
66 evas_object_smart_members_get_direct(obj),
68 obj->cur.geometry.x + obj->cur.map->mx,
69 obj->cur.geometry.y + obj->cur.map->my,
76 if (!obj->child_has_map)
77 evas_object_smart_bouding_box_update(obj);
78 if (obj->child_has_map ||
79 (obj->cur.bounding_box.x <= x &&
80 obj->cur.bounding_box.x + obj->cur.bounding_box.w >= x &&
81 obj->cur.bounding_box.y <= y &&
82 obj->cur.bounding_box.y + obj->cur.bounding_box.h >= y) ||
83 (obj->cur.geometry.x <= x &&
84 obj->cur.geometry.y + obj->cur.geometry.w >= x &&
85 obj->cur.geometry.y <= y &&
86 obj->cur.geometry.y + obj->cur.geometry.h >= y))
87 in = _evas_event_object_list_in_get
88 (e, in, evas_object_smart_members_get_direct(obj),
93 if (!obj->repeat_events)
102 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
106 if ((obj->cur.usemap) && (obj->cur.map) &&
107 (obj->cur.map->count == 4))
109 if (!evas_map_coords_get(obj->cur.map, x, y,
111 &(obj->cur.map->my), 0))
117 if (inside && ((!obj->precise_is_inside) ||
118 (evas_object_is_inside(obj, x, y))))
120 if (!evas_event_freezes_through(obj))
121 in = eina_list_append(in, obj);
122 if (!obj->repeat_events)
136 _evas_event_object_list_in_get(Evas *e, Eina_List *in,
137 const Eina_Inlist *list, Evas_Object *stop,
138 int x, int y, int *no_rep)
140 if (!list) return NULL;
141 return _evas_event_object_list_raw_in_get(e, in, list->last, stop, x, y,
146 evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
149 Eina_List *in = NULL;
151 if ((!e->layers) || (e->events_frozen > 0)) return NULL;
152 EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
155 in = _evas_event_object_list_in_get(e, in,
156 EINA_INLIST_GET(lay->objects),
157 stop, x, y, &no_rep);
158 if (no_rep) return in;
164 evas_event_list_copy(Eina_List *list)
166 Eina_List *l, *new_l = NULL;
169 EINA_LIST_FOREACH(list, l, data)
170 new_l = eina_list_append(new_l, data);
173 /* public functions */
176 evas_event_default_flags_set(Evas *e, Evas_Event_Flags flags)
178 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
181 e->default_event_flags = flags;
184 EAPI Evas_Event_Flags
185 evas_event_default_flags_get(const Evas *e)
187 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
188 return EVAS_EVENT_FLAG_ON_HOLD;
190 return e->default_event_flags;
194 evas_event_freeze(Evas *e)
196 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
203 evas_event_thaw(Evas *e)
205 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
209 if (e->events_frozen == 0)
213 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
217 EINA_INLIST_FOREACH(lay->objects, obj)
219 evas_object_clip_recalc(obj);
220 evas_object_recalc_clippees(obj);
224 if (e->events_frozen < 0)
225 evas_debug_generic(" Thaw of events when already thawed!!!\n");
229 evas_event_freeze_get(const Evas *e)
231 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
234 return e->events_frozen;
238 evas_event_thaw_eval(Evas *e)
240 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
243 if (e->events_frozen != 0) return;
245 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y,
246 e->last_timestamp, NULL);
250 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
253 Evas_Event_Mouse_Down ev;
258 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
262 if ((b < 1) || (b > 32)) return;
264 e->pointer.button |= (1 << (b - 1));
267 if (e->events_frozen > 0) return;
268 e->last_timestamp = timestamp;
270 _evas_object_event_new();
272 event_id = _evas_event_counter;
274 ev.output.x = e->pointer.x;
275 ev.output.y = e->pointer.y;
276 ev.canvas.x = e->pointer.x;
277 ev.canvas.y = e->pointer.y;
278 ev.data = (void *)data;
279 ev.modifiers = &(e->modifiers);
280 ev.locks = &(e->locks);
282 ev.timestamp = timestamp;
283 ev.event_flags = e->default_event_flags;
286 /* append new touch point to the touch point list */
287 _evas_touch_point_append(e, 0, e->pointer.x, e->pointer.y);
288 /* If this is the first finger down, i.e no other fingers pressed,
289 * get a new event list, otherwise, keep the current grabbed list. */
290 if (e->pointer.mouse_grabbed == 0)
292 Eina_List *ins = evas_event_objects_event_list(e,
296 /* free our old list of ins */
297 e->pointer.object.in = eina_list_free(e->pointer.object.in);
298 /* and set up the new one */
299 e->pointer.object.in = ins;
300 /* adjust grabbed count by the nuymber of currently held down
302 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
304 copy = evas_event_list_copy(e->pointer.object.in);
305 EINA_LIST_FOREACH(copy, l, obj)
307 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) ||
308 (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN))
310 obj->mouse_grabbed += addgrab + 1;
311 e->pointer.mouse_grabbed += addgrab + 1;
312 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
319 EINA_LIST_FOREACH(copy, l, obj)
321 if (obj->delete_me) continue;
322 ev.canvas.x = e->pointer.x;
323 ev.canvas.y = e->pointer.y;
324 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
326 if (e->events_frozen <= 0)
327 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev, event_id);
328 if (e->delete_me) break;
329 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
332 if (copy) eina_list_free(copy);
333 e->last_mouse_down_counter++;
334 _evas_post_event_callback_call(e);
335 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
336 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
341 _post_up_handle(Evas *e, unsigned int timestamp, const void *data)
343 Eina_List *l, *copy, *ins, *ll;
344 Evas_Event_Mouse_Out ev;
349 _evas_object_event_new();
351 event_id = _evas_event_counter;
352 ev.buttons = e->pointer.button;
353 ev.output.x = e->pointer.x;
354 ev.output.y = e->pointer.y;
355 ev.canvas.x = e->pointer.x;
356 ev.canvas.y = e->pointer.y;
357 ev.data = (void *)data;
358 ev.modifiers = &(e->modifiers);
359 ev.locks = &(e->locks);
360 ev.timestamp = timestamp;
361 ev.event_flags = e->default_event_flags;
363 /* get new list of ins */
364 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
365 /* go thru old list of in objects */
366 copy = evas_event_list_copy(e->pointer.object.in);
367 EINA_LIST_FOREACH(copy, ll, obj)
369 ev.canvas.x = e->pointer.x;
370 ev.canvas.y = e->pointer.y;
371 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
372 if ((!eina_list_data_find(ins, obj)) ||
373 (!e->pointer.inside))
378 if (e->events_frozen <= 0)
379 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
382 if (e->delete_me) break;
384 _evas_post_event_callback_call(e);
386 if (copy) copy = eina_list_free(copy);
387 if (e->pointer.inside)
389 Evas_Event_Mouse_In ev_in;
390 Evas_Object *obj_itr;
392 _evas_object_event_new();
394 event_id = _evas_event_counter;
395 ev_in.buttons = e->pointer.button;
396 ev_in.output.x = e->pointer.x;
397 ev_in.output.y = e->pointer.y;
398 ev_in.canvas.x = e->pointer.x;
399 ev_in.canvas.y = e->pointer.y;
400 ev_in.data = (void *)data;
401 ev_in.modifiers = &(e->modifiers);
402 ev_in.locks = &(e->locks);
403 ev_in.timestamp = timestamp;
404 ev_in.event_flags = e->default_event_flags;
406 EINA_LIST_FOREACH(ins, l, obj_itr)
408 ev_in.canvas.x = e->pointer.x;
409 ev_in.canvas.y = e->pointer.y;
410 _evas_event_havemap_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y, obj_itr->mouse_grabbed);
411 if (!eina_list_data_find(e->pointer.object.in, obj_itr))
413 if (!obj_itr->mouse_in)
415 obj_itr->mouse_in = 1;
416 if (e->events_frozen <= 0)
417 evas_object_event_callback_call(obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in, event_id);
420 if (e->delete_me) break;
423 _evas_post_event_callback_call(e);
427 ins = eina_list_free(ins);
430 if (e->pointer.mouse_grabbed == 0)
432 /* free our old list of ins */
433 eina_list_free(e->pointer.object.in);
434 /* and set up the new one */
435 e->pointer.object.in = ins;
439 /* free our cur ins */
442 if (e->pointer.inside)
443 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
448 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
452 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
456 if ((b < 1) || (b > 32)) return;
458 e->pointer.button &= ~(1 << (b - 1));
461 if (e->events_frozen > 0) return;
462 e->last_timestamp = timestamp;
465 Evas_Event_Mouse_Up ev;
469 _evas_object_event_new();
471 event_id = _evas_event_counter;
473 ev.output.x = e->pointer.x;
474 ev.output.y = e->pointer.y;
475 ev.canvas.x = e->pointer.x;
476 ev.canvas.y = e->pointer.y;
477 ev.data = (void *)data;
478 ev.modifiers = &(e->modifiers);
479 ev.locks = &(e->locks);
481 ev.timestamp = timestamp;
482 ev.event_flags = e->default_event_flags;
485 /* update released touch point */
486 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
487 copy = evas_event_list_copy(e->pointer.object.in);
488 EINA_LIST_FOREACH(copy, l, obj)
490 ev.canvas.x = e->pointer.x;
491 ev.canvas.y = e->pointer.y;
492 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
493 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) &&
494 (obj->mouse_grabbed > 0))
496 obj->mouse_grabbed--;
497 e->pointer.mouse_grabbed--;
501 if ((e->events_frozen <= 0) &&
502 (!evas_event_freezes_through(obj)))
503 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id);
505 if (e->delete_me) break;
506 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
508 if (e->pointer.nogrep > 0) e->pointer.nogrep--;
512 if (copy) copy = eina_list_free(copy);
513 e->last_mouse_up_counter++;
514 _evas_post_event_callback_call(e);
517 if (e->pointer.mouse_grabbed == 0)
519 _post_up_handle(e, timestamp, data);
522 if (e->pointer.mouse_grabbed < 0)
524 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
525 e->pointer.mouse_grabbed);
527 /* remove released touch point from the touch point list */
528 _evas_touch_point_remove(e, 0);
534 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
538 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
542 if (e->events_frozen > 0) return;
545 for (i = 0; i < 32; i++)
547 if ((e->pointer.button & (1 << i)))
548 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
550 // FIXME: multi cancel too?
555 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
558 Evas_Event_Mouse_Wheel ev;
562 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
566 if (e->events_frozen > 0) return;
567 e->last_timestamp = timestamp;
569 _evas_object_event_new();
571 event_id = _evas_event_counter;
572 ev.direction = direction;
574 ev.output.x = e->pointer.x;
575 ev.output.y = e->pointer.y;
576 ev.canvas.x = e->pointer.x;
577 ev.canvas.y = e->pointer.y;
578 ev.data = (void *) data;
579 ev.modifiers = &(e->modifiers);
580 ev.locks = &(e->locks);
581 ev.timestamp = timestamp;
582 ev.event_flags = e->default_event_flags;
585 copy = evas_event_list_copy(e->pointer.object.in);
587 EINA_LIST_FOREACH(copy, l, obj)
589 ev.canvas.x = e->pointer.x;
590 ev.canvas.y = e->pointer.y;
591 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
592 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
593 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id);
594 if (e->delete_me) break;
596 if (copy) copy = eina_list_free(copy);
597 _evas_post_event_callback_call(e);
603 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
605 Evas_Object *nogrep_obj = NULL;
607 //// Evas_Coord pcx, pcy;
609 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
615 //// pcx = e->pointer.canvas_x;
616 //// pcy = e->pointer.canvas_y;
618 if (e->events_frozen > 0) return;
619 e->last_timestamp = timestamp;
623 //// e->pointer.canvas_x = x;
624 //// e->pointer.canvas_y = y;
625 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
626 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
627 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
629 /* update moved touch point */
630 if ((px != x) || (py != y))
631 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
632 /* if our mouse button is grabbed to any objects */
633 if (e->pointer.mouse_grabbed > 0)
635 /* go thru old list of in objects */
636 Eina_List *outs = NULL;
640 Evas_Event_Mouse_Move ev;
644 _evas_object_event_new();
646 event_id = _evas_event_counter;
647 ev.buttons = e->pointer.button;
648 ev.cur.output.x = e->pointer.x;
649 ev.cur.output.y = e->pointer.y;
650 ev.cur.canvas.x = e->pointer.x;
651 ev.cur.canvas.y = e->pointer.y;
652 ev.prev.output.x = px;
653 ev.prev.output.y = py;
654 ev.prev.canvas.x = px;
655 ev.prev.canvas.y = py;
656 ev.data = (void *)data;
657 ev.modifiers = &(e->modifiers);
658 ev.locks = &(e->locks);
659 ev.timestamp = timestamp;
660 ev.event_flags = e->default_event_flags;
661 copy = evas_event_list_copy(e->pointer.object.in);
662 EINA_LIST_FOREACH(copy, l, obj)
664 ev.cur.canvas.x = e->pointer.x;
665 ev.cur.canvas.y = e->pointer.y;
666 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x,
669 if ((e->events_frozen <= 0) &&
670 (evas_object_clippers_is_visible(obj) ||
671 obj->mouse_grabbed) &&
672 (!evas_event_passes_through(obj)) &&
673 (!evas_event_freezes_through(obj)) &&
674 (!obj->clip.clipees))
676 if ((px != x) || (py != y))
677 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
680 outs = eina_list_append(outs, obj);
681 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
682 (e->pointer.nogrep > 0))
684 eina_list_free(copy);
688 if (e->delete_me) break;
690 _evas_post_event_callback_call(e);
693 Evas_Event_Mouse_Out ev;
696 _evas_object_event_new();
698 event_id = _evas_event_counter;
699 ev.buttons = e->pointer.button;
700 ev.output.x = e->pointer.x;
701 ev.output.y = e->pointer.y;
702 ev.canvas.x = e->pointer.x;
703 ev.canvas.y = e->pointer.y;
704 ev.data = (void *)data;
705 ev.modifiers = &(e->modifiers);
706 ev.locks = &(e->locks);
707 ev.timestamp = timestamp;
708 ev.event_flags = e->default_event_flags;
710 if (copy) eina_list_free(copy);
716 outs = eina_list_remove(outs, obj);
717 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
719 ev.canvas.x = e->pointer.x;
720 ev.canvas.y = e->pointer.y;
721 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
722 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
728 if (e->events_frozen <= 0)
729 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
734 _evas_post_event_callback_call(e);
741 Evas_Event_Mouse_Move ev;
742 Evas_Event_Mouse_Out ev2;
743 Evas_Event_Mouse_In ev3;
745 int event_id = 0, event_id2 = 0;
747 _evas_object_event_new();
749 event_id = _evas_event_counter;
750 ev.buttons = e->pointer.button;
751 ev.cur.output.x = e->pointer.x;
752 ev.cur.output.y = e->pointer.y;
753 ev.cur.canvas.x = e->pointer.x;
754 ev.cur.canvas.y = e->pointer.y;
755 ev.prev.output.x = px;
756 ev.prev.output.y = py;
757 ev.prev.canvas.x = px;
758 ev.prev.canvas.y = py;
759 ev.data = (void *)data;
760 ev.modifiers = &(e->modifiers);
761 ev.locks = &(e->locks);
762 ev.timestamp = timestamp;
763 ev.event_flags = e->default_event_flags;
765 ev2.buttons = e->pointer.button;
766 ev2.output.x = e->pointer.x;
767 ev2.output.y = e->pointer.y;
768 ev2.canvas.x = e->pointer.x;
769 ev2.canvas.y = e->pointer.y;
770 ev2.data = (void *)data;
771 ev2.modifiers = &(e->modifiers);
772 ev2.locks = &(e->locks);
773 ev2.timestamp = timestamp;
774 ev2.event_flags = e->default_event_flags;
776 ev3.buttons = e->pointer.button;
777 ev3.output.x = e->pointer.x;
778 ev3.output.y = e->pointer.y;
779 ev3.canvas.x = e->pointer.x;
780 ev3.canvas.y = e->pointer.y;
781 ev3.data = (void *)data;
782 ev3.modifiers = &(e->modifiers);
783 ev3.locks = &(e->locks);
784 ev3.timestamp = timestamp;
785 ev3.event_flags = e->default_event_flags;
787 /* get all new in objects */
788 ins = evas_event_objects_event_list(e, NULL, x, y);
789 /* go thru old list of in objects */
790 copy = evas_event_list_copy(e->pointer.object.in);
791 EINA_LIST_FOREACH(copy, l, obj)
793 /* if its under the pointer and its visible and its in the new */
795 // FIXME: i don't think we need this
796 // evas_object_clip_recalc(obj);
797 if ((e->events_frozen <= 0) &&
798 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
799 (evas_object_clippers_is_visible(obj) ||
800 obj->mouse_grabbed) &&
801 eina_list_data_find(ins, obj) &&
802 (!evas_event_passes_through(obj)) &&
803 (!evas_event_freezes_through(obj)) &&
804 (!obj->clip.clipees) &&
805 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
808 if ((px != x) || (py != y))
810 ev.cur.canvas.x = e->pointer.x;
811 ev.cur.canvas.y = e->pointer.y;
812 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
813 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
816 /* otherwise it has left the object */
822 ev2.canvas.x = e->pointer.x;
823 ev2.canvas.y = e->pointer.y;
824 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
825 if (e->events_frozen <= 0)
826 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
829 if (e->delete_me) break;
831 _evas_post_event_callback_call(e);
833 _evas_object_event_new();
835 event_id2 = _evas_event_counter;
836 if (copy) copy = eina_list_free(copy);
837 /* go thru our current list of ins */
838 EINA_LIST_FOREACH(ins, l, obj)
840 ev3.canvas.x = e->pointer.x;
841 ev3.canvas.y = e->pointer.y;
842 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
843 /* if its not in the old list of ins send an enter event */
844 if (!eina_list_data_find(e->pointer.object.in, obj))
849 if (e->events_frozen <= 0)
850 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
853 if (e->delete_me) break;
855 if (e->pointer.mouse_grabbed == 0)
857 /* free our old list of ins */
858 eina_list_free(e->pointer.object.in);
859 /* and set up the new one */
860 e->pointer.object.in = ins;
864 /* free our cur ins */
867 _evas_post_event_callback_call(e);
873 Eina_List *ins = NULL;
874 Eina_List *newin = NULL;
875 Eina_List *l, *copy, *lst = NULL;
876 Evas_Event_Mouse_Move ev;
877 Evas_Event_Mouse_Out ev2;
878 Evas_Event_Mouse_In ev3;
879 Evas_Object *obj, *below_obj;
880 int event_id = 0, event_id2 = 0;
881 int norep = 0, breaknext = 0;
883 _evas_object_event_new();
885 event_id = _evas_event_counter;
886 ev.buttons = e->pointer.button;
887 ev.cur.output.x = e->pointer.x;
888 ev.cur.output.y = e->pointer.y;
889 ev.cur.canvas.x = e->pointer.x;
890 ev.cur.canvas.y = e->pointer.y;
891 ev.prev.output.x = px;
892 ev.prev.output.y = py;
893 ev.prev.canvas.x = px;
894 ev.prev.canvas.y = py;
895 ev.data = (void *)data;
896 ev.modifiers = &(e->modifiers);
897 ev.locks = &(e->locks);
898 ev.timestamp = timestamp;
899 ev.event_flags = e->default_event_flags;
901 ev2.buttons = e->pointer.button;
902 ev2.output.x = e->pointer.x;
903 ev2.output.y = e->pointer.y;
904 ev2.canvas.x = e->pointer.x;
905 ev2.canvas.y = e->pointer.y;
906 ev2.data = (void *)data;
907 ev2.modifiers = &(e->modifiers);
908 ev2.locks = &(e->locks);
909 ev2.timestamp = timestamp;
910 ev2.event_flags = e->default_event_flags;
912 ev3.buttons = e->pointer.button;
913 ev3.output.x = e->pointer.x;
914 ev3.output.y = e->pointer.y;
915 ev3.canvas.x = e->pointer.x;
916 ev3.canvas.y = e->pointer.y;
917 ev3.data = (void *)data;
918 ev3.modifiers = &(e->modifiers);
919 ev3.locks = &(e->locks);
920 ev3.timestamp = timestamp;
921 ev3.event_flags = e->default_event_flags;
923 /* go thru old list of in objects */
924 copy = evas_event_list_copy(e->pointer.object.in);
925 EINA_LIST_FOREACH(copy, l, obj)
932 if (obj == nogrep_obj) breaknext = 1;
935 /* get all new in objects */
936 below_obj = evas_object_below_get(nogrep_obj);
938 ins = _evas_event_object_list_raw_in_get(e, NULL,
939 EINA_INLIST_GET(below_obj), NULL,
940 e->pointer.x, e->pointer.y,
942 EINA_LIST_FOREACH(copy, l, obj)
944 newin = eina_list_append(newin, obj);
945 if (obj == nogrep_obj) break;
947 EINA_LIST_FOREACH(ins, l, obj)
949 newin = eina_list_append(newin, obj);
952 EINA_LIST_FOREACH(lst, l, obj)
954 /* if its under the pointer and its visible and its in the new */
956 // FIXME: i don't think we need this
957 // evas_object_clip_recalc(obj);
958 if ((e->events_frozen <= 0) &&
959 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
960 (evas_object_clippers_is_visible(obj) ||
961 obj->mouse_grabbed) &&
962 eina_list_data_find(newin, obj) &&
963 (!evas_event_passes_through(obj)) &&
964 (!evas_event_freezes_through(obj)) &&
965 (!obj->clip.clipees) &&
966 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
969 if ((px != x) || (py != y))
971 ev.cur.canvas.x = e->pointer.x;
972 ev.cur.canvas.y = e->pointer.y;
973 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
974 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
977 /* otherwise it has left the object */
983 ev2.canvas.x = e->pointer.x;
984 ev2.canvas.y = e->pointer.y;
985 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
986 if (e->events_frozen <= 0)
987 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
990 if (e->delete_me) break;
992 _evas_post_event_callback_call(e);
994 _evas_object_event_new();
996 event_id2 = _evas_event_counter;
997 if (copy) copy = eina_list_free(copy);
998 /* go thru our current list of ins */
999 EINA_LIST_FOREACH(newin, l, obj)
1001 ev3.canvas.x = e->pointer.x;
1002 ev3.canvas.y = e->pointer.y;
1003 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
1004 /* if its not in the old list of ins send an enter event */
1005 if (!eina_list_data_find(e->pointer.object.in, obj))
1010 if (e->events_frozen <= 0)
1011 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
1014 if (e->delete_me) break;
1016 /* free our old list of ins */
1017 eina_list_free(e->pointer.object.in);
1018 /* and set up the new one */
1019 e->pointer.object.in = newin;
1021 _evas_post_event_callback_call(e);
1027 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
1031 Evas_Event_Mouse_In ev;
1035 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1038 e->pointer.inside = 1;
1040 if (e->events_frozen > 0) return;
1041 e->last_timestamp = timestamp;
1043 if (e->pointer.mouse_grabbed != 0) return;
1045 _evas_object_event_new();
1047 event_id = _evas_event_counter;
1048 ev.buttons = e->pointer.button;
1049 ev.output.x = e->pointer.x;
1050 ev.output.y = e->pointer.y;
1051 ev.canvas.x = e->pointer.x;
1052 ev.canvas.y = e->pointer.y;
1053 ev.data = (void *)data;
1054 ev.modifiers = &(e->modifiers);
1055 ev.locks = &(e->locks);
1056 ev.timestamp = timestamp;
1057 ev.event_flags = e->default_event_flags;
1060 /* get new list of ins */
1061 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
1062 EINA_LIST_FOREACH(ins, l, obj)
1064 ev.canvas.x = e->pointer.x;
1065 ev.canvas.y = e->pointer.y;
1066 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1067 if (!eina_list_data_find(e->pointer.object.in, obj))
1072 if (e->events_frozen <= 0)
1073 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id);
1076 if (e->delete_me) break;
1078 /* free our old list of ins */
1079 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1080 /* and set up the new one */
1081 e->pointer.object.in = ins;
1082 _evas_post_event_callback_call(e);
1083 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
1088 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
1090 Evas_Event_Mouse_Out ev;
1093 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1096 e->pointer.inside = 0;
1098 if (e->events_frozen > 0) return;
1099 e->last_timestamp = timestamp;
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;
1116 /* if our mouse button is inside any objects */
1118 /* go thru old list of in objects */
1119 Eina_List *l, *copy;
1122 copy = evas_event_list_copy(e->pointer.object.in);
1123 EINA_LIST_FOREACH(copy, l, obj)
1125 ev.canvas.x = e->pointer.x;
1126 ev.canvas.y = e->pointer.y;
1127 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1131 if (!obj->delete_me)
1133 if (e->events_frozen <= 0)
1134 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
1136 obj->mouse_grabbed = 0;
1138 if (e->delete_me) break;
1140 if (copy) copy = eina_list_free(copy);
1141 /* free our old list of ins */
1142 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1143 e->pointer.mouse_grabbed = 0;
1144 _evas_post_event_callback_call(e);
1150 evas_event_feed_multi_down(Evas *e,
1151 int d, int x, int y,
1152 double rad, double radx, double rady,
1153 double pres, double ang,
1154 double fx, double fy,
1155 Evas_Button_Flags flags, unsigned int timestamp,
1158 Eina_List *l, *copy;
1159 Evas_Event_Multi_Down ev;
1164 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1169 if (e->events_frozen > 0) return;
1170 e->last_timestamp = timestamp;
1172 _evas_object_event_new();
1174 event_id = _evas_event_counter;
1185 ev.canvas.xsub = fx;
1186 ev.canvas.ysub = fy;
1187 ev.data = (void *)data;
1188 ev.modifiers = &(e->modifiers);
1189 ev.locks = &(e->locks);
1191 ev.timestamp = timestamp;
1192 ev.event_flags = e->default_event_flags;
1195 /* append new touch point to the touch point list */
1196 _evas_touch_point_append(e, d, x, y);
1197 if (e->pointer.mouse_grabbed == 0)
1199 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
1201 copy = evas_event_list_copy(e->pointer.object.in);
1202 EINA_LIST_FOREACH(copy, l, obj)
1204 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
1206 obj->mouse_grabbed += addgrab + 1;
1207 e->pointer.mouse_grabbed += addgrab + 1;
1210 EINA_LIST_FOREACH(copy, l, obj)
1214 ev.canvas.xsub = fx;
1215 ev.canvas.ysub = fy;
1216 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1217 if (x != ev.canvas.x)
1218 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1219 if (y != ev.canvas.y)
1220 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1221 if (e->events_frozen <= 0)
1222 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id);
1223 if (e->delete_me) break;
1225 if (copy) eina_list_free(copy);
1226 _evas_post_event_callback_call(e);
1227 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
1228 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
1233 evas_event_feed_multi_up(Evas *e,
1234 int d, int x, int y,
1235 double rad, double radx, double rady,
1236 double pres, double ang,
1237 double fx, double fy,
1238 Evas_Button_Flags flags, unsigned int timestamp,
1241 Eina_List *l, *copy;
1242 Evas_Event_Multi_Up ev;
1246 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1251 if (e->events_frozen > 0) return;
1252 e->last_timestamp = timestamp;
1254 _evas_object_event_new();
1256 event_id = _evas_event_counter;
1267 ev.canvas.xsub = fx;
1268 ev.canvas.ysub = fy;
1269 ev.data = (void *)data;
1270 ev.modifiers = &(e->modifiers);
1271 ev.locks = &(e->locks);
1273 ev.timestamp = timestamp;
1274 ev.event_flags = e->default_event_flags;
1277 /* update released touch point */
1278 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
1279 copy = evas_event_list_copy(e->pointer.object.in);
1280 EINA_LIST_FOREACH(copy, l, obj)
1284 ev.canvas.xsub = fx;
1285 ev.canvas.ysub = fy;
1286 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1287 if (x != ev.canvas.x)
1288 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1289 if (y != ev.canvas.y)
1290 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1291 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1292 (obj->mouse_grabbed > 0))
1294 obj->mouse_grabbed--;
1295 e->pointer.mouse_grabbed--;
1297 if (e->events_frozen <= 0)
1298 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id);
1299 if (e->delete_me) break;
1301 if (copy) copy = eina_list_free(copy);
1302 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1303 _evas_post_event_callback_call(e);
1304 /* remove released touch point from the touch point list */
1305 _evas_touch_point_remove(e, d);
1310 evas_event_feed_multi_move(Evas *e,
1311 int d, int x, int y,
1312 double rad, double radx, double rady,
1313 double pres, double ang,
1314 double fx, double fy,
1315 unsigned int timestamp, const void *data)
1317 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1321 if (e->events_frozen > 0) return;
1322 e->last_timestamp = timestamp;
1324 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
1327 /* update moved touch point */
1328 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
1329 /* if our mouse button is grabbed to any objects */
1330 if (e->pointer.mouse_grabbed > 0)
1332 /* go thru old list of in objects */
1333 Eina_List *l, *copy;
1334 Evas_Event_Multi_Move ev;
1338 _evas_object_event_new();
1340 event_id = _evas_event_counter;
1342 ev.cur.output.x = x;
1343 ev.cur.output.y = y;
1344 ev.cur.canvas.x = x;
1345 ev.cur.canvas.y = y;
1351 ev.cur.canvas.xsub = fx;
1352 ev.cur.canvas.ysub = fy;
1353 ev.data = (void *)data;
1354 ev.modifiers = &(e->modifiers);
1355 ev.locks = &(e->locks);
1356 ev.timestamp = timestamp;
1357 ev.event_flags = e->default_event_flags;
1359 copy = evas_event_list_copy(e->pointer.object.in);
1360 EINA_LIST_FOREACH(copy, l, obj)
1362 if ((e->events_frozen <= 0) &&
1363 (evas_object_clippers_is_visible(obj) || obj->mouse_grabbed) &&
1364 (!evas_event_passes_through(obj)) &&
1365 (!evas_event_freezes_through(obj)) &&
1366 (!obj->clip.clipees))
1368 ev.cur.canvas.x = x;
1369 ev.cur.canvas.y = y;
1370 ev.cur.canvas.xsub = fx;
1371 ev.cur.canvas.ysub = fy;
1372 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1373 if (x != ev.cur.canvas.x)
1374 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1375 if (y != ev.cur.canvas.y)
1376 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1377 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1379 if (e->delete_me) break;
1381 _evas_post_event_callback_call(e);
1386 Eina_List *l, *copy;
1387 Evas_Event_Multi_Move ev;
1391 _evas_object_event_new();
1393 event_id = _evas_event_counter;
1395 ev.cur.output.x = x;
1396 ev.cur.output.y = y;
1397 ev.cur.canvas.x = x;
1398 ev.cur.canvas.y = y;
1404 ev.cur.canvas.xsub = fx;
1405 ev.cur.canvas.ysub = fy;
1406 ev.data = (void *)data;
1407 ev.modifiers = &(e->modifiers);
1408 ev.locks = &(e->locks);
1409 ev.timestamp = timestamp;
1410 ev.event_flags = e->default_event_flags;
1412 /* get all new in objects */
1413 ins = evas_event_objects_event_list(e, NULL, x, y);
1414 /* go thru old list of in objects */
1415 copy = evas_event_list_copy(e->pointer.object.in);
1416 EINA_LIST_FOREACH(copy, l, obj)
1418 /* if its under the pointer and its visible and its in the new */
1420 // FIXME: i don't think we need this
1421 // evas_object_clip_recalc(obj);
1422 if ((e->events_frozen <= 0) &&
1423 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1424 (evas_object_clippers_is_visible(obj) ||
1425 obj->mouse_grabbed) &&
1426 eina_list_data_find(ins, obj) &&
1427 (!evas_event_passes_through(obj)) &&
1428 (!evas_event_freezes_through(obj)) &&
1429 (!obj->clip.clipees) &&
1430 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
1433 ev.cur.canvas.x = x;
1434 ev.cur.canvas.y = y;
1435 ev.cur.canvas.xsub = fx;
1436 ev.cur.canvas.ysub = fy;
1437 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1438 if (x != ev.cur.canvas.x)
1439 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1440 if (y != ev.cur.canvas.y)
1441 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1442 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1444 if (e->delete_me) break;
1446 if (copy) copy = eina_list_free(copy);
1447 if (e->pointer.mouse_grabbed == 0)
1449 /* free our old list of ins */
1450 eina_list_free(e->pointer.object.in);
1451 /* and set up the new one */
1452 e->pointer.object.in = ins;
1456 /* free our cur ins */
1457 eina_list_free(ins);
1459 _evas_post_event_callback_call(e);
1465 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)
1468 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1472 if (!keyname) return;
1473 if (e->events_frozen > 0) return;
1474 e->last_timestamp = timestamp;
1477 Evas_Event_Key_Down ev;
1478 Eina_Bool exclusive;
1480 _evas_object_event_new();
1482 event_id = _evas_event_counter;
1483 exclusive = EINA_FALSE;
1484 ev.keyname = (char *)keyname;
1485 ev.data = (void *)data;
1486 ev.modifiers = &(e->modifiers);
1487 ev.locks = &(e->locks);
1490 ev.compose = compose;
1491 ev.timestamp = timestamp;
1492 ev.event_flags = e->default_event_flags;
1500 EINA_LIST_FOREACH(e->grabs, l, g)
1504 g->just_added = EINA_FALSE;
1507 if (g->delete_me) continue;
1508 if (((e->modifiers.mask & g->modifiers) ||
1509 (g->modifiers == e->modifiers.mask)) &&
1510 (!strcmp(keyname, g->keyname)))
1512 if (!(e->modifiers.mask & g->not_modifiers))
1514 if (e->events_frozen <= 0 &&
1515 !evas_event_freezes_through(g->object))
1516 evas_object_event_callback_call(g->object,
1517 EVAS_CALLBACK_KEY_DOWN,
1519 if (g->exclusive) exclusive = EINA_TRUE;
1522 if (e->delete_me) break;
1525 if (e->walking_grabs <= 0)
1527 while (e->delete_grabs > 0)
1530 for (l = e->grabs; l;)
1532 g = eina_list_data_get(l);
1533 l = eina_list_next(l);
1535 evas_key_grab_free(g->object, g->keyname, g->modifiers,
1541 if ((e->focused) && (!exclusive))
1543 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1544 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN,
1547 _evas_post_event_callback_call(e);
1552 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)
1555 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1558 if (!keyname) return;
1559 if (e->events_frozen > 0) return;
1560 e->last_timestamp = timestamp;
1563 Evas_Event_Key_Up ev;
1564 Eina_Bool exclusive;
1566 _evas_object_event_new();
1568 event_id = _evas_event_counter;
1569 exclusive = EINA_FALSE;
1570 ev.keyname = (char *)keyname;
1571 ev.data = (void *)data;
1572 ev.modifiers = &(e->modifiers);
1573 ev.locks = &(e->locks);
1576 ev.compose = compose;
1577 ev.timestamp = timestamp;
1578 ev.event_flags = e->default_event_flags;
1586 EINA_LIST_FOREACH(e->grabs, l, g)
1590 g->just_added = EINA_FALSE;
1593 if (g->delete_me) continue;
1594 if (((e->modifiers.mask & g->modifiers) ||
1595 (g->modifiers == e->modifiers.mask)) &&
1596 (!((e->modifiers.mask & g->not_modifiers) ||
1597 (g->not_modifiers == ~e->modifiers.mask))) &&
1598 (!strcmp(keyname, g->keyname)))
1600 if (e->events_frozen <= 0 &&
1601 !evas_event_freezes_through(g->object))
1602 evas_object_event_callback_call(g->object,
1603 EVAS_CALLBACK_KEY_UP, &ev, event_id);
1604 if (g->exclusive) exclusive = EINA_TRUE;
1606 if (e->delete_me) break;
1609 if (e->walking_grabs <= 0)
1611 while (e->delete_grabs > 0)
1613 Eina_List *ll, *l_next;
1617 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1620 evas_key_grab_free(gr->object, gr->keyname,
1621 gr->modifiers, gr->not_modifiers);
1626 if ((e->focused) && (!exclusive))
1628 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1629 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP,
1632 _evas_post_event_callback_call(e);
1637 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1639 Eina_List *l, *copy;
1644 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1648 if (e->events_frozen > 0) return;
1649 e->last_timestamp = timestamp;
1651 _evas_object_event_new();
1653 event_id = _evas_event_counter;
1655 ev.data = (void *)data;
1656 ev.timestamp = timestamp;
1657 ev.event_flags = e->default_event_flags;
1660 copy = evas_event_list_copy(e->pointer.object.in);
1661 EINA_LIST_FOREACH(copy, l, obj)
1663 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
1664 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev, event_id);
1665 if (e->delete_me) break;
1667 if (copy) copy = eina_list_free(copy);
1668 _evas_post_event_callback_call(e);
1670 _evas_object_event_new();
1674 evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze)
1676 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1681 if (obj->freeze_events == freeze) return;
1682 obj->freeze_events = freeze;
1683 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE);
1687 evas_object_freeze_events_get(const Evas_Object *obj)
1689 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1692 return obj->freeze_events;
1696 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1698 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1702 if (obj->pass_events == pass) return;
1703 obj->pass_events = pass;
1704 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE);
1705 if (evas_object_is_in_output_rect(obj,
1706 obj->layer->evas->pointer.x,
1707 obj->layer->evas->pointer.y, 1, 1) &&
1708 ((!obj->precise_is_inside) ||
1709 (evas_object_is_inside(obj,
1710 obj->layer->evas->pointer.x,
1711 obj->layer->evas->pointer.y))))
1712 evas_event_feed_mouse_move(obj->layer->evas,
1713 obj->layer->evas->pointer.x,
1714 obj->layer->evas->pointer.y,
1715 obj->layer->evas->last_timestamp,
1720 evas_object_pass_events_get(const Evas_Object *obj)
1722 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1725 return obj->pass_events;
1729 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1731 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1735 if (obj->repeat_events == repeat) return;
1736 obj->repeat_events = repeat;
1737 if (evas_object_is_in_output_rect(obj,
1738 obj->layer->evas->pointer.x,
1739 obj->layer->evas->pointer.y, 1, 1) &&
1740 ((!obj->precise_is_inside) ||
1741 (evas_object_is_inside(obj,
1742 obj->layer->evas->pointer.x,
1743 obj->layer->evas->pointer.y))))
1744 evas_event_feed_mouse_move(obj->layer->evas,
1745 obj->layer->evas->pointer.x,
1746 obj->layer->evas->pointer.y,
1747 obj->layer->evas->last_timestamp,
1752 evas_object_repeat_events_get(const Evas_Object *obj)
1754 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1757 return obj->repeat_events;
1761 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1763 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1766 obj->no_propagate = !prop;
1770 evas_object_propagate_events_get(const Evas_Object *obj)
1772 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1775 return !(obj->no_propagate);
1779 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1781 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1784 obj->pointer_mode = setting;
1787 EAPI Evas_Object_Pointer_Mode
1788 evas_object_pointer_mode_get(const Evas_Object *obj)
1790 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1791 return EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
1793 return obj->pointer_mode;
1797 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1799 if (!event_copy) return;
1803 case EVAS_CALLBACK_MOUSE_IN:
1805 Evas_Event_Mouse_In *ev = event_copy;
1806 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1809 case EVAS_CALLBACK_MOUSE_OUT:
1811 Evas_Event_Mouse_Out *ev = event_copy;
1812 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1815 case EVAS_CALLBACK_MOUSE_DOWN:
1817 Evas_Event_Mouse_Down *ev = event_copy;
1818 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1821 case EVAS_CALLBACK_MOUSE_UP:
1823 Evas_Event_Mouse_Up *ev = event_copy;
1824 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1827 case EVAS_CALLBACK_MOUSE_MOVE:
1829 Evas_Event_Mouse_Move *ev = event_copy;
1830 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1833 case EVAS_CALLBACK_MOUSE_WHEEL:
1835 Evas_Event_Mouse_Wheel *ev = event_copy;
1836 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1839 case EVAS_CALLBACK_MULTI_DOWN:
1841 Evas_Event_Multi_Down *ev = event_copy;
1842 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);
1845 case EVAS_CALLBACK_MULTI_UP:
1847 Evas_Event_Multi_Up *ev = event_copy;
1848 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);
1851 case EVAS_CALLBACK_MULTI_MOVE:
1853 Evas_Event_Multi_Move *ev = event_copy;
1854 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);
1857 case EVAS_CALLBACK_KEY_DOWN:
1859 Evas_Event_Key_Down *ev = event_copy;
1860 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1863 case EVAS_CALLBACK_KEY_UP:
1865 Evas_Event_Key_Up *ev = event_copy;
1866 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1869 default: /* All non-input events are not handeled */
1875 evas_event_down_count_get(const Evas *e)
1877 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1880 return e->pointer.downs;