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;
457 if (e->pointer.downs <= 0) return;
459 e->pointer.button &= ~(1 << (b - 1));
462 if (e->events_frozen > 0) return;
463 e->last_timestamp = timestamp;
466 Evas_Event_Mouse_Up ev;
470 _evas_object_event_new();
472 event_id = _evas_event_counter;
474 ev.output.x = e->pointer.x;
475 ev.output.y = e->pointer.y;
476 ev.canvas.x = e->pointer.x;
477 ev.canvas.y = e->pointer.y;
478 ev.data = (void *)data;
479 ev.modifiers = &(e->modifiers);
480 ev.locks = &(e->locks);
482 ev.timestamp = timestamp;
483 ev.event_flags = e->default_event_flags;
486 /* update released touch point */
487 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
488 copy = evas_event_list_copy(e->pointer.object.in);
489 EINA_LIST_FOREACH(copy, l, obj)
491 ev.canvas.x = e->pointer.x;
492 ev.canvas.y = e->pointer.y;
493 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
494 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_AUTOGRAB) &&
495 (obj->mouse_grabbed > 0))
497 obj->mouse_grabbed--;
498 e->pointer.mouse_grabbed--;
502 if ((e->events_frozen <= 0) &&
503 (!evas_event_freezes_through(obj)))
504 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id);
506 if (e->delete_me) break;
507 if (obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)
509 if (e->pointer.nogrep > 0) e->pointer.nogrep--;
513 if (copy) copy = eina_list_free(copy);
514 e->last_mouse_up_counter++;
515 _evas_post_event_callback_call(e);
518 if (e->pointer.mouse_grabbed == 0)
520 _post_up_handle(e, timestamp, data);
523 if (e->pointer.mouse_grabbed < 0)
525 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
526 e->pointer.mouse_grabbed);
528 /* remove released touch point from the touch point list */
529 _evas_touch_point_remove(e, 0);
535 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
539 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
543 if (e->events_frozen > 0) return;
546 for (i = 0; i < 32; i++)
548 if ((e->pointer.button & (1 << i)))
549 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
551 // FIXME: multi cancel too?
556 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
559 Evas_Event_Mouse_Wheel ev;
563 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
567 if (e->events_frozen > 0) return;
568 e->last_timestamp = timestamp;
570 _evas_object_event_new();
572 event_id = _evas_event_counter;
573 ev.direction = direction;
575 ev.output.x = e->pointer.x;
576 ev.output.y = e->pointer.y;
577 ev.canvas.x = e->pointer.x;
578 ev.canvas.y = e->pointer.y;
579 ev.data = (void *) data;
580 ev.modifiers = &(e->modifiers);
581 ev.locks = &(e->locks);
582 ev.timestamp = timestamp;
583 ev.event_flags = e->default_event_flags;
586 copy = evas_event_list_copy(e->pointer.object.in);
588 EINA_LIST_FOREACH(copy, l, obj)
590 ev.canvas.x = e->pointer.x;
591 ev.canvas.y = e->pointer.y;
592 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
593 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
594 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id);
595 if (e->delete_me) break;
597 if (copy) copy = eina_list_free(copy);
598 _evas_post_event_callback_call(e);
604 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
606 Evas_Object *nogrep_obj = NULL;
608 //// Evas_Coord pcx, pcy;
610 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
616 //// pcx = e->pointer.canvas_x;
617 //// pcy = e->pointer.canvas_y;
619 if (e->events_frozen > 0) return;
620 e->last_timestamp = timestamp;
624 //// e->pointer.canvas_x = x;
625 //// e->pointer.canvas_y = y;
626 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
627 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
628 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
630 /* update moved touch point */
631 if ((px != x) || (py != y))
632 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
633 /* if our mouse button is grabbed to any objects */
634 if (e->pointer.mouse_grabbed > 0)
636 /* go thru old list of in objects */
637 Eina_List *outs = NULL;
641 Evas_Event_Mouse_Move ev;
645 _evas_object_event_new();
647 event_id = _evas_event_counter;
648 ev.buttons = e->pointer.button;
649 ev.cur.output.x = e->pointer.x;
650 ev.cur.output.y = e->pointer.y;
651 ev.cur.canvas.x = e->pointer.x;
652 ev.cur.canvas.y = e->pointer.y;
653 ev.prev.output.x = px;
654 ev.prev.output.y = py;
655 ev.prev.canvas.x = px;
656 ev.prev.canvas.y = py;
657 ev.data = (void *)data;
658 ev.modifiers = &(e->modifiers);
659 ev.locks = &(e->locks);
660 ev.timestamp = timestamp;
661 ev.event_flags = e->default_event_flags;
662 copy = evas_event_list_copy(e->pointer.object.in);
663 EINA_LIST_FOREACH(copy, l, obj)
665 ev.cur.canvas.x = e->pointer.x;
666 ev.cur.canvas.y = e->pointer.y;
667 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x,
670 if ((e->events_frozen <= 0) &&
671 (evas_object_clippers_is_visible(obj) ||
672 obj->mouse_grabbed) &&
673 (!evas_event_passes_through(obj)) &&
674 (!evas_event_freezes_through(obj)) &&
675 (!obj->clip.clipees))
677 if ((px != x) || (py != y))
678 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
681 outs = eina_list_append(outs, obj);
682 if ((obj->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) &&
683 (e->pointer.nogrep > 0))
685 eina_list_free(copy);
689 if (e->delete_me) break;
691 _evas_post_event_callback_call(e);
694 Evas_Event_Mouse_Out ev;
697 _evas_object_event_new();
699 event_id = _evas_event_counter;
700 ev.buttons = e->pointer.button;
701 ev.output.x = e->pointer.x;
702 ev.output.y = e->pointer.y;
703 ev.canvas.x = e->pointer.x;
704 ev.canvas.y = e->pointer.y;
705 ev.data = (void *)data;
706 ev.modifiers = &(e->modifiers);
707 ev.locks = &(e->locks);
708 ev.timestamp = timestamp;
709 ev.event_flags = e->default_event_flags;
711 if (copy) eina_list_free(copy);
717 outs = eina_list_remove(outs, obj);
718 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
720 ev.canvas.x = e->pointer.x;
721 ev.canvas.y = e->pointer.y;
722 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
723 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
729 if (e->events_frozen <= 0)
730 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
735 _evas_post_event_callback_call(e);
742 Evas_Event_Mouse_Move ev;
743 Evas_Event_Mouse_Out ev2;
744 Evas_Event_Mouse_In ev3;
746 int event_id = 0, event_id2 = 0;
748 _evas_object_event_new();
750 event_id = _evas_event_counter;
751 ev.buttons = e->pointer.button;
752 ev.cur.output.x = e->pointer.x;
753 ev.cur.output.y = e->pointer.y;
754 ev.cur.canvas.x = e->pointer.x;
755 ev.cur.canvas.y = e->pointer.y;
756 ev.prev.output.x = px;
757 ev.prev.output.y = py;
758 ev.prev.canvas.x = px;
759 ev.prev.canvas.y = py;
760 ev.data = (void *)data;
761 ev.modifiers = &(e->modifiers);
762 ev.locks = &(e->locks);
763 ev.timestamp = timestamp;
764 ev.event_flags = e->default_event_flags;
766 ev2.buttons = e->pointer.button;
767 ev2.output.x = e->pointer.x;
768 ev2.output.y = e->pointer.y;
769 ev2.canvas.x = e->pointer.x;
770 ev2.canvas.y = e->pointer.y;
771 ev2.data = (void *)data;
772 ev2.modifiers = &(e->modifiers);
773 ev2.locks = &(e->locks);
774 ev2.timestamp = timestamp;
775 ev2.event_flags = e->default_event_flags;
777 ev3.buttons = e->pointer.button;
778 ev3.output.x = e->pointer.x;
779 ev3.output.y = e->pointer.y;
780 ev3.canvas.x = e->pointer.x;
781 ev3.canvas.y = e->pointer.y;
782 ev3.data = (void *)data;
783 ev3.modifiers = &(e->modifiers);
784 ev3.locks = &(e->locks);
785 ev3.timestamp = timestamp;
786 ev3.event_flags = e->default_event_flags;
788 /* get all new in objects */
789 ins = evas_event_objects_event_list(e, NULL, x, y);
790 /* go thru old list of in objects */
791 copy = evas_event_list_copy(e->pointer.object.in);
792 EINA_LIST_FOREACH(copy, l, obj)
794 /* if its under the pointer and its visible and its in the new */
796 // FIXME: i don't think we need this
797 // evas_object_clip_recalc(obj);
798 if ((e->events_frozen <= 0) &&
799 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
800 (evas_object_clippers_is_visible(obj) ||
801 obj->mouse_grabbed) &&
802 eina_list_data_find(ins, obj) &&
803 (!evas_event_passes_through(obj)) &&
804 (!evas_event_freezes_through(obj)) &&
805 (!obj->clip.clipees) &&
806 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
809 if ((px != x) || (py != y))
811 ev.cur.canvas.x = e->pointer.x;
812 ev.cur.canvas.y = e->pointer.y;
813 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
814 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
817 /* otherwise it has left the object */
823 ev2.canvas.x = e->pointer.x;
824 ev2.canvas.y = e->pointer.y;
825 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
826 if (e->events_frozen <= 0)
827 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
830 if (e->delete_me) break;
832 _evas_post_event_callback_call(e);
834 _evas_object_event_new();
836 event_id2 = _evas_event_counter;
837 if (copy) copy = eina_list_free(copy);
838 /* go thru our current list of ins */
839 EINA_LIST_FOREACH(ins, l, obj)
841 ev3.canvas.x = e->pointer.x;
842 ev3.canvas.y = e->pointer.y;
843 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
844 /* if its not in the old list of ins send an enter event */
845 if (!eina_list_data_find(e->pointer.object.in, obj))
850 if (e->events_frozen <= 0)
851 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
854 if (e->delete_me) break;
856 if (e->pointer.mouse_grabbed == 0)
858 /* free our old list of ins */
859 eina_list_free(e->pointer.object.in);
860 /* and set up the new one */
861 e->pointer.object.in = ins;
865 /* free our cur ins */
868 _evas_post_event_callback_call(e);
874 Eina_List *ins = NULL;
875 Eina_List *newin = NULL;
876 Eina_List *l, *copy, *lst = NULL;
877 Evas_Event_Mouse_Move ev;
878 Evas_Event_Mouse_Out ev2;
879 Evas_Event_Mouse_In ev3;
880 Evas_Object *obj, *below_obj;
881 int event_id = 0, event_id2 = 0;
882 int norep = 0, breaknext = 0;
884 _evas_object_event_new();
886 event_id = _evas_event_counter;
887 ev.buttons = e->pointer.button;
888 ev.cur.output.x = e->pointer.x;
889 ev.cur.output.y = e->pointer.y;
890 ev.cur.canvas.x = e->pointer.x;
891 ev.cur.canvas.y = e->pointer.y;
892 ev.prev.output.x = px;
893 ev.prev.output.y = py;
894 ev.prev.canvas.x = px;
895 ev.prev.canvas.y = py;
896 ev.data = (void *)data;
897 ev.modifiers = &(e->modifiers);
898 ev.locks = &(e->locks);
899 ev.timestamp = timestamp;
900 ev.event_flags = e->default_event_flags;
902 ev2.buttons = e->pointer.button;
903 ev2.output.x = e->pointer.x;
904 ev2.output.y = e->pointer.y;
905 ev2.canvas.x = e->pointer.x;
906 ev2.canvas.y = e->pointer.y;
907 ev2.data = (void *)data;
908 ev2.modifiers = &(e->modifiers);
909 ev2.locks = &(e->locks);
910 ev2.timestamp = timestamp;
911 ev2.event_flags = e->default_event_flags;
913 ev3.buttons = e->pointer.button;
914 ev3.output.x = e->pointer.x;
915 ev3.output.y = e->pointer.y;
916 ev3.canvas.x = e->pointer.x;
917 ev3.canvas.y = e->pointer.y;
918 ev3.data = (void *)data;
919 ev3.modifiers = &(e->modifiers);
920 ev3.locks = &(e->locks);
921 ev3.timestamp = timestamp;
922 ev3.event_flags = e->default_event_flags;
924 /* go thru old list of in objects */
925 copy = evas_event_list_copy(e->pointer.object.in);
926 EINA_LIST_FOREACH(copy, l, obj)
933 if (obj == nogrep_obj) breaknext = 1;
936 /* get all new in objects */
937 below_obj = evas_object_below_get(nogrep_obj);
939 ins = _evas_event_object_list_raw_in_get(e, NULL,
940 EINA_INLIST_GET(below_obj), NULL,
941 e->pointer.x, e->pointer.y,
943 EINA_LIST_FOREACH(copy, l, obj)
945 newin = eina_list_append(newin, obj);
946 if (obj == nogrep_obj) break;
948 EINA_LIST_FOREACH(ins, l, obj)
950 newin = eina_list_append(newin, obj);
953 EINA_LIST_FOREACH(lst, l, obj)
955 /* if its under the pointer and its visible and its in the new */
957 // FIXME: i don't think we need this
958 // evas_object_clip_recalc(obj);
959 if ((e->events_frozen <= 0) &&
960 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
961 (evas_object_clippers_is_visible(obj) ||
962 obj->mouse_grabbed) &&
963 eina_list_data_find(newin, obj) &&
964 (!evas_event_passes_through(obj)) &&
965 (!evas_event_freezes_through(obj)) &&
966 (!obj->clip.clipees) &&
967 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
970 if ((px != x) || (py != y))
972 ev.cur.canvas.x = e->pointer.x;
973 ev.cur.canvas.y = e->pointer.y;
974 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
975 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
978 /* otherwise it has left the object */
984 ev2.canvas.x = e->pointer.x;
985 ev2.canvas.y = e->pointer.y;
986 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
987 if (e->events_frozen <= 0)
988 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
991 if (e->delete_me) break;
993 _evas_post_event_callback_call(e);
995 _evas_object_event_new();
997 event_id2 = _evas_event_counter;
998 if (copy) copy = eina_list_free(copy);
999 /* go thru our current list of ins */
1000 EINA_LIST_FOREACH(newin, l, obj)
1002 ev3.canvas.x = e->pointer.x;
1003 ev3.canvas.y = e->pointer.y;
1004 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
1005 /* if its not in the old list of ins send an enter event */
1006 if (!eina_list_data_find(e->pointer.object.in, obj))
1011 if (e->events_frozen <= 0)
1012 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
1015 if (e->delete_me) break;
1017 /* free our old list of ins */
1018 eina_list_free(e->pointer.object.in);
1019 /* and set up the new one */
1020 e->pointer.object.in = newin;
1022 _evas_post_event_callback_call(e);
1028 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
1032 Evas_Event_Mouse_In ev;
1036 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1039 e->pointer.inside = 1;
1041 if (e->events_frozen > 0) return;
1042 e->last_timestamp = timestamp;
1044 if (e->pointer.mouse_grabbed != 0) return;
1046 _evas_object_event_new();
1048 event_id = _evas_event_counter;
1049 ev.buttons = e->pointer.button;
1050 ev.output.x = e->pointer.x;
1051 ev.output.y = e->pointer.y;
1052 ev.canvas.x = e->pointer.x;
1053 ev.canvas.y = e->pointer.y;
1054 ev.data = (void *)data;
1055 ev.modifiers = &(e->modifiers);
1056 ev.locks = &(e->locks);
1057 ev.timestamp = timestamp;
1058 ev.event_flags = e->default_event_flags;
1061 /* get new list of ins */
1062 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
1063 EINA_LIST_FOREACH(ins, l, obj)
1065 ev.canvas.x = e->pointer.x;
1066 ev.canvas.y = e->pointer.y;
1067 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1068 if (!eina_list_data_find(e->pointer.object.in, obj))
1073 if (e->events_frozen <= 0)
1074 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id);
1077 if (e->delete_me) break;
1079 /* free our old list of ins */
1080 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1081 /* and set up the new one */
1082 e->pointer.object.in = ins;
1083 _evas_post_event_callback_call(e);
1084 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
1089 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
1091 Evas_Event_Mouse_Out ev;
1094 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1097 e->pointer.inside = 0;
1099 if (e->events_frozen > 0) return;
1100 e->last_timestamp = timestamp;
1102 _evas_object_event_new();
1104 event_id = _evas_event_counter;
1105 ev.buttons = e->pointer.button;
1106 ev.output.x = e->pointer.x;
1107 ev.output.y = e->pointer.y;
1108 ev.canvas.x = e->pointer.x;
1109 ev.canvas.y = e->pointer.y;
1110 ev.data = (void *)data;
1111 ev.modifiers = &(e->modifiers);
1112 ev.locks = &(e->locks);
1113 ev.timestamp = timestamp;
1114 ev.event_flags = e->default_event_flags;
1117 /* if our mouse button is inside any objects */
1119 /* go thru old list of in objects */
1120 Eina_List *l, *copy;
1123 copy = evas_event_list_copy(e->pointer.object.in);
1124 EINA_LIST_FOREACH(copy, l, obj)
1126 ev.canvas.x = e->pointer.x;
1127 ev.canvas.y = e->pointer.y;
1128 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1132 if (!obj->delete_me)
1134 if (e->events_frozen <= 0)
1135 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
1137 obj->mouse_grabbed = 0;
1139 if (e->delete_me) break;
1141 if (copy) copy = eina_list_free(copy);
1142 /* free our old list of ins */
1143 e->pointer.object.in = eina_list_free(e->pointer.object.in);
1144 e->pointer.mouse_grabbed = 0;
1145 _evas_post_event_callback_call(e);
1151 evas_event_feed_multi_down(Evas *e,
1152 int d, int x, int y,
1153 double rad, double radx, double rady,
1154 double pres, double ang,
1155 double fx, double fy,
1156 Evas_Button_Flags flags, unsigned int timestamp,
1159 Eina_List *l, *copy;
1160 Evas_Event_Multi_Down ev;
1165 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1170 if (e->events_frozen > 0) return;
1171 e->last_timestamp = timestamp;
1173 _evas_object_event_new();
1175 event_id = _evas_event_counter;
1186 ev.canvas.xsub = fx;
1187 ev.canvas.ysub = fy;
1188 ev.data = (void *)data;
1189 ev.modifiers = &(e->modifiers);
1190 ev.locks = &(e->locks);
1192 ev.timestamp = timestamp;
1193 ev.event_flags = e->default_event_flags;
1196 /* append new touch point to the touch point list */
1197 _evas_touch_point_append(e, d, x, y);
1198 if (e->pointer.mouse_grabbed == 0)
1200 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
1202 copy = evas_event_list_copy(e->pointer.object.in);
1203 EINA_LIST_FOREACH(copy, l, obj)
1205 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
1207 obj->mouse_grabbed += addgrab + 1;
1208 e->pointer.mouse_grabbed += addgrab + 1;
1211 EINA_LIST_FOREACH(copy, l, obj)
1215 ev.canvas.xsub = fx;
1216 ev.canvas.ysub = fy;
1217 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1218 if (x != ev.canvas.x)
1219 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1220 if (y != ev.canvas.y)
1221 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1222 if (e->events_frozen <= 0)
1223 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id);
1224 if (e->delete_me) break;
1226 if (copy) eina_list_free(copy);
1227 _evas_post_event_callback_call(e);
1228 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
1229 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
1234 evas_event_feed_multi_up(Evas *e,
1235 int d, int x, int y,
1236 double rad, double radx, double rady,
1237 double pres, double ang,
1238 double fx, double fy,
1239 Evas_Button_Flags flags, unsigned int timestamp,
1242 Eina_List *l, *copy;
1243 Evas_Event_Multi_Up ev;
1247 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1251 if (e->pointer.downs <= 0) return;
1253 if (e->events_frozen > 0) return;
1254 e->last_timestamp = timestamp;
1256 _evas_object_event_new();
1258 event_id = _evas_event_counter;
1269 ev.canvas.xsub = fx;
1270 ev.canvas.ysub = fy;
1271 ev.data = (void *)data;
1272 ev.modifiers = &(e->modifiers);
1273 ev.locks = &(e->locks);
1275 ev.timestamp = timestamp;
1276 ev.event_flags = e->default_event_flags;
1279 /* update released touch point */
1280 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
1281 copy = evas_event_list_copy(e->pointer.object.in);
1282 EINA_LIST_FOREACH(copy, l, obj)
1286 ev.canvas.xsub = fx;
1287 ev.canvas.ysub = fy;
1288 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1289 if (x != ev.canvas.x)
1290 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1291 if (y != ev.canvas.y)
1292 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1293 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1294 (obj->mouse_grabbed > 0))
1296 obj->mouse_grabbed--;
1297 e->pointer.mouse_grabbed--;
1299 if (e->events_frozen <= 0)
1300 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id);
1301 if (e->delete_me) break;
1303 if (copy) copy = eina_list_free(copy);
1304 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1305 _evas_post_event_callback_call(e);
1306 /* remove released touch point from the touch point list */
1307 _evas_touch_point_remove(e, d);
1312 evas_event_feed_multi_move(Evas *e,
1313 int d, int x, int y,
1314 double rad, double radx, double rady,
1315 double pres, double ang,
1316 double fx, double fy,
1317 unsigned int timestamp, const void *data)
1319 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1323 if (e->events_frozen > 0) return;
1324 e->last_timestamp = timestamp;
1326 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
1329 /* update moved touch point */
1330 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
1331 /* if our mouse button is grabbed to any objects */
1332 if (e->pointer.mouse_grabbed > 0)
1334 /* go thru old list of in objects */
1335 Eina_List *l, *copy;
1336 Evas_Event_Multi_Move ev;
1340 _evas_object_event_new();
1342 event_id = _evas_event_counter;
1344 ev.cur.output.x = x;
1345 ev.cur.output.y = y;
1346 ev.cur.canvas.x = x;
1347 ev.cur.canvas.y = y;
1353 ev.cur.canvas.xsub = fx;
1354 ev.cur.canvas.ysub = fy;
1355 ev.data = (void *)data;
1356 ev.modifiers = &(e->modifiers);
1357 ev.locks = &(e->locks);
1358 ev.timestamp = timestamp;
1359 ev.event_flags = e->default_event_flags;
1361 copy = evas_event_list_copy(e->pointer.object.in);
1362 EINA_LIST_FOREACH(copy, l, obj)
1364 if ((e->events_frozen <= 0) &&
1365 (evas_object_clippers_is_visible(obj) || obj->mouse_grabbed) &&
1366 (!evas_event_passes_through(obj)) &&
1367 (!evas_event_freezes_through(obj)) &&
1368 (!obj->clip.clipees))
1370 ev.cur.canvas.x = x;
1371 ev.cur.canvas.y = y;
1372 ev.cur.canvas.xsub = fx;
1373 ev.cur.canvas.ysub = fy;
1374 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1375 if (x != ev.cur.canvas.x)
1376 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1377 if (y != ev.cur.canvas.y)
1378 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1379 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1381 if (e->delete_me) break;
1383 _evas_post_event_callback_call(e);
1388 Eina_List *l, *copy;
1389 Evas_Event_Multi_Move ev;
1393 _evas_object_event_new();
1395 event_id = _evas_event_counter;
1397 ev.cur.output.x = x;
1398 ev.cur.output.y = y;
1399 ev.cur.canvas.x = x;
1400 ev.cur.canvas.y = y;
1406 ev.cur.canvas.xsub = fx;
1407 ev.cur.canvas.ysub = fy;
1408 ev.data = (void *)data;
1409 ev.modifiers = &(e->modifiers);
1410 ev.locks = &(e->locks);
1411 ev.timestamp = timestamp;
1412 ev.event_flags = e->default_event_flags;
1414 /* get all new in objects */
1415 ins = evas_event_objects_event_list(e, NULL, x, y);
1416 /* go thru old list of in objects */
1417 copy = evas_event_list_copy(e->pointer.object.in);
1418 EINA_LIST_FOREACH(copy, l, obj)
1420 /* if its under the pointer and its visible and its in the new */
1422 // FIXME: i don't think we need this
1423 // evas_object_clip_recalc(obj);
1424 if ((e->events_frozen <= 0) &&
1425 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1426 (evas_object_clippers_is_visible(obj) ||
1427 obj->mouse_grabbed) &&
1428 eina_list_data_find(ins, obj) &&
1429 (!evas_event_passes_through(obj)) &&
1430 (!evas_event_freezes_through(obj)) &&
1431 (!obj->clip.clipees) &&
1432 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
1435 ev.cur.canvas.x = x;
1436 ev.cur.canvas.y = y;
1437 ev.cur.canvas.xsub = fx;
1438 ev.cur.canvas.ysub = fy;
1439 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1440 if (x != ev.cur.canvas.x)
1441 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1442 if (y != ev.cur.canvas.y)
1443 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1444 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1446 if (e->delete_me) break;
1448 if (copy) copy = eina_list_free(copy);
1449 if (e->pointer.mouse_grabbed == 0)
1451 /* free our old list of ins */
1452 eina_list_free(e->pointer.object.in);
1453 /* and set up the new one */
1454 e->pointer.object.in = ins;
1458 /* free our cur ins */
1459 eina_list_free(ins);
1461 _evas_post_event_callback_call(e);
1467 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)
1470 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1474 if (!keyname) return;
1475 if (e->events_frozen > 0) return;
1476 e->last_timestamp = timestamp;
1479 Evas_Event_Key_Down ev;
1480 Eina_Bool exclusive;
1482 _evas_object_event_new();
1484 event_id = _evas_event_counter;
1485 exclusive = EINA_FALSE;
1486 ev.keyname = (char *)keyname;
1487 ev.data = (void *)data;
1488 ev.modifiers = &(e->modifiers);
1489 ev.locks = &(e->locks);
1492 ev.compose = compose;
1493 ev.timestamp = timestamp;
1494 ev.event_flags = e->default_event_flags;
1502 EINA_LIST_FOREACH(e->grabs, l, g)
1506 g->just_added = EINA_FALSE;
1509 if (g->delete_me) continue;
1510 if (((e->modifiers.mask & g->modifiers) ||
1511 (g->modifiers == e->modifiers.mask)) &&
1512 (!strcmp(keyname, g->keyname)))
1514 if (!(e->modifiers.mask & g->not_modifiers))
1516 if (e->events_frozen <= 0 &&
1517 !evas_event_freezes_through(g->object))
1518 evas_object_event_callback_call(g->object,
1519 EVAS_CALLBACK_KEY_DOWN,
1521 if (g->exclusive) exclusive = EINA_TRUE;
1524 if (e->delete_me) break;
1527 if (e->walking_grabs <= 0)
1529 while (e->delete_grabs > 0)
1532 for (l = e->grabs; l;)
1534 g = eina_list_data_get(l);
1535 l = eina_list_next(l);
1537 evas_key_grab_free(g->object, g->keyname, g->modifiers,
1543 if ((e->focused) && (!exclusive))
1545 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1546 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN,
1549 _evas_post_event_callback_call(e);
1554 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)
1557 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1560 if (!keyname) return;
1561 if (e->events_frozen > 0) return;
1562 e->last_timestamp = timestamp;
1565 Evas_Event_Key_Up ev;
1566 Eina_Bool exclusive;
1568 _evas_object_event_new();
1570 event_id = _evas_event_counter;
1571 exclusive = EINA_FALSE;
1572 ev.keyname = (char *)keyname;
1573 ev.data = (void *)data;
1574 ev.modifiers = &(e->modifiers);
1575 ev.locks = &(e->locks);
1578 ev.compose = compose;
1579 ev.timestamp = timestamp;
1580 ev.event_flags = e->default_event_flags;
1588 EINA_LIST_FOREACH(e->grabs, l, g)
1592 g->just_added = EINA_FALSE;
1595 if (g->delete_me) continue;
1596 if (((e->modifiers.mask & g->modifiers) ||
1597 (g->modifiers == e->modifiers.mask)) &&
1598 (!((e->modifiers.mask & g->not_modifiers) ||
1599 (g->not_modifiers == ~e->modifiers.mask))) &&
1600 (!strcmp(keyname, g->keyname)))
1602 if (e->events_frozen <= 0 &&
1603 !evas_event_freezes_through(g->object))
1604 evas_object_event_callback_call(g->object,
1605 EVAS_CALLBACK_KEY_UP, &ev, event_id);
1606 if (g->exclusive) exclusive = EINA_TRUE;
1608 if (e->delete_me) break;
1611 if (e->walking_grabs <= 0)
1613 while (e->delete_grabs > 0)
1615 Eina_List *ll, *l_next;
1619 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1622 evas_key_grab_free(gr->object, gr->keyname,
1623 gr->modifiers, gr->not_modifiers);
1628 if ((e->focused) && (!exclusive))
1630 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1631 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP,
1634 _evas_post_event_callback_call(e);
1639 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1641 Eina_List *l, *copy;
1646 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1650 if (e->events_frozen > 0) return;
1651 e->last_timestamp = timestamp;
1653 _evas_object_event_new();
1655 event_id = _evas_event_counter;
1657 ev.data = (void *)data;
1658 ev.timestamp = timestamp;
1659 ev.event_flags = e->default_event_flags;
1662 copy = evas_event_list_copy(e->pointer.object.in);
1663 EINA_LIST_FOREACH(copy, l, obj)
1665 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
1666 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev, event_id);
1667 if (e->delete_me) break;
1669 if (copy) copy = eina_list_free(copy);
1670 _evas_post_event_callback_call(e);
1672 _evas_object_event_new();
1676 evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze)
1678 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1683 if (obj->freeze_events == freeze) return;
1684 obj->freeze_events = freeze;
1685 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE);
1689 evas_object_freeze_events_get(const Evas_Object *obj)
1691 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1694 return obj->freeze_events;
1698 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1700 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1704 if (obj->pass_events == pass) return;
1705 obj->pass_events = pass;
1706 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE);
1707 if (evas_object_is_in_output_rect(obj,
1708 obj->layer->evas->pointer.x,
1709 obj->layer->evas->pointer.y, 1, 1) &&
1710 ((!obj->precise_is_inside) ||
1711 (evas_object_is_inside(obj,
1712 obj->layer->evas->pointer.x,
1713 obj->layer->evas->pointer.y))))
1714 evas_event_feed_mouse_move(obj->layer->evas,
1715 obj->layer->evas->pointer.x,
1716 obj->layer->evas->pointer.y,
1717 obj->layer->evas->last_timestamp,
1722 evas_object_pass_events_get(const Evas_Object *obj)
1724 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1727 return obj->pass_events;
1731 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1733 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1737 if (obj->repeat_events == repeat) return;
1738 obj->repeat_events = repeat;
1739 if (evas_object_is_in_output_rect(obj,
1740 obj->layer->evas->pointer.x,
1741 obj->layer->evas->pointer.y, 1, 1) &&
1742 ((!obj->precise_is_inside) ||
1743 (evas_object_is_inside(obj,
1744 obj->layer->evas->pointer.x,
1745 obj->layer->evas->pointer.y))))
1746 evas_event_feed_mouse_move(obj->layer->evas,
1747 obj->layer->evas->pointer.x,
1748 obj->layer->evas->pointer.y,
1749 obj->layer->evas->last_timestamp,
1754 evas_object_repeat_events_get(const Evas_Object *obj)
1756 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1759 return obj->repeat_events;
1763 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1765 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1768 obj->no_propagate = !prop;
1772 evas_object_propagate_events_get(const Evas_Object *obj)
1774 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1777 return !(obj->no_propagate);
1781 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1783 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1786 obj->pointer_mode = setting;
1789 EAPI Evas_Object_Pointer_Mode
1790 evas_object_pointer_mode_get(const Evas_Object *obj)
1792 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1793 return EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
1795 return obj->pointer_mode;
1799 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1801 if (!event_copy) return;
1805 case EVAS_CALLBACK_MOUSE_IN:
1807 Evas_Event_Mouse_In *ev = event_copy;
1808 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1811 case EVAS_CALLBACK_MOUSE_OUT:
1813 Evas_Event_Mouse_Out *ev = event_copy;
1814 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1817 case EVAS_CALLBACK_MOUSE_DOWN:
1819 Evas_Event_Mouse_Down *ev = event_copy;
1820 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1823 case EVAS_CALLBACK_MOUSE_UP:
1825 Evas_Event_Mouse_Up *ev = event_copy;
1826 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1829 case EVAS_CALLBACK_MOUSE_MOVE:
1831 Evas_Event_Mouse_Move *ev = event_copy;
1832 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1835 case EVAS_CALLBACK_MOUSE_WHEEL:
1837 Evas_Event_Mouse_Wheel *ev = event_copy;
1838 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1841 case EVAS_CALLBACK_MULTI_DOWN:
1843 Evas_Event_Multi_Down *ev = event_copy;
1844 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);
1847 case EVAS_CALLBACK_MULTI_UP:
1849 Evas_Event_Multi_Up *ev = event_copy;
1850 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);
1853 case EVAS_CALLBACK_MULTI_MOVE:
1855 Evas_Event_Multi_Move *ev = event_copy;
1856 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);
1859 case EVAS_CALLBACK_KEY_DOWN:
1861 Evas_Event_Key_Down *ev = event_copy;
1862 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1865 case EVAS_CALLBACK_KEY_UP:
1867 Evas_Event_Key_Up *ev = event_copy;
1868 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1871 default: /* All non-input events are not handeled */
1877 evas_event_down_count_get(const Evas *e)
1879 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1882 return e->pointer.downs;