1 #include "evas_common.h"
2 #include "evas_private.h"
5 _evas_event_havemap_adjust(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Eina_Bool mouse_grabbed)
8 _evas_event_havemap_adjust(obj->smart.parent, x, y, mouse_grabbed);
10 if ((!obj->cur.usemap) || (!obj->cur.map) || (!obj->cur.map->count == 4))
13 evas_map_coords_get(obj->cur.map, *x, *y, x, y, mouse_grabbed);
14 *x += obj->cur.geometry.x;
15 *y += obj->cur.geometry.y;
19 _evas_event_object_list_in_get(Evas *e, Eina_List *in,
20 const Eina_Inlist *list, Evas_Object *stop,
21 int x, int y, int *no_rep)
25 EINA_INLIST_REVERSE_FOREACH(list, obj)
32 if (evas_event_passes_through(obj)) continue;
33 if ((obj->cur.visible) && (obj->delete_me == 0) &&
34 (!obj->clip.clipees) &&
35 (evas_object_clippers_is_visible(obj)))
42 if (((obj->cur.usemap) && (obj->cur.map) && (obj->cur.map->count == 4)))
44 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
47 if (!evas_map_coords_get(obj->cur.map, x, y,
49 &(obj->cur.map->my), 0))
55 in = _evas_event_object_list_in_get
57 evas_object_smart_members_get_direct(obj),
59 obj->cur.geometry.x + obj->cur.map->mx,
60 obj->cur.geometry.y + obj->cur.map->my, &norep);
66 in = _evas_event_object_list_in_get
67 (e, in, evas_object_smart_members_get_direct(obj),
78 int inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
80 if (((obj->cur.usemap) && (obj->cur.map) && (obj->cur.map->count == 4)))
82 if ((inside) && (!evas_map_coords_get(obj->cur.map, x, y,
84 &(obj->cur.map->my), 0)))
90 if (inside && ((!obj->precise_is_inside) ||
91 (evas_object_is_inside(obj, x, y))))
93 if (!evas_event_freezes_through(obj))
94 in = eina_list_append(in, obj);
95 if (!obj->repeat_events)
109 evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
112 Eina_List *in = NULL;
114 if (!e->layers) return NULL;
115 EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
118 in = _evas_event_object_list_in_get(e, in,
119 EINA_INLIST_GET(lay->objects),
121 if (norep) return in;
127 evas_event_list_copy(Eina_List *list)
129 Eina_List *l, *new_l = NULL;
132 EINA_LIST_FOREACH(list, l, data)
133 new_l = eina_list_append(new_l, data);
136 /* public functions */
139 evas_event_freeze(Evas *e)
141 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
148 evas_event_thaw(Evas *e)
150 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
154 if (e->events_frozen == 0)
158 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
162 EINA_INLIST_FOREACH(lay->objects, obj)
164 evas_object_clip_recalc(obj);
165 evas_object_recalc_clippees(obj);
169 if (e->events_frozen < 0)
170 evas_debug_generic(" Thaw of events when already thawed!!!\n");
174 evas_event_freeze_get(const Evas *e)
176 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
179 return e->events_frozen;
183 evas_event_thaw_eval(Evas *e)
185 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
188 if (e->events_frozen != 0) return;
190 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y,
191 e->last_timestamp, NULL);
195 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
198 Evas_Event_Mouse_Down ev;
201 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
205 if ((b < 1) || (b > 32)) return;
207 e->pointer.button |= (1 << (b - 1));
209 if (e->events_frozen > 0) return;
210 e->last_timestamp = timestamp;
212 _evas_object_event_new();
215 ev.output.x = e->pointer.x;
216 ev.output.y = e->pointer.y;
217 ev.canvas.x = e->pointer.x;
218 ev.canvas.y = e->pointer.y;
219 ev.data = (void *)data;
220 ev.modifiers = &(e->modifiers);
221 ev.locks = &(e->locks);
223 ev.timestamp = timestamp;
224 ev.event_flags = EVAS_EVENT_FLAG_NONE;
227 /* append new touch point to the touch point list */
228 _evas_touch_point_append(e, 0, e->pointer.x, e->pointer.y);
229 /* If this is the first finger down, i.e no other fingers pressed,
230 * get a new event list, otherwise, keep the current grabbed list. */
231 if (e->pointer.mouse_grabbed == 0)
233 Eina_List *ins = evas_event_objects_event_list(e,
237 /* free our old list of ins */
238 e->pointer.object.in = eina_list_free(e->pointer.object.in);
239 /* and set up the new one */
240 e->pointer.object.in = ins;
242 copy = evas_event_list_copy(e->pointer.object.in);
243 EINA_LIST_FOREACH(copy, l, obj)
245 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
247 obj->mouse_grabbed++;
248 e->pointer.mouse_grabbed++;
251 EINA_LIST_FOREACH(copy, l, obj)
253 if (obj->delete_me) continue;
254 ev.canvas.x = e->pointer.x;
255 ev.canvas.y = e->pointer.y;
256 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
258 if (e->events_frozen <= 0)
259 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
260 if (e->delete_me) break;
262 if (copy) eina_list_free(copy);
263 e->last_mouse_down_counter++;
264 _evas_post_event_callback_call(e);
265 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
266 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
271 _post_up_handle(Evas *e, unsigned int timestamp, const void *data)
273 Eina_List *l, *copy, *ins, *ll;
274 Evas_Event_Mouse_Out ev;
278 _evas_object_event_new();
280 ev.buttons = e->pointer.button;
281 ev.output.x = e->pointer.x;
282 ev.output.y = e->pointer.y;
283 ev.canvas.x = e->pointer.x;
284 ev.canvas.y = e->pointer.y;
285 ev.data = (void *)data;
286 ev.modifiers = &(e->modifiers);
287 ev.locks = &(e->locks);
288 ev.timestamp = timestamp;
289 ev.event_flags = EVAS_EVENT_FLAG_NONE;
291 /* get new list of ins */
292 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
293 /* go thru old list of in objects */
294 copy = evas_event_list_copy(e->pointer.object.in);
295 EINA_LIST_FOREACH(copy, ll, obj)
297 ev.canvas.x = e->pointer.x;
298 ev.canvas.y = e->pointer.y;
299 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
300 if ((!eina_list_data_find(ins, obj)) ||
301 (!e->pointer.inside))
306 if (e->events_frozen <= 0)
307 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
310 if (e->delete_me) break;
312 _evas_post_event_callback_call(e);
314 if (copy) copy = eina_list_free(copy);
315 if (e->pointer.inside)
317 Evas_Event_Mouse_In ev_in;
318 Evas_Object *obj_itr;
320 _evas_object_event_new();
322 ev_in.buttons = e->pointer.button;
323 ev_in.output.x = e->pointer.x;
324 ev_in.output.y = e->pointer.y;
325 ev_in.canvas.x = e->pointer.x;
326 ev_in.canvas.y = e->pointer.y;
327 ev_in.data = (void *)data;
328 ev_in.modifiers = &(e->modifiers);
329 ev_in.locks = &(e->locks);
330 ev_in.timestamp = timestamp;
331 ev_in.event_flags = EVAS_EVENT_FLAG_NONE;
333 EINA_LIST_FOREACH(ins, l, obj_itr)
335 ev_in.canvas.x = e->pointer.x;
336 ev_in.canvas.y = e->pointer.y;
337 _evas_event_havemap_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y, obj_itr->mouse_grabbed);
338 if (!eina_list_data_find(e->pointer.object.in, obj_itr))
340 if (!obj_itr->mouse_in)
342 obj_itr->mouse_in = 1;
343 if (e->events_frozen <= 0)
344 evas_object_event_callback_call(obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in);
347 if (e->delete_me) break;
350 _evas_post_event_callback_call(e);
354 ins = eina_list_free(ins);
357 if (e->pointer.mouse_grabbed == 0)
359 /* free our old list of ins */
360 eina_list_free(e->pointer.object.in);
361 /* and set up the new one */
362 e->pointer.object.in = ins;
366 /* free our cur ins */
369 if (e->pointer.inside)
370 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
375 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
379 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
383 if ((b < 1) || (b > 32)) return;
385 e->pointer.button &= ~(1 << (b - 1));
387 if (e->events_frozen > 0) return;
388 e->last_timestamp = timestamp;
391 Evas_Event_Mouse_Up ev;
394 _evas_object_event_new();
397 ev.output.x = e->pointer.x;
398 ev.output.y = e->pointer.y;
399 ev.canvas.x = e->pointer.x;
400 ev.canvas.y = e->pointer.y;
401 ev.data = (void *)data;
402 ev.modifiers = &(e->modifiers);
403 ev.locks = &(e->locks);
405 ev.timestamp = timestamp;
406 ev.event_flags = EVAS_EVENT_FLAG_NONE;
409 /* update released touch point */
410 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
411 copy = evas_event_list_copy(e->pointer.object.in);
412 EINA_LIST_FOREACH(copy, l, obj)
414 ev.canvas.x = e->pointer.x;
415 ev.canvas.y = e->pointer.y;
416 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
417 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
418 (obj->mouse_grabbed > 0))
420 obj->mouse_grabbed--;
421 e->pointer.mouse_grabbed--;
425 if (e->events_frozen <= 0)
426 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
428 if (e->delete_me) break;
430 if (copy) copy = eina_list_free(copy);
431 e->last_mouse_up_counter++;
432 _evas_post_event_callback_call(e);
435 if (e->pointer.mouse_grabbed == 0)
437 _post_up_handle(e, timestamp, data);
440 if (e->pointer.mouse_grabbed < 0)
442 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
443 e->pointer.mouse_grabbed);
445 /* remove released touch point from the touch point list */
446 _evas_touch_point_remove(e, 0);
452 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
456 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
460 if (e->events_frozen > 0) return;
463 for (i = 0; i < 32; i++)
465 if ((e->pointer.button & (1 << i)))
466 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
472 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
475 Evas_Event_Mouse_Wheel ev;
478 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
482 if (e->events_frozen > 0) return;
483 e->last_timestamp = timestamp;
485 _evas_object_event_new();
487 ev.direction = direction;
489 ev.output.x = e->pointer.x;
490 ev.output.y = e->pointer.y;
491 ev.canvas.x = e->pointer.x;
492 ev.canvas.y = e->pointer.y;
493 ev.data = (void *) data;
494 ev.modifiers = &(e->modifiers);
495 ev.locks = &(e->locks);
496 ev.timestamp = timestamp;
497 ev.event_flags = EVAS_EVENT_FLAG_NONE;
500 copy = evas_event_list_copy(e->pointer.object.in);
502 EINA_LIST_FOREACH(copy, l, obj)
504 ev.canvas.x = e->pointer.x;
505 ev.canvas.y = e->pointer.y;
506 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
507 if (e->events_frozen <= 0)
508 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev);
509 if (e->delete_me) break;
511 if (copy) copy = eina_list_free(copy);
512 _evas_post_event_callback_call(e);
518 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
521 //// Evas_Coord pcx, pcy;
523 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
529 //// pcx = e->pointer.canvas_x;
530 //// pcy = e->pointer.canvas_y;
532 if (e->events_frozen > 0) return;
533 e->last_timestamp = timestamp;
537 //// e->pointer.canvas_x = x;
538 //// e->pointer.canvas_y = y;
539 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
540 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
541 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
543 /* update moved touch point */
544 if ((px != x) || (py != y))
545 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
546 /* if our mouse button is grabbed to any objects */
547 if (e->pointer.mouse_grabbed > 0)
549 /* go thru old list of in objects */
550 Eina_List *outs = NULL;
554 Evas_Event_Mouse_Move ev;
557 _evas_object_event_new();
559 ev.buttons = e->pointer.button;
560 ev.cur.output.x = e->pointer.x;
561 ev.cur.output.y = e->pointer.y;
562 ev.cur.canvas.x = e->pointer.x;
563 ev.cur.canvas.y = e->pointer.y;
564 ev.prev.output.x = px;
565 ev.prev.output.y = py;
566 ev.prev.canvas.x = px;
567 ev.prev.canvas.y = py;
568 ev.data = (void *)data;
569 ev.modifiers = &(e->modifiers);
570 ev.locks = &(e->locks);
571 ev.timestamp = timestamp;
572 ev.event_flags = EVAS_EVENT_FLAG_NONE;
573 copy = evas_event_list_copy(e->pointer.object.in);
574 EINA_LIST_FOREACH(copy, l, obj)
576 ev.cur.canvas.x = e->pointer.x;
577 ev.cur.canvas.y = e->pointer.y;
578 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
579 if (((evas_object_clippers_is_visible(obj)) ||
580 (obj->mouse_grabbed)) &&
581 (!evas_event_passes_through(obj)) &&
582 (!evas_event_freezes_through(obj)) &&
583 (!obj->clip.clipees))
585 if ((px != x) || (py != y))
587 if (e->events_frozen <= 0)
588 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
592 outs = eina_list_append(outs, obj);
593 if (e->delete_me) break;
595 _evas_post_event_callback_call(e);
598 Evas_Event_Mouse_Out ev;
600 _evas_object_event_new();
602 ev.buttons = e->pointer.button;
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 = EVAS_EVENT_FLAG_NONE;
613 if (copy) eina_list_free(copy);
619 outs = eina_list_remove(outs, obj);
620 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
622 ev.canvas.x = e->pointer.x;
623 ev.canvas.y = e->pointer.y;
624 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
625 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
631 if (e->events_frozen <= 0)
632 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
637 _evas_post_event_callback_call(e);
644 Evas_Event_Mouse_Move ev;
645 Evas_Event_Mouse_Out ev2;
646 Evas_Event_Mouse_In ev3;
649 _evas_object_event_new();
651 ev.buttons = e->pointer.button;
652 ev.cur.output.x = e->pointer.x;
653 ev.cur.output.y = e->pointer.y;
654 ev.cur.canvas.x = e->pointer.x;
655 ev.cur.canvas.y = e->pointer.y;
656 ev.prev.output.x = px;
657 ev.prev.output.y = py;
658 ev.prev.canvas.x = px;
659 ev.prev.canvas.y = py;
660 ev.data = (void *)data;
661 ev.modifiers = &(e->modifiers);
662 ev.locks = &(e->locks);
663 ev.timestamp = timestamp;
664 ev.event_flags = EVAS_EVENT_FLAG_NONE;
666 ev2.buttons = e->pointer.button;
667 ev2.output.x = e->pointer.x;
668 ev2.output.y = e->pointer.y;
669 ev2.canvas.x = e->pointer.x;
670 ev2.canvas.y = e->pointer.y;
671 ev2.data = (void *)data;
672 ev2.modifiers = &(e->modifiers);
673 ev2.locks = &(e->locks);
674 ev2.timestamp = timestamp;
675 ev2.event_flags = EVAS_EVENT_FLAG_NONE;
677 ev3.buttons = e->pointer.button;
678 ev3.output.x = e->pointer.x;
679 ev3.output.y = e->pointer.y;
680 ev3.canvas.x = e->pointer.x;
681 ev3.canvas.y = e->pointer.y;
682 ev3.data = (void *)data;
683 ev3.modifiers = &(e->modifiers);
684 ev3.locks = &(e->locks);
685 ev3.timestamp = timestamp;
686 ev3.event_flags = EVAS_EVENT_FLAG_NONE;
688 /* get all new in objects */
689 ins = evas_event_objects_event_list(e, NULL, x, y);
690 /* go thru old list of in objects */
691 copy = evas_event_list_copy(e->pointer.object.in);
692 EINA_LIST_FOREACH(copy, l, obj)
694 /* if its under the pointer and its visible and its in the new */
696 // FIXME: i don't think we need this
697 // evas_object_clip_recalc(obj);
698 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
699 ((evas_object_clippers_is_visible(obj)) ||
700 (obj->mouse_grabbed)) &&
701 (eina_list_data_find(ins, obj)) &&
702 (!evas_event_passes_through(obj)) &&
703 (!evas_event_freezes_through(obj)) &&
704 (!obj->clip.clipees) &&
705 ((!obj->precise_is_inside) ||
706 (evas_object_is_inside(obj, x, y))))
708 if ((px != x) || (py != y))
710 ev.cur.canvas.x = e->pointer.x;
711 ev.cur.canvas.y = e->pointer.y;
712 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
713 if (e->events_frozen <= 0)
714 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
717 /* otherwise it has left the object */
723 ev2.canvas.x = e->pointer.x;
724 ev2.canvas.y = e->pointer.y;
725 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
726 if (e->events_frozen <= 0)
727 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2);
730 if (e->delete_me) break;
732 _evas_post_event_callback_call(e);
734 _evas_object_event_new();
736 if (copy) copy = eina_list_free(copy);
737 /* go thru our current list of ins */
738 EINA_LIST_FOREACH(ins, l, obj)
740 ev3.canvas.x = e->pointer.x;
741 ev3.canvas.y = e->pointer.y;
742 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
743 /* if its not in the old list of ins send an enter event */
744 if (!eina_list_data_find(e->pointer.object.in, obj))
749 if (e->events_frozen <= 0)
750 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3);
753 if (e->delete_me) break;
755 if (e->pointer.mouse_grabbed == 0)
757 /* free our old list of ins */
758 eina_list_free(e->pointer.object.in);
759 /* and set up the new one */
760 e->pointer.object.in = ins;
764 /* free our cur ins */
767 _evas_post_event_callback_call(e);
773 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
777 Evas_Event_Mouse_In ev;
780 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
783 e->pointer.inside = 1;
785 if (e->events_frozen > 0) return;
786 e->last_timestamp = timestamp;
788 if (e->pointer.mouse_grabbed != 0) return;
790 _evas_object_event_new();
792 ev.buttons = e->pointer.button;
793 ev.output.x = e->pointer.x;
794 ev.output.y = e->pointer.y;
795 ev.canvas.x = e->pointer.x;
796 ev.canvas.y = e->pointer.y;
797 ev.data = (void *)data;
798 ev.modifiers = &(e->modifiers);
799 ev.locks = &(e->locks);
800 ev.timestamp = timestamp;
801 ev.event_flags = EVAS_EVENT_FLAG_NONE;
804 /* get new list of ins */
805 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
806 EINA_LIST_FOREACH(ins, l, obj)
808 ev.canvas.x = e->pointer.x;
809 ev.canvas.y = e->pointer.y;
810 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
811 if (!eina_list_data_find(e->pointer.object.in, obj))
816 if (e->events_frozen <= 0)
817 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
820 if (e->delete_me) break;
822 /* free our old list of ins */
823 e->pointer.object.in = eina_list_free(e->pointer.object.in);
824 /* and set up the new one */
825 e->pointer.object.in = ins;
826 _evas_post_event_callback_call(e);
827 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
832 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
834 Evas_Event_Mouse_Out ev;
836 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
839 e->pointer.inside = 0;
841 if (e->events_frozen > 0) return;
842 e->last_timestamp = timestamp;
844 _evas_object_event_new();
846 ev.buttons = e->pointer.button;
847 ev.output.x = e->pointer.x;
848 ev.output.y = e->pointer.y;
849 ev.canvas.x = e->pointer.x;
850 ev.canvas.y = e->pointer.y;
851 ev.data = (void *)data;
852 ev.modifiers = &(e->modifiers);
853 ev.locks = &(e->locks);
854 ev.timestamp = timestamp;
855 ev.event_flags = EVAS_EVENT_FLAG_NONE;
858 /* if our mouse button is grabbed to any objects */
859 if (e->pointer.mouse_grabbed == 0)
861 /* go thru old list of in objects */
865 copy = evas_event_list_copy(e->pointer.object.in);
866 EINA_LIST_FOREACH(copy, l, obj)
868 ev.canvas.x = e->pointer.x;
869 ev.canvas.y = e->pointer.y;
870 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
876 if (e->events_frozen <= 0)
877 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
880 if (e->delete_me) break;
882 if (copy) copy = eina_list_free(copy);
883 /* free our old list of ins */
884 e->pointer.object.in = eina_list_free(e->pointer.object.in);
885 _evas_post_event_callback_call(e);
891 evas_event_feed_multi_down(Evas *e,
893 double rad, double radx, double rady,
894 double pres, double ang,
895 double fx, double fy,
896 Evas_Button_Flags flags, unsigned int timestamp,
900 Evas_Event_Multi_Down ev;
903 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
907 if (e->events_frozen > 0) return;
908 e->last_timestamp = timestamp;
910 _evas_object_event_new();
924 ev.data = (void *)data;
925 ev.modifiers = &(e->modifiers);
926 ev.locks = &(e->locks);
928 ev.timestamp = timestamp;
929 ev.event_flags = EVAS_EVENT_FLAG_NONE;
932 /* append new touch point to the touch point list */
933 _evas_touch_point_append(e, d, x, y);
934 copy = evas_event_list_copy(e->pointer.object.in);
935 EINA_LIST_FOREACH(copy, l, obj)
937 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
939 obj->mouse_grabbed++;
940 e->pointer.mouse_grabbed++;
943 EINA_LIST_FOREACH(copy, l, obj)
949 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
950 if (x != ev.canvas.x)
951 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
952 if (y != ev.canvas.y)
953 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
954 if (e->events_frozen <= 0)
955 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev);
956 if (e->delete_me) break;
958 if (copy) eina_list_free(copy);
959 _evas_post_event_callback_call(e);
960 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
961 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
966 evas_event_feed_multi_up(Evas *e,
968 double rad, double radx, double rady,
969 double pres, double ang,
970 double fx, double fy,
971 Evas_Button_Flags flags, unsigned int timestamp,
975 Evas_Event_Multi_Up ev;
978 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
982 if (e->events_frozen > 0) return;
983 e->last_timestamp = timestamp;
985 _evas_object_event_new();
999 ev.data = (void *)data;
1000 ev.modifiers = &(e->modifiers);
1001 ev.locks = &(e->locks);
1003 ev.timestamp = timestamp;
1004 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1007 /* update released touch point */
1008 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
1009 copy = evas_event_list_copy(e->pointer.object.in);
1010 EINA_LIST_FOREACH(copy, l, obj)
1014 ev.canvas.xsub = fx;
1015 ev.canvas.ysub = fy;
1016 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1017 if (x != ev.canvas.x)
1018 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1019 if (y != ev.canvas.y)
1020 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1021 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1022 (obj->mouse_grabbed > 0))
1024 obj->mouse_grabbed--;
1025 e->pointer.mouse_grabbed--;
1027 if (e->events_frozen <= 0)
1028 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev);
1029 if (e->delete_me) break;
1031 if (copy) copy = eina_list_free(copy);
1032 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1033 _evas_post_event_callback_call(e);
1034 /* remove released touch point from the touch point list */
1035 _evas_touch_point_remove(e, d);
1040 evas_event_feed_multi_move(Evas *e,
1041 int d, int x, int y,
1042 double rad, double radx, double rady,
1043 double pres, double ang,
1044 double fx, double fy,
1045 unsigned int timestamp, const void *data)
1047 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1051 if (e->events_frozen > 0) return;
1052 e->last_timestamp = timestamp;
1054 if (!e->pointer.inside) return;
1057 /* update moved touch point */
1058 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
1059 /* if our mouse button is grabbed to any objects */
1060 if (e->pointer.mouse_grabbed > 0)
1062 /* go thru old list of in objects */
1063 Eina_List *l, *copy;
1064 Evas_Event_Multi_Move ev;
1067 _evas_object_event_new();
1070 ev.cur.output.x = x;
1071 ev.cur.output.y = y;
1072 ev.cur.canvas.x = x;
1073 ev.cur.canvas.y = y;
1079 ev.cur.canvas.xsub = fx;
1080 ev.cur.canvas.ysub = fy;
1081 ev.data = (void *)data;
1082 ev.modifiers = &(e->modifiers);
1083 ev.locks = &(e->locks);
1084 ev.timestamp = timestamp;
1085 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1087 copy = evas_event_list_copy(e->pointer.object.in);
1088 EINA_LIST_FOREACH(copy, l, obj)
1090 if (((evas_object_clippers_is_visible(obj)) ||
1091 (obj->mouse_grabbed)) &&
1092 (!evas_event_passes_through(obj)) &&
1093 (!evas_event_freezes_through(obj)) &&
1094 (!obj->clip.clipees))
1096 ev.cur.canvas.x = x;
1097 ev.cur.canvas.y = y;
1098 ev.cur.canvas.xsub = fx;
1099 ev.cur.canvas.ysub = fy;
1100 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1101 if (x != ev.cur.canvas.x)
1102 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1103 if (y != ev.cur.canvas.y)
1104 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1105 if (e->events_frozen <= 0)
1106 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
1108 if (e->delete_me) break;
1110 _evas_post_event_callback_call(e);
1115 Eina_List *l, *copy;
1116 Evas_Event_Multi_Move ev;
1119 _evas_object_event_new();
1122 ev.cur.output.x = x;
1123 ev.cur.output.y = y;
1124 ev.cur.canvas.x = x;
1125 ev.cur.canvas.y = y;
1131 ev.cur.canvas.xsub = fx;
1132 ev.cur.canvas.ysub = fy;
1133 ev.data = (void *)data;
1134 ev.modifiers = &(e->modifiers);
1135 ev.locks = &(e->locks);
1136 ev.timestamp = timestamp;
1137 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1139 /* get all new in objects */
1140 ins = evas_event_objects_event_list(e, NULL, x, y);
1141 /* go thru old list of in objects */
1142 copy = evas_event_list_copy(e->pointer.object.in);
1143 EINA_LIST_FOREACH(copy, l, obj)
1145 /* if its under the pointer and its visible and its in the new */
1147 // FIXME: i don't think we need this
1148 // evas_object_clip_recalc(obj);
1149 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1150 ((evas_object_clippers_is_visible(obj)) ||
1151 (obj->mouse_grabbed)) &&
1152 (eina_list_data_find(ins, obj)) &&
1153 (!evas_event_passes_through(obj)) &&
1154 (!evas_event_freezes_through(obj)) &&
1155 (!obj->clip.clipees) &&
1156 ((!obj->precise_is_inside) ||
1157 (evas_object_is_inside(obj, x, y))))
1159 ev.cur.canvas.x = x;
1160 ev.cur.canvas.y = y;
1161 ev.cur.canvas.xsub = fx;
1162 ev.cur.canvas.ysub = fy;
1163 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1164 if (x != ev.cur.canvas.x)
1165 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1166 if (y != ev.cur.canvas.y)
1167 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1168 if (e->events_frozen <= 0)
1169 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
1171 if (e->delete_me) break;
1173 if (copy) copy = eina_list_free(copy);
1174 if (e->pointer.mouse_grabbed == 0)
1176 /* free our old list of ins */
1177 eina_list_free(e->pointer.object.in);
1178 /* and set up the new one */
1179 e->pointer.object.in = ins;
1183 /* free our cur ins */
1184 eina_list_free(ins);
1186 _evas_post_event_callback_call(e);
1192 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)
1194 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1197 if (!keyname) return;
1198 if (e->events_frozen > 0) return;
1199 e->last_timestamp = timestamp;
1202 Evas_Event_Key_Down ev;
1205 _evas_object_event_new();
1208 ev.keyname = (char *)keyname;
1209 ev.data = (void *)data;
1210 ev.modifiers = &(e->modifiers);
1211 ev.locks = &(e->locks);
1214 ev.compose = compose;
1215 ev.timestamp = timestamp;
1216 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1223 EINA_LIST_FOREACH(e->grabs, l, g)
1230 if (g->delete_me) continue;
1231 if (((e->modifiers.mask & g->modifiers) ||
1232 (g->modifiers == e->modifiers.mask)) &&
1233 (!strcmp(keyname, g->keyname)))
1235 if (!(e->modifiers.mask & g->not_modifiers))
1237 if (e->events_frozen <= 0)
1238 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_DOWN, &ev);
1239 if (g->exclusive) exclusive = 1;
1242 if (e->delete_me) break;
1245 if (e->walking_grabs <= 0)
1247 while (e->delete_grabs > 0)
1250 for (l = e->grabs; l;)
1252 g = eina_list_data_get(l);
1253 l = eina_list_next(l);
1255 evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
1260 if ((e->focused) && (!exclusive))
1262 if (e->events_frozen <= 0)
1263 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, &ev);
1265 _evas_post_event_callback_call(e);
1271 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)
1273 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1276 if (!keyname) return;
1277 if (e->events_frozen > 0) return;
1278 e->last_timestamp = timestamp;
1281 Evas_Event_Key_Up ev;
1284 _evas_object_event_new();
1287 ev.keyname = (char *)keyname;
1288 ev.data = (void *)data;
1289 ev.modifiers = &(e->modifiers);
1290 ev.locks = &(e->locks);
1293 ev.compose = compose;
1294 ev.timestamp = timestamp;
1295 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1302 EINA_LIST_FOREACH(e->grabs, l, g)
1309 if (g->delete_me) continue;
1310 if (((e->modifiers.mask & g->modifiers) ||
1311 (g->modifiers == e->modifiers.mask)) &&
1312 (!((e->modifiers.mask & g->not_modifiers) ||
1313 (g->not_modifiers == ~e->modifiers.mask))) &&
1314 (!strcmp(keyname, g->keyname)))
1316 if (e->events_frozen <= 0)
1317 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_UP, &ev);
1318 if (g->exclusive) exclusive = 1;
1320 if (e->delete_me) break;
1323 if (e->walking_grabs <= 0)
1325 while (e->delete_grabs > 0)
1327 Eina_List *ll, *l_next;
1331 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1334 evas_key_grab_free(gr->object, gr->keyname, gr->modifiers, gr->not_modifiers);
1339 if ((e->focused) && (!exclusive))
1341 if (e->events_frozen <= 0)
1342 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev);
1344 _evas_post_event_callback_call(e);
1350 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1352 Eina_List *l, *copy;
1356 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1360 if (e->events_frozen > 0) return;
1361 e->last_timestamp = timestamp;
1363 _evas_object_event_new();
1366 ev.data = (void *)data;
1367 ev.timestamp = timestamp;
1368 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1371 copy = evas_event_list_copy(e->pointer.object.in);
1372 EINA_LIST_FOREACH(copy, l, obj)
1374 if (e->events_frozen <= 0)
1375 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev);
1376 if (e->delete_me) break;
1378 if (copy) copy = eina_list_free(copy);
1379 _evas_post_event_callback_call(e);
1381 _evas_object_event_new();
1385 evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze)
1387 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1392 if (obj->freeze_events == freeze) return;
1393 obj->freeze_events = freeze;
1394 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE);
1395 if (evas_object_is_in_output_rect(obj,
1396 obj->layer->evas->pointer.x,
1397 obj->layer->evas->pointer.y, 1, 1) &&
1398 ((!obj->precise_is_inside) ||
1399 (evas_object_is_inside(obj,
1400 obj->layer->evas->pointer.x,
1401 obj->layer->evas->pointer.y))))
1402 evas_event_feed_mouse_move(obj->layer->evas,
1403 obj->layer->evas->pointer.x,
1404 obj->layer->evas->pointer.y,
1405 obj->layer->evas->last_timestamp,
1410 evas_object_freeze_events_get(const Evas_Object *obj)
1412 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1415 return obj->freeze_events;
1419 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1421 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1425 if (obj->pass_events == pass) return;
1426 obj->pass_events = pass;
1427 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE);
1428 if (evas_object_is_in_output_rect(obj,
1429 obj->layer->evas->pointer.x,
1430 obj->layer->evas->pointer.y, 1, 1) &&
1431 ((!obj->precise_is_inside) ||
1432 (evas_object_is_inside(obj,
1433 obj->layer->evas->pointer.x,
1434 obj->layer->evas->pointer.y))))
1435 evas_event_feed_mouse_move(obj->layer->evas,
1436 obj->layer->evas->pointer.x,
1437 obj->layer->evas->pointer.y,
1438 obj->layer->evas->last_timestamp,
1443 evas_object_pass_events_get(const Evas_Object *obj)
1445 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1448 return obj->pass_events;
1452 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1454 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1458 if (obj->repeat_events == repeat) return;
1459 obj->repeat_events = repeat;
1460 if (evas_object_is_in_output_rect(obj,
1461 obj->layer->evas->pointer.x,
1462 obj->layer->evas->pointer.y, 1, 1) &&
1463 ((!obj->precise_is_inside) ||
1464 (evas_object_is_inside(obj,
1465 obj->layer->evas->pointer.x,
1466 obj->layer->evas->pointer.y))))
1467 evas_event_feed_mouse_move(obj->layer->evas,
1468 obj->layer->evas->pointer.x,
1469 obj->layer->evas->pointer.y,
1470 obj->layer->evas->last_timestamp,
1475 evas_object_repeat_events_get(const Evas_Object *obj)
1477 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1480 return obj->repeat_events;
1484 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1486 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1489 obj->no_propagate = !prop;
1493 evas_object_propagate_events_get(const Evas_Object *obj)
1495 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1498 return !(obj->no_propagate);
1502 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1504 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1507 obj->pointer_mode = setting;
1510 EAPI Evas_Object_Pointer_Mode
1511 evas_object_pointer_mode_get(const Evas_Object *obj)
1513 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1516 return obj->pointer_mode;
1520 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1524 case EVAS_CALLBACK_MOUSE_IN:
1526 Evas_Event_Mouse_In *ev = event_copy;
1527 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1530 case EVAS_CALLBACK_MOUSE_OUT:
1532 Evas_Event_Mouse_Out *ev = event_copy;
1533 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1536 case EVAS_CALLBACK_MOUSE_DOWN:
1538 Evas_Event_Mouse_Down *ev = event_copy;
1539 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1542 case EVAS_CALLBACK_MOUSE_UP:
1544 Evas_Event_Mouse_Up *ev = event_copy;
1545 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1548 case EVAS_CALLBACK_MOUSE_MOVE:
1550 Evas_Event_Mouse_Move *ev = event_copy;
1551 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1554 case EVAS_CALLBACK_MOUSE_WHEEL:
1556 Evas_Event_Mouse_Wheel *ev = event_copy;
1557 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1560 case EVAS_CALLBACK_MULTI_DOWN:
1562 Evas_Event_Multi_Down *ev = event_copy;
1563 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);
1566 case EVAS_CALLBACK_MULTI_UP:
1568 Evas_Event_Multi_Up *ev = event_copy;
1569 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);
1572 case EVAS_CALLBACK_MULTI_MOVE:
1574 Evas_Event_Multi_Move *ev = event_copy;
1575 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);
1578 case EVAS_CALLBACK_KEY_DOWN:
1580 Evas_Event_Key_Down *ev = event_copy;
1581 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1584 case EVAS_CALLBACK_KEY_UP:
1586 Evas_Event_Key_Up *ev = event_copy;
1587 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1590 default: /* All non-input events are not handeled */