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.map) || (!obj->cur.map->count == 4) || (!obj->cur.usemap))
15 evas_map_coords_get(obj->cur.map, *x, *y, x, y, mouse_grabbed);
16 *x += obj->cur.geometry.x;
17 *y += obj->cur.geometry.y;
22 _evas_event_object_list_in_get(Evas *e, Eina_List *in,
23 const Eina_Inlist *list, Evas_Object *stop,
24 int x, int y, int *no_rep)
28 EINA_INLIST_REVERSE_FOREACH(list, obj)
35 if (evas_event_passes_through(obj)) continue;
36 if ((obj->cur.visible) && (obj->delete_me == 0) &&
37 (!obj->clip.clipees) &&
38 (evas_object_clippers_is_visible(obj)))
46 if (((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
48 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
51 if (!evas_map_coords_get(obj->cur.map, x, y,
53 &(obj->cur.map->my), 0))
59 in = _evas_event_object_list_in_get
61 evas_object_smart_members_get_direct(obj),
63 obj->cur.geometry.x + obj->cur.map->mx,
64 obj->cur.geometry.y + obj->cur.map->my, &norep);
70 in = _evas_event_object_list_in_get
71 (e, in, evas_object_smart_members_get_direct(obj),
84 if (((obj->cur.map) && (obj->cur.map->count == 4) && (obj->cur.usemap)))
86 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
87 if ((inside) && (!evas_map_coords_get(obj->cur.map, x, y,
89 &(obj->cur.map->my), 0)))
96 inside = evas_object_is_in_output_rect(obj, x, y, 1, 1);
99 if (inside && ((!obj->precise_is_inside) ||
100 (evas_object_is_inside(obj, x, y))))
102 in = eina_list_append(in, obj);
103 if (!obj->repeat_events)
117 evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
120 Eina_List *in = NULL;
122 if (!e->layers) return NULL;
123 EINA_INLIST_REVERSE_FOREACH((EINA_INLIST_GET(e->layers)), lay)
128 in = _evas_event_object_list_in_get(e, in,
129 EINA_INLIST_GET(lay->objects),
131 if (norep) return in;
137 evas_event_list_copy(Eina_List *list)
139 Eina_List *l, *new_l = NULL;
142 EINA_LIST_FOREACH(list, l, data)
143 new_l = eina_list_append(new_l, data);
146 /* public functions */
149 evas_event_freeze(Evas *e)
151 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
158 evas_event_thaw(Evas *e)
160 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
164 if (e->events_frozen == 0)
168 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
172 EINA_INLIST_FOREACH(lay->objects, obj)
174 evas_object_clip_recalc(obj);
175 evas_object_recalc_clippees(obj);
179 if (e->events_frozen < 0)
180 evas_debug_generic(" Thaw of events when already thawed!!!\n");
184 evas_event_freeze_get(const Evas *e)
186 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
189 return e->events_frozen;
193 evas_event_thaw_eval(Evas *e)
195 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
198 if (e->events_frozen != 0) return;
200 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y,
201 e->last_timestamp, NULL);
205 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
208 Evas_Event_Mouse_Down ev;
211 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
215 if ((b < 1) || (b > 32)) return;
217 e->pointer.button |= (1 << (b - 1));
219 if (e->events_frozen > 0) return;
220 e->last_timestamp = timestamp;
222 _evas_object_event_new();
225 ev.output.x = e->pointer.x;
226 ev.output.y = e->pointer.y;
227 ev.canvas.x = e->pointer.x;
228 ev.canvas.y = e->pointer.y;
229 ev.data = (void *)data;
230 ev.modifiers = &(e->modifiers);
231 ev.locks = &(e->locks);
233 ev.timestamp = timestamp;
234 ev.event_flags = EVAS_EVENT_FLAG_NONE;
237 /* If this is the first finger down, i.e no other fingers pressed,
238 * get a new event list, otherwise, keep the current grabbed list. */
239 if (e->pointer.mouse_grabbed == 0)
242 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
243 /* free our old list of ins */
244 e->pointer.object.in = eina_list_free(e->pointer.object.in);
245 /* and set up the new one */
246 e->pointer.object.in = ins;
248 copy = evas_event_list_copy(e->pointer.object.in);
249 EINA_LIST_FOREACH(copy, l, obj)
251 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
253 obj->mouse_grabbed++;
254 e->pointer.mouse_grabbed++;
257 EINA_LIST_FOREACH(copy, l, obj)
259 if (obj->delete_me) continue;
261 ev.canvas.x = e->pointer.x;
262 ev.canvas.y = e->pointer.y;
263 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
265 if (e->events_frozen <= 0)
266 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
267 if (e->delete_me) break;
269 if (copy) eina_list_free(copy);
270 e->last_mouse_down_counter++;
271 _evas_post_event_callback_call(e);
274 /* process mouse down for touch */
275 _evas_event_touch_down(e, e->pointer.x, e->pointer.y, 0, timestamp);
279 _post_up_handle(Evas *e, unsigned int timestamp, const void *data)
281 Eina_List *l, *copy, *ins, *ll;
282 Evas_Event_Mouse_Out ev;
286 _evas_object_event_new();
288 ev.buttons = e->pointer.button;
289 ev.output.x = e->pointer.x;
290 ev.output.y = e->pointer.y;
291 ev.canvas.x = e->pointer.x;
292 ev.canvas.y = e->pointer.y;
293 ev.data = (void *)data;
294 ev.modifiers = &(e->modifiers);
295 ev.locks = &(e->locks);
296 ev.timestamp = timestamp;
297 ev.event_flags = EVAS_EVENT_FLAG_NONE;
299 /* get new list of ins */
300 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
301 /* go thru old list of in objects */
302 copy = evas_event_list_copy(e->pointer.object.in);
303 EINA_LIST_FOREACH(copy, ll, obj)
305 ev.canvas.x = e->pointer.x;
306 ev.canvas.y = e->pointer.y;
307 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
308 if ((!eina_list_data_find(ins, obj)) ||
309 (!e->pointer.inside))
314 if (e->events_frozen <= 0)
315 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
318 if (e->delete_me) break;
320 _evas_post_event_callback_call(e);
322 if (copy) copy = eina_list_free(copy);
323 if (e->pointer.inside)
325 Evas_Event_Mouse_In ev_in;
326 Evas_Object *obj_itr;
328 _evas_object_event_new();
330 ev_in.buttons = e->pointer.button;
331 ev_in.output.x = e->pointer.x;
332 ev_in.output.y = e->pointer.y;
333 ev_in.canvas.x = e->pointer.x;
334 ev_in.canvas.y = e->pointer.y;
335 ev_in.data = (void *)data;
336 ev_in.modifiers = &(e->modifiers);
337 ev_in.locks = &(e->locks);
338 ev_in.timestamp = timestamp;
339 ev_in.event_flags = EVAS_EVENT_FLAG_NONE;
341 EINA_LIST_FOREACH(ins, l, obj_itr)
343 ev_in.canvas.x = e->pointer.x;
344 ev_in.canvas.y = e->pointer.y;
345 _evas_event_havemap_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y, obj_itr->mouse_grabbed);
346 if (!eina_list_data_find(e->pointer.object.in, obj_itr))
348 if (!obj_itr->mouse_in)
350 obj_itr->mouse_in = 1;
351 if (e->events_frozen <= 0)
352 evas_object_event_callback_call(obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in);
355 if (e->delete_me) break;
358 _evas_post_event_callback_call(e);
362 ins = eina_list_free(ins);
365 if (e->pointer.mouse_grabbed == 0)
367 /* free our old list of ins */
368 eina_list_free(e->pointer.object.in);
369 /* and set up the new one */
370 e->pointer.object.in = ins;
374 /* free our cur ins */
377 if (e->pointer.inside)
378 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
383 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
387 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
391 if ((b < 1) || (b > 32)) return;
393 e->pointer.button &= ~(1 << (b - 1));
395 if (e->events_frozen > 0) return;
396 e->last_timestamp = timestamp;
399 Evas_Event_Mouse_Up ev;
402 _evas_object_event_new();
405 ev.output.x = e->pointer.x;
406 ev.output.y = e->pointer.y;
407 ev.canvas.x = e->pointer.x;
408 ev.canvas.y = e->pointer.y;
409 ev.data = (void *)data;
410 ev.modifiers = &(e->modifiers);
411 ev.locks = &(e->locks);
413 ev.timestamp = timestamp;
414 ev.event_flags = EVAS_EVENT_FLAG_NONE;
417 copy = evas_event_list_copy(e->pointer.object.in);
418 EINA_LIST_FOREACH(copy, l, obj)
420 ev.canvas.x = e->pointer.x;
421 ev.canvas.y = e->pointer.y;
422 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
423 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
424 (obj->mouse_grabbed > 0))
426 obj->mouse_grabbed--;
427 e->pointer.mouse_grabbed--;
431 if (e->events_frozen <= 0)
432 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
434 if (e->delete_me) break;
436 if (copy) copy = eina_list_free(copy);
437 e->last_mouse_up_counter++;
438 _evas_post_event_callback_call(e);
441 if (e->pointer.mouse_grabbed == 0)
443 _post_up_handle(e, timestamp, data);
446 if (e->pointer.mouse_grabbed < 0)
448 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
449 e->pointer.mouse_grabbed);
451 /* don't need this anymore - havent actually triggered this for a long
452 * time and this also doesn't account for multitouch, so leave here if we
453 * ever find bugs again so we can turn it on, but otherwise.. dont use this
454 if ((e->pointer.button == 0) && (e->pointer.mouse_grabbed != 0))
456 INF("restore to 0 grabs (from %i)", e->pointer.mouse_grabbed);
457 e->pointer.mouse_grabbed = 0;
462 /* process mouse up for touch */
463 _evas_event_touch_up(e, e->pointer.x, e->pointer.y, 0, timestamp);
467 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
471 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
475 if (e->events_frozen > 0) return;
478 for (i = 0; i < 32; i++)
480 if ((e->pointer.button & (1 << i)))
481 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
487 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
490 Evas_Event_Mouse_Wheel ev;
493 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
497 if (e->events_frozen > 0) return;
498 e->last_timestamp = timestamp;
500 _evas_object_event_new();
502 ev.direction = direction;
504 ev.output.x = e->pointer.x;
505 ev.output.y = e->pointer.y;
506 ev.canvas.x = e->pointer.x;
507 ev.canvas.y = e->pointer.y;
508 ev.data = (void *) data;
509 ev.modifiers = &(e->modifiers);
510 ev.locks = &(e->locks);
511 ev.timestamp = timestamp;
512 ev.event_flags = EVAS_EVENT_FLAG_NONE;
515 copy = evas_event_list_copy(e->pointer.object.in);
517 EINA_LIST_FOREACH(copy, l, obj)
519 ev.canvas.x = e->pointer.x;
520 ev.canvas.y = e->pointer.y;
521 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
522 if (e->events_frozen <= 0)
523 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev);
524 if (e->delete_me) break;
526 if (copy) copy = eina_list_free(copy);
527 _evas_post_event_callback_call(e);
533 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
536 //// Evas_Coord pcx, pcy;
538 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
544 //// pcx = e->pointer.canvas_x;
545 //// pcy = e->pointer.canvas_y;
547 if (e->events_frozen > 0) return;
548 e->last_timestamp = timestamp;
552 //// e->pointer.canvas_x = x;
553 //// e->pointer.canvas_y = y;
554 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
555 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
556 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
558 /* if our mouse button is grabbed to any objects */
559 if (e->pointer.mouse_grabbed > 0)
561 /* go thru old list of in objects */
562 Eina_List *outs = NULL;
566 Evas_Event_Mouse_Move ev;
569 _evas_object_event_new();
571 ev.buttons = e->pointer.button;
572 ev.cur.output.x = e->pointer.x;
573 ev.cur.output.y = e->pointer.y;
574 ev.cur.canvas.x = e->pointer.x;
575 ev.cur.canvas.y = e->pointer.y;
576 ev.prev.output.x = px;
577 ev.prev.output.y = py;
578 ev.prev.canvas.x = px;
579 ev.prev.canvas.y = py;
580 ev.data = (void *)data;
581 ev.modifiers = &(e->modifiers);
582 ev.locks = &(e->locks);
583 ev.timestamp = timestamp;
584 ev.event_flags = EVAS_EVENT_FLAG_NONE;
585 copy = evas_event_list_copy(e->pointer.object.in);
586 EINA_LIST_FOREACH(copy, l, obj)
588 ev.cur.canvas.x = e->pointer.x;
589 ev.cur.canvas.y = e->pointer.y;
590 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
591 if (((evas_object_clippers_is_visible(obj)) ||
592 (obj->mouse_grabbed)) &&
593 (!evas_event_passes_through(obj)) &&
594 (!obj->clip.clipees))
596 if ((px != x) || (py != y))
598 if (e->events_frozen <= 0)
599 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
603 outs = eina_list_append(outs, obj);
604 if (e->delete_me) break;
606 _evas_post_event_callback_call(e);
609 Evas_Event_Mouse_Out ev;
611 _evas_object_event_new();
613 ev.buttons = e->pointer.button;
614 ev.output.x = e->pointer.x;
615 ev.output.y = e->pointer.y;
616 ev.canvas.x = e->pointer.x;
617 ev.canvas.y = e->pointer.y;
618 ev.data = (void *)data;
619 ev.modifiers = &(e->modifiers);
620 ev.locks = &(e->locks);
621 ev.timestamp = timestamp;
622 ev.event_flags = EVAS_EVENT_FLAG_NONE;
624 if (copy) eina_list_free(copy);
630 outs = eina_list_remove(outs, obj);
631 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
633 ev.canvas.x = e->pointer.x;
634 ev.canvas.y = e->pointer.y;
635 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
636 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
642 if (e->events_frozen <= 0)
643 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
648 _evas_post_event_callback_call(e);
655 Evas_Event_Mouse_Move ev;
656 Evas_Event_Mouse_Out ev2;
657 Evas_Event_Mouse_In ev3;
660 _evas_object_event_new();
662 ev.buttons = e->pointer.button;
663 ev.cur.output.x = e->pointer.x;
664 ev.cur.output.y = e->pointer.y;
665 ev.cur.canvas.x = e->pointer.x;
666 ev.cur.canvas.y = e->pointer.y;
667 ev.prev.output.x = px;
668 ev.prev.output.y = py;
669 ev.prev.canvas.x = px;
670 ev.prev.canvas.y = py;
671 ev.data = (void *)data;
672 ev.modifiers = &(e->modifiers);
673 ev.locks = &(e->locks);
674 ev.timestamp = timestamp;
675 ev.event_flags = EVAS_EVENT_FLAG_NONE;
677 ev2.buttons = e->pointer.button;
678 ev2.output.x = e->pointer.x;
679 ev2.output.y = e->pointer.y;
680 ev2.canvas.x = e->pointer.x;
681 ev2.canvas.y = e->pointer.y;
682 ev2.data = (void *)data;
683 ev2.modifiers = &(e->modifiers);
684 ev2.locks = &(e->locks);
685 ev2.timestamp = timestamp;
686 ev2.event_flags = EVAS_EVENT_FLAG_NONE;
688 ev3.buttons = e->pointer.button;
689 ev3.output.x = e->pointer.x;
690 ev3.output.y = e->pointer.y;
691 ev3.canvas.x = e->pointer.x;
692 ev3.canvas.y = e->pointer.y;
693 ev3.data = (void *)data;
694 ev3.modifiers = &(e->modifiers);
695 ev3.locks = &(e->locks);
696 ev3.timestamp = timestamp;
697 ev3.event_flags = EVAS_EVENT_FLAG_NONE;
699 /* get all new in objects */
700 ins = evas_event_objects_event_list(e, NULL, x, y);
701 /* go thru old list of in objects */
702 copy = evas_event_list_copy(e->pointer.object.in);
703 EINA_LIST_FOREACH(copy, l, obj)
705 /* if its under the pointer and its visible and its in the new */
707 // FIXME: i don't think we need this
708 // evas_object_clip_recalc(obj);
709 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
710 ((evas_object_clippers_is_visible(obj)) ||
711 (obj->mouse_grabbed)) &&
712 (eina_list_data_find(ins, obj)) &&
713 (!evas_event_passes_through(obj)) &&
714 (!obj->clip.clipees) &&
715 ((!obj->precise_is_inside) ||
716 (evas_object_is_inside(obj, x, y))))
718 if ((px != x) || (py != y))
720 ev.cur.canvas.x = e->pointer.x;
721 ev.cur.canvas.y = e->pointer.y;
722 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
723 if (e->events_frozen <= 0)
724 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
727 /* otherwise it has left the object */
733 ev2.canvas.x = e->pointer.x;
734 ev2.canvas.y = e->pointer.y;
735 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
736 if (e->events_frozen <= 0)
737 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2);
740 if (e->delete_me) break;
742 _evas_post_event_callback_call(e);
744 _evas_object_event_new();
746 if (copy) copy = eina_list_free(copy);
747 /* go thru our current list of ins */
748 EINA_LIST_FOREACH(ins, l, obj)
750 ev3.canvas.x = e->pointer.x;
751 ev3.canvas.y = e->pointer.y;
752 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
753 /* if its not in the old list of ins send an enter event */
754 if (!eina_list_data_find(e->pointer.object.in, obj))
759 if (e->events_frozen <= 0)
760 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3);
763 if (e->delete_me) break;
765 if (e->pointer.mouse_grabbed == 0)
767 /* free our old list of ins */
768 eina_list_free(e->pointer.object.in);
769 /* and set up the new one */
770 e->pointer.object.in = ins;
774 /* free our cur ins */
777 _evas_post_event_callback_call(e);
781 /* process mouse move for touch */
782 _evas_event_touch_move(e, e->pointer.x, e->pointer.y, 0, timestamp);
786 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
790 Evas_Event_Mouse_In ev;
793 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
796 e->pointer.inside = 1;
798 if (e->events_frozen > 0) return;
799 e->last_timestamp = timestamp;
801 if (e->pointer.mouse_grabbed != 0) return;
803 _evas_object_event_new();
805 ev.buttons = e->pointer.button;
806 ev.output.x = e->pointer.x;
807 ev.output.y = e->pointer.y;
808 ev.canvas.x = e->pointer.x;
809 ev.canvas.y = e->pointer.y;
810 ev.data = (void *)data;
811 ev.modifiers = &(e->modifiers);
812 ev.locks = &(e->locks);
813 ev.timestamp = timestamp;
814 ev.event_flags = EVAS_EVENT_FLAG_NONE;
817 /* get new list of ins */
818 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
819 EINA_LIST_FOREACH(ins, l, obj)
821 ev.canvas.x = e->pointer.x;
822 ev.canvas.y = e->pointer.y;
823 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
824 if (!eina_list_data_find(e->pointer.object.in, obj))
829 if (e->events_frozen <= 0)
830 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
833 if (e->delete_me) break;
835 /* free our old list of ins */
836 e->pointer.object.in = eina_list_free(e->pointer.object.in);
837 /* and set up the new one */
838 e->pointer.object.in = ins;
839 _evas_post_event_callback_call(e);
840 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
845 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
847 Evas_Event_Mouse_Out ev;
849 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
852 e->pointer.inside = 0;
854 if (e->events_frozen > 0) return;
855 e->last_timestamp = timestamp;
857 _evas_object_event_new();
859 ev.buttons = e->pointer.button;
860 ev.output.x = e->pointer.x;
861 ev.output.y = e->pointer.y;
862 ev.canvas.x = e->pointer.x;
863 ev.canvas.y = e->pointer.y;
864 ev.data = (void *)data;
865 ev.modifiers = &(e->modifiers);
866 ev.locks = &(e->locks);
867 ev.timestamp = timestamp;
868 ev.event_flags = EVAS_EVENT_FLAG_NONE;
871 /* if our mouse button is grabbed to any objects */
872 if (e->pointer.mouse_grabbed == 0)
874 /* go thru old list of in objects */
878 copy = evas_event_list_copy(e->pointer.object.in);
879 EINA_LIST_FOREACH(copy, l, obj)
881 ev.canvas.x = e->pointer.x;
882 ev.canvas.y = e->pointer.y;
883 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
889 if (e->events_frozen <= 0)
890 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
893 if (e->delete_me) break;
895 if (copy) copy = eina_list_free(copy);
896 /* free our old list of ins */
897 e->pointer.object.in = eina_list_free(e->pointer.object.in);
898 _evas_post_event_callback_call(e);
904 evas_event_feed_multi_down(Evas *e,
906 double rad, double radx, double rady,
907 double pres, double ang,
908 double fx, double fy,
909 Evas_Button_Flags flags, unsigned int timestamp,
913 Evas_Event_Multi_Down ev;
916 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
920 if (e->events_frozen > 0) return;
921 e->last_timestamp = timestamp;
923 _evas_object_event_new();
937 ev.data = (void *)data;
938 ev.modifiers = &(e->modifiers);
939 ev.locks = &(e->locks);
941 ev.timestamp = timestamp;
942 ev.event_flags = EVAS_EVENT_FLAG_NONE;
945 copy = evas_event_list_copy(e->pointer.object.in);
946 EINA_LIST_FOREACH(copy, l, obj)
948 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
950 obj->mouse_grabbed++;
951 e->pointer.mouse_grabbed++;
954 EINA_LIST_FOREACH(copy, l, obj)
960 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
961 if (x != ev.canvas.x)
962 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
963 if (y != ev.canvas.y)
964 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
965 if (e->events_frozen <= 0)
966 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev);
967 if (e->delete_me) break;
969 if (copy) eina_list_free(copy);
970 _evas_post_event_callback_call(e);
973 /* process multi down for touch */
974 _evas_event_touch_down(e, x, y, d, timestamp);
978 evas_event_feed_multi_up(Evas *e,
980 double rad, double radx, double rady,
981 double pres, double ang,
982 double fx, double fy,
983 Evas_Button_Flags flags, unsigned int timestamp,
987 Evas_Event_Multi_Up ev;
990 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
994 if (e->events_frozen > 0) return;
995 e->last_timestamp = timestamp;
997 _evas_object_event_new();
1009 ev.canvas.xsub = fx;
1010 ev.canvas.ysub = fy;
1011 ev.data = (void *)data;
1012 ev.modifiers = &(e->modifiers);
1013 ev.locks = &(e->locks);
1015 ev.timestamp = timestamp;
1016 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1019 copy = evas_event_list_copy(e->pointer.object.in);
1020 EINA_LIST_FOREACH(copy, l, obj)
1024 ev.canvas.xsub = fx;
1025 ev.canvas.ysub = fy;
1026 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1027 if (x != ev.canvas.x)
1028 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1029 if (y != ev.canvas.y)
1030 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1031 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1032 (obj->mouse_grabbed > 0))
1034 obj->mouse_grabbed--;
1035 e->pointer.mouse_grabbed--;
1037 if (e->events_frozen <= 0)
1038 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev);
1039 if (e->delete_me) break;
1041 if (copy) copy = eina_list_free(copy);
1042 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1043 _evas_post_event_callback_call(e);
1046 /* process multi up for touch */
1047 _evas_event_touch_up(e, x, y, d, timestamp);
1051 evas_event_feed_multi_move(Evas *e,
1052 int d, int x, int y,
1053 double rad, double radx, double rady,
1054 double pres, double ang,
1055 double fx, double fy,
1056 unsigned int timestamp, const void *data)
1058 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1062 if (e->events_frozen > 0) return;
1063 e->last_timestamp = timestamp;
1065 if (!e->pointer.inside) return;
1068 /* if our mouse button is grabbed to any objects */
1069 if (e->pointer.mouse_grabbed > 0)
1071 /* go thru old list of in objects */
1072 Eina_List *l, *copy;
1073 Evas_Event_Multi_Move ev;
1076 _evas_object_event_new();
1079 ev.cur.output.x = x;
1080 ev.cur.output.y = y;
1081 ev.cur.canvas.x = x;
1082 ev.cur.canvas.y = y;
1088 ev.cur.canvas.xsub = fx;
1089 ev.cur.canvas.ysub = fy;
1090 ev.data = (void *)data;
1091 ev.modifiers = &(e->modifiers);
1092 ev.locks = &(e->locks);
1093 ev.timestamp = timestamp;
1094 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1096 copy = evas_event_list_copy(e->pointer.object.in);
1097 EINA_LIST_FOREACH(copy, l, obj)
1099 if (((evas_object_clippers_is_visible(obj)) ||
1100 (obj->mouse_grabbed)) &&
1101 (!evas_event_passes_through(obj)) &&
1102 (!obj->clip.clipees))
1104 ev.cur.canvas.x = x;
1105 ev.cur.canvas.y = y;
1106 ev.cur.canvas.xsub = fx;
1107 ev.cur.canvas.ysub = fy;
1108 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1109 if (x != ev.cur.canvas.x)
1110 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1111 if (y != ev.cur.canvas.y)
1112 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1113 if (e->events_frozen <= 0)
1114 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
1116 if (e->delete_me) break;
1118 _evas_post_event_callback_call(e);
1123 Eina_List *l, *copy;
1124 Evas_Event_Multi_Move ev;
1127 _evas_object_event_new();
1130 ev.cur.output.x = x;
1131 ev.cur.output.y = y;
1132 ev.cur.canvas.x = x;
1133 ev.cur.canvas.y = y;
1139 ev.cur.canvas.xsub = fx;
1140 ev.cur.canvas.ysub = fy;
1141 ev.data = (void *)data;
1142 ev.modifiers = &(e->modifiers);
1143 ev.locks = &(e->locks);
1144 ev.timestamp = timestamp;
1145 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1147 /* get all new in objects */
1148 ins = evas_event_objects_event_list(e, NULL, x, y);
1149 /* go thru old list of in objects */
1150 copy = evas_event_list_copy(e->pointer.object.in);
1151 EINA_LIST_FOREACH(copy, l, obj)
1153 /* if its under the pointer and its visible and its in the new */
1155 // FIXME: i don't think we need this
1156 // evas_object_clip_recalc(obj);
1157 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1158 ((evas_object_clippers_is_visible(obj)) ||
1159 (obj->mouse_grabbed)) &&
1160 (eina_list_data_find(ins, obj)) &&
1161 (!evas_event_passes_through(obj)) &&
1162 (!obj->clip.clipees) &&
1163 ((!obj->precise_is_inside) ||
1164 (evas_object_is_inside(obj, x, y))))
1166 ev.cur.canvas.x = x;
1167 ev.cur.canvas.y = y;
1168 ev.cur.canvas.xsub = fx;
1169 ev.cur.canvas.ysub = fy;
1170 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1171 if (x != ev.cur.canvas.x)
1172 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1173 if (y != ev.cur.canvas.y)
1174 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1175 if (e->events_frozen <= 0)
1176 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev);
1178 if (e->delete_me) break;
1180 if (copy) copy = eina_list_free(copy);
1181 if (e->pointer.mouse_grabbed == 0)
1183 /* free our old list of ins */
1184 eina_list_free(e->pointer.object.in);
1185 /* and set up the new one */
1186 e->pointer.object.in = ins;
1190 /* free our cur ins */
1191 eina_list_free(ins);
1193 _evas_post_event_callback_call(e);
1197 /* process multi move for touch */
1198 _evas_event_touch_move(e, x, y, d, timestamp);
1202 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)
1204 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1207 if (!keyname) return;
1208 if (e->events_frozen > 0) return;
1209 e->last_timestamp = timestamp;
1212 Evas_Event_Key_Down ev;
1215 _evas_object_event_new();
1218 ev.keyname = (char *)keyname;
1219 ev.data = (void *)data;
1220 ev.modifiers = &(e->modifiers);
1221 ev.locks = &(e->locks);
1224 ev.compose = compose;
1225 ev.timestamp = timestamp;
1226 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1233 EINA_LIST_FOREACH(e->grabs, l, g)
1240 if (g->delete_me) continue;
1241 if (((e->modifiers.mask & g->modifiers) ||
1242 (g->modifiers == e->modifiers.mask)) &&
1243 (!strcmp(keyname, g->keyname)))
1245 if (!(e->modifiers.mask & g->not_modifiers))
1247 if (e->events_frozen <= 0)
1248 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_DOWN, &ev);
1249 if (g->exclusive) exclusive = 1;
1252 if (e->delete_me) break;
1255 if (e->walking_grabs <= 0)
1257 while (e->delete_grabs > 0)
1260 for (l = e->grabs; l;)
1262 g = eina_list_data_get(l);
1263 l = eina_list_next(l);
1265 evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
1270 if ((e->focused) && (!exclusive))
1272 if (e->events_frozen <= 0)
1273 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, &ev);
1275 _evas_post_event_callback_call(e);
1281 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)
1283 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1286 if (!keyname) return;
1287 if (e->events_frozen > 0) return;
1288 e->last_timestamp = timestamp;
1291 Evas_Event_Key_Up ev;
1294 _evas_object_event_new();
1297 ev.keyname = (char *)keyname;
1298 ev.data = (void *)data;
1299 ev.modifiers = &(e->modifiers);
1300 ev.locks = &(e->locks);
1303 ev.compose = compose;
1304 ev.timestamp = timestamp;
1305 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1312 EINA_LIST_FOREACH(e->grabs, l, g)
1319 if (g->delete_me) continue;
1320 if (((e->modifiers.mask & g->modifiers) ||
1321 (g->modifiers == e->modifiers.mask)) &&
1322 (!((e->modifiers.mask & g->not_modifiers) ||
1323 (g->not_modifiers == ~e->modifiers.mask))) &&
1324 (!strcmp(keyname, g->keyname)))
1326 if (e->events_frozen <= 0)
1327 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_UP, &ev);
1328 if (g->exclusive) exclusive = 1;
1330 if (e->delete_me) break;
1333 if (e->walking_grabs <= 0)
1335 while (e->delete_grabs > 0)
1337 Eina_List *ll, *l_next;
1341 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1344 evas_key_grab_free(gr->object, gr->keyname, gr->modifiers, gr->not_modifiers);
1349 if ((e->focused) && (!exclusive))
1351 if (e->events_frozen <= 0)
1352 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev);
1354 _evas_post_event_callback_call(e);
1360 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1362 Eina_List *l, *copy;
1366 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1370 if (e->events_frozen > 0) return;
1371 e->last_timestamp = timestamp;
1373 _evas_object_event_new();
1376 ev.data = (void *)data;
1377 ev.timestamp = timestamp;
1378 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1381 copy = evas_event_list_copy(e->pointer.object.in);
1382 EINA_LIST_FOREACH(copy, l, obj)
1384 if (e->events_frozen <= 0)
1385 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev);
1386 if (e->delete_me) break;
1388 if (copy) copy = eina_list_free(copy);
1389 _evas_post_event_callback_call(e);
1391 _evas_object_event_new();
1395 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1397 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1401 if (obj->pass_events == pass) return;
1402 obj->pass_events = pass;
1403 evas_object_smart_member_cache_invalidate(obj);
1404 if (evas_object_is_in_output_rect(obj,
1405 obj->layer->evas->pointer.x,
1406 obj->layer->evas->pointer.y, 1, 1) &&
1407 ((!obj->precise_is_inside) ||
1408 (evas_object_is_inside(obj,
1409 obj->layer->evas->pointer.x,
1410 obj->layer->evas->pointer.y))))
1411 evas_event_feed_mouse_move(obj->layer->evas,
1412 obj->layer->evas->pointer.x,
1413 obj->layer->evas->pointer.y,
1414 obj->layer->evas->last_timestamp,
1419 evas_object_pass_events_get(const Evas_Object *obj)
1421 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1424 return obj->pass_events;
1428 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1430 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1434 if (obj->repeat_events == repeat) return;
1435 obj->repeat_events = repeat;
1436 if (evas_object_is_in_output_rect(obj,
1437 obj->layer->evas->pointer.x,
1438 obj->layer->evas->pointer.y, 1, 1) &&
1439 ((!obj->precise_is_inside) ||
1440 (evas_object_is_inside(obj,
1441 obj->layer->evas->pointer.x,
1442 obj->layer->evas->pointer.y))))
1443 evas_event_feed_mouse_move(obj->layer->evas,
1444 obj->layer->evas->pointer.x,
1445 obj->layer->evas->pointer.y,
1446 obj->layer->evas->last_timestamp,
1451 evas_object_repeat_events_get(const Evas_Object *obj)
1453 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1456 return obj->repeat_events;
1460 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1462 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1465 obj->no_propagate = !prop;
1469 evas_object_propagate_events_get(const Evas_Object *obj)
1471 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1474 return !(obj->no_propagate);
1478 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1480 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1483 obj->pointer_mode = setting;
1486 EAPI Evas_Object_Pointer_Mode
1487 evas_object_pointer_mode_get(const Evas_Object *obj)
1489 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1492 return obj->pointer_mode;
1496 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1500 case EVAS_CALLBACK_MOUSE_IN:
1502 Evas_Event_Mouse_In *ev = event_copy;
1503 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1506 case EVAS_CALLBACK_MOUSE_OUT:
1508 Evas_Event_Mouse_Out *ev = event_copy;
1509 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1512 case EVAS_CALLBACK_MOUSE_DOWN:
1514 Evas_Event_Mouse_Down *ev = event_copy;
1515 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1518 case EVAS_CALLBACK_MOUSE_UP:
1520 Evas_Event_Mouse_Up *ev = event_copy;
1521 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1524 case EVAS_CALLBACK_MOUSE_MOVE:
1526 Evas_Event_Mouse_Move *ev = event_copy;
1527 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1530 case EVAS_CALLBACK_MOUSE_WHEEL:
1532 Evas_Event_Mouse_Wheel *ev = event_copy;
1533 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1536 case EVAS_CALLBACK_MULTI_DOWN:
1538 Evas_Event_Multi_Down *ev = event_copy;
1539 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);
1542 case EVAS_CALLBACK_MULTI_UP:
1544 Evas_Event_Multi_Up *ev = event_copy;
1545 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);
1548 case EVAS_CALLBACK_MULTI_MOVE:
1550 Evas_Event_Multi_Move *ev = event_copy;
1551 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);
1554 case EVAS_CALLBACK_KEY_DOWN:
1556 Evas_Event_Key_Down *ev = event_copy;
1557 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1560 case EVAS_CALLBACK_KEY_UP:
1562 Evas_Event_Key_Up *ev = event_copy;
1563 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1566 default: /* All non-input events are not handeled */