1 #include "evas_common.h"
2 #include "evas_private.h"
5 _evas_event_object_list_in_get(Evas *e, Evas_List *in, const Evas_Object_List *list, Evas_Object *stop, int x, int y, int *no_rep)
7 const Evas_Object_List *l;
10 for (l = list->last; l; l = l->prev)
14 obj = (Evas_Object *)l;
20 if (!evas_event_passes_through(obj))
22 if ((obj->cur.visible) && (obj->delete_me == 0) &&
23 (!obj->clip.clipees) &&
24 (evas_object_clippers_is_visible(obj)))
31 in = _evas_event_object_list_in_get(e, in,
32 evas_object_smart_members_get_direct(obj),
42 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
43 ((!obj->precise_is_inside) ||
44 (evas_object_is_inside(obj, x, y))))
46 in = evas_list_append(in, obj);
47 if (!obj->repeat_events)
62 evas_event_objects_event_list(Evas *e, Evas_Object *stop, int x, int y)
67 if (!e->layers) return NULL;
68 for (l = ((Evas_Object_List *)(e->layers))->last; l; l = l->prev)
73 lay = (Evas_Layer *)l;
75 in = _evas_event_object_list_in_get(e, in, (Evas_Object_List *)lay->objects, stop,
82 static Evas_List *evas_event_list_copy(Evas_List *list);
84 evas_event_list_copy(Evas_List *list)
86 Evas_List *l, *new_l = NULL;
88 for (l = list; l; l = l->next)
89 new_l = evas_list_append(new_l, l->data);
92 /* public functions */
95 * @defgroup Evas_Event_Freezing_Group Evas Event Freezing Functions
97 * Functions that deal with the freezing of event processing of an evas.
101 * Freeze all event processing
102 * @param e The canvas to freeze event processing on
104 * This function will indicate to evas that the canvas @p e is to have all
105 * event processing frozen until a matching evas_event_thaw() function is
106 * called on the same canvas. Every freeze call must be matched by a thaw call
107 * in order to completely thaw out a canvas.
112 * extern Evas_Object *object;
114 * evas_event_freeze(evas);
115 * evas_object_move(object, 50, 100);
116 * evas_object_resize(object, 200, 200);
117 * evas_event_thaw(evas);
119 * @ingroup Evas_Event_Freezing_Group
122 evas_event_freeze(Evas *e)
124 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
131 * Thaw a canvas out after freezing
132 * @param e The canvas to thaw out
134 * This will thaw out a canvas after a matching evas_event_freeze() call. If
135 * this call completely thaws out a canvas, events will start being processed
136 * again after this call, but this call will not invole any "missed" events
139 * See evas_event_freeze() for an example.
140 * @ingroup Evas_Event_Freezing_Group
143 evas_event_thaw(Evas *e)
145 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
149 if (e->events_frozen == 0)
153 for (l = (Evas_Object_List *)e->layers; l; l = l->next)
155 Evas_Object_List *l2;
158 lay = (Evas_Layer *)l;
159 for (l2 = (Evas_Object_List *)lay->objects; l2; l2 = l2->next)
163 obj = (Evas_Object *)l2;
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 * Return the freeze count of a given canvas
175 * @param e The canvas to fetch the freeze count from
177 * This returns the number of times the canvas has been told to freeze events.
178 * It is possible to call evas_event_freeze() multiple times, and these must
179 * be matched by evas_event_thaw() calls. This call allows the program to
180 * discover just how many times things have been frozen in case it may want
181 * to break out of a deep freeze state where the count is high.
187 * while (evas_event_freeze_get(evas) > 0) evas_event_thaw(evas);
189 * @ingroup Evas_Event_Freezing_Group
192 evas_event_freeze_get(const Evas *e)
194 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
197 return e->events_frozen;
203 * FIXME: To be fixed.
207 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
210 Evas_Event_Mouse_Down ev;
212 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
216 if ((b < 1) || (b > 32)) return;
218 e->pointer.button |= (1 << (b - 1));
220 if (e->events_frozen > 0) return;
221 e->last_timestamp = timestamp;
224 ev.output.x = e->pointer.x;
225 ev.output.y = e->pointer.y;
226 ev.canvas.x = e->pointer.x;
227 ev.canvas.y = e->pointer.y;
228 ev.data = (void *)data;
229 ev.modifiers = &(e->modifiers);
230 ev.locks = &(e->locks);
232 ev.timestamp = timestamp;
233 ev.event_flags = EVAS_EVENT_FLAG_NONE;
236 copy = evas_event_list_copy(e->pointer.object.in);
237 for (l = copy; l; l = l->next)
242 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
244 obj->mouse_grabbed++;
245 e->pointer.mouse_grabbed++;
248 if (e->events_frozen <= 0)
249 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev);
250 if (e->delete_me) break;
252 if (copy) copy = evas_list_free(copy);
253 e->last_mouse_down_counter++;
260 * FIXME: To be fixed.
264 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
268 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
272 if ((b < 1) || (b > 32)) return;
274 e->pointer.button &= ~(1 << (b - 1));
276 if (e->events_frozen > 0) return;
277 e->last_timestamp = timestamp;
280 Evas_Event_Mouse_Up ev;
283 ev.output.x = e->pointer.x;
284 ev.output.y = e->pointer.y;
285 ev.canvas.x = e->pointer.x;
286 ev.canvas.y = e->pointer.y;
287 ev.data = (void *)data;
288 ev.modifiers = &(e->modifiers);
289 ev.locks = &(e->locks);
291 ev.timestamp = timestamp;
292 ev.event_flags = EVAS_EVENT_FLAG_NONE;
295 copy = evas_event_list_copy(e->pointer.object.in);
296 for (l = copy; l; l = l->next)
301 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
302 (obj->mouse_in) && (obj->mouse_grabbed > 0))
304 obj->mouse_grabbed--;
305 e->pointer.mouse_grabbed--;
307 if (e->events_frozen <= 0)
308 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev);
309 if (e->delete_me) break;
311 if (copy) copy = evas_list_free(copy);
312 e->last_mouse_up_counter++;
315 if (!e->pointer.button)
321 Evas_Event_Mouse_Out ev;
323 ev.buttons = e->pointer.button;
324 ev.output.x = e->pointer.x;
325 ev.output.y = e->pointer.y;
326 ev.canvas.x = e->pointer.x;
327 ev.canvas.y = e->pointer.y;
328 ev.data = (void *)data;
329 ev.modifiers = &(e->modifiers);
330 ev.locks = &(e->locks);
331 ev.timestamp = timestamp;
332 ev.event_flags = EVAS_EVENT_FLAG_NONE;
334 /* get new list of ins */
335 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
336 /* go thru old list of in objects */
337 copy = evas_event_list_copy(e->pointer.object.in);
338 for (l = copy; l; l = l->next)
343 if ((!evas_list_find(ins, obj)) ||
344 (!e->pointer.inside))
348 if (e->events_frozen <= 0)
349 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
351 if (e->delete_me) break;
354 if (copy) copy = evas_list_free(copy);
355 if (e->pointer.inside)
357 Evas_Event_Mouse_In ev;
359 ev.buttons = e->pointer.button;
360 ev.output.x = e->pointer.x;
361 ev.output.y = e->pointer.y;
362 ev.canvas.x = e->pointer.x;
363 ev.canvas.y = e->pointer.y;
364 ev.data = (void *)data;
365 ev.modifiers = &(e->modifiers);
366 ev.locks = &(e->locks);
367 ev.timestamp = timestamp;
368 ev.event_flags = EVAS_EVENT_FLAG_NONE;
370 for (l = ins; l; l = l->next)
376 if (!evas_list_find(e->pointer.object.in, obj))
380 if (e->events_frozen <= 0)
381 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
383 if (e->delete_me) break;
388 ins = evas_list_free(ins);
390 /* free our old list of ins */
391 e->pointer.object.in = evas_list_free(e->pointer.object.in);
392 /* and set up the new one */
393 e->pointer.object.in = ins;
394 if (e->pointer.inside)
395 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
398 if (e->pointer.mouse_grabbed < 0)
399 fprintf(stderr, "BUG? e->pointer.mouse_grabbed (=%d) < 0!\n",
400 e->pointer.mouse_grabbed);
402 if ((e->pointer.button == 0) && (e->pointer.mouse_grabbed))
404 e->pointer.mouse_grabbed = 0;
412 * FIXME: To be fixed.
416 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
420 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
424 if (e->events_frozen > 0) return;
427 for (i = 0; i < 32; i++)
429 if ((e->pointer.button & (1 << i)))
430 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
438 * FIXME: To be fixed.
442 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
445 Evas_Event_Mouse_Wheel ev;
447 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
451 if (e->events_frozen > 0) return;
452 e->last_timestamp = timestamp;
454 ev.direction = direction;
456 ev.output.x = e->pointer.x;
457 ev.output.y = e->pointer.y;
458 ev.canvas.x = e->pointer.x;
459 ev.canvas.y = e->pointer.y;
460 ev.data = (void *) data;
461 ev.modifiers = &(e->modifiers);
462 ev.locks = &(e->locks);
463 ev.timestamp = timestamp;
464 ev.event_flags = EVAS_EVENT_FLAG_NONE;
467 copy = evas_event_list_copy(e->pointer.object.in);
469 for (l = copy; l; l = l->next)
471 Evas_Object *obj = l->data;
473 if (e->events_frozen <= 0)
474 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev);
475 if (e->delete_me) break;
477 if (copy) copy = evas_list_free(copy);
485 * FIXME: To be fixed.
489 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
492 //// Evas_Coord pcx, pcy;
494 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
500 //// pcx = e->pointer.canvas_x;
501 //// pcy = e->pointer.canvas_y;
503 if (e->events_frozen > 0) return;
504 e->last_timestamp = timestamp;
508 //// e->pointer.canvas_x = x;
509 //// e->pointer.canvas_y = y;
510 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
511 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
512 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
514 /* if our mouse button is grabbed to any objects */
515 if (e->pointer.mouse_grabbed > 0)
517 /* go thru old list of in objects */
518 Evas_List *outs = NULL;
522 Evas_Event_Mouse_Move ev;
524 ev.buttons = e->pointer.button;
525 ev.cur.output.x = e->pointer.x;
526 ev.cur.output.y = e->pointer.y;
527 ev.cur.canvas.x = e->pointer.x;
528 ev.cur.canvas.y = e->pointer.y;
529 ev.prev.output.x = px;
530 ev.prev.output.y = py;
531 ev.prev.canvas.x = px;
532 ev.prev.canvas.y = py;
533 ev.data = (void *)data;
534 ev.modifiers = &(e->modifiers);
535 ev.locks = &(e->locks);
536 ev.timestamp = timestamp;
537 ev.event_flags = EVAS_EVENT_FLAG_NONE;
538 copy = evas_event_list_copy(e->pointer.object.in);
539 for (l = copy; l; l = l->next)
544 if ((obj->cur.visible) &&
545 (evas_object_clippers_is_visible(obj)) &&
546 (!evas_event_passes_through(obj)) &&
547 (!obj->clip.clipees))
549 if ((px != x) || (py != y))
551 if (e->events_frozen <= 0)
552 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
556 outs = evas_list_append(outs, obj);
557 if (e->delete_me) break;
561 Evas_Event_Mouse_Out ev;
563 ev.buttons = e->pointer.button;
564 ev.output.x = e->pointer.x;
565 ev.output.y = e->pointer.y;
566 ev.canvas.x = e->pointer.x;
567 ev.canvas.y = e->pointer.y;
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;
574 if (copy) copy = evas_list_free(copy);
580 outs = evas_list_remove(outs, obj);
581 if ((!obj->mouse_grabbed) && (!e->delete_me))
583 e->pointer.object.in = evas_list_remove(e->pointer.object.in, obj);
586 if (e->events_frozen <= 0)
587 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
597 Evas_Event_Mouse_Move ev;
598 Evas_Event_Mouse_Out ev2;
599 Evas_Event_Mouse_In ev3;
601 ev.buttons = e->pointer.button;
602 ev.cur.output.x = e->pointer.x;
603 ev.cur.output.y = e->pointer.y;
604 ev.cur.canvas.x = e->pointer.x;
605 ev.cur.canvas.y = e->pointer.y;
606 ev.prev.output.x = px;
607 ev.prev.output.y = py;
608 ev.prev.canvas.x = px;
609 ev.prev.canvas.y = py;
610 ev.data = (void *)data;
611 ev.modifiers = &(e->modifiers);
612 ev.locks = &(e->locks);
613 ev.timestamp = timestamp;
614 ev.event_flags = EVAS_EVENT_FLAG_NONE;
616 ev2.buttons = e->pointer.button;
617 ev2.output.x = e->pointer.x;
618 ev2.output.y = e->pointer.y;
619 ev2.canvas.x = e->pointer.x;
620 ev2.canvas.y = e->pointer.y;
621 ev2.data = (void *)data;
622 ev2.modifiers = &(e->modifiers);
623 ev2.locks = &(e->locks);
624 ev2.timestamp = timestamp;
625 ev2.event_flags = EVAS_EVENT_FLAG_NONE;
627 ev3.buttons = e->pointer.button;
628 ev3.output.x = e->pointer.x;
629 ev3.output.y = e->pointer.y;
630 ev3.canvas.x = e->pointer.x;
631 ev3.canvas.y = e->pointer.y;
632 ev3.data = (void *)data;
633 ev3.modifiers = &(e->modifiers);
634 ev3.locks = &(e->locks);
635 ev3.timestamp = timestamp;
636 ev3.event_flags = EVAS_EVENT_FLAG_NONE;
638 /* get all new in objects */
639 ins = evas_event_objects_event_list(e, NULL, x, y);
640 /* go thru old list of in objects */
641 copy = evas_event_list_copy(e->pointer.object.in);
642 for (l = copy; l; l = l->next)
647 /* if its under the pointer and its visible and its in the new */
649 // FIXME: i don't think we need this
650 // evas_object_clip_recalc(obj);
651 if (evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
652 (obj->cur.visible) &&
653 (evas_object_clippers_is_visible(obj)) &&
654 (evas_list_find(ins, obj)) &&
655 (!evas_event_passes_through(obj)) &&
656 (!obj->clip.clipees) &&
657 ((!obj->precise_is_inside) ||
658 (evas_object_is_inside(obj, x, y))))
660 if ((px != x) || (py != y))
662 if (e->events_frozen <= 0)
663 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev);
666 /* otherwise it has left the object */
670 if (e->events_frozen <= 0)
671 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2);
673 if (e->delete_me) break;
675 if (copy) copy = evas_list_free(copy);
676 /* go thru our current list of ins */
677 for (l = ins; l; l = l->next)
682 /* if its not in the old list of ins send an enter event */
683 if (!evas_list_find(e->pointer.object.in, obj))
687 if (e->events_frozen <= 0)
688 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3);
690 if (e->delete_me) break;
692 /* free our old list of ins */
693 evas_list_free(e->pointer.object.in);
694 /* and set up the new one */
695 e->pointer.object.in = ins;
703 * FIXME: To be fixed.
707 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
711 Evas_Event_Mouse_In ev;
713 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
716 e->pointer.inside = 1;
718 if (e->events_frozen > 0) return;
719 e->last_timestamp = timestamp;
721 if (e->pointer.mouse_grabbed != 0) return;
723 ev.buttons = e->pointer.button;
724 ev.output.x = e->pointer.x;
725 ev.output.y = e->pointer.y;
726 ev.canvas.x = e->pointer.x;
727 ev.canvas.y = e->pointer.y;
728 ev.data = (void *)data;
729 ev.modifiers = &(e->modifiers);
730 ev.locks = &(e->locks);
731 ev.timestamp = timestamp;
732 ev.event_flags = EVAS_EVENT_FLAG_NONE;
735 /* get new list of ins */
736 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
737 for (l = ins; l; l = l->next)
743 if (!evas_list_find(e->pointer.object.in, obj))
747 if (e->events_frozen <= 0)
748 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev);
750 if (e->delete_me) break;
752 /* free our old list of ins */
753 e->pointer.object.in = evas_list_free(e->pointer.object.in);
754 /* and set up the new one */
755 e->pointer.object.in = ins;
756 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
763 * FIXME: To be fixed.
767 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
769 Evas_Event_Mouse_Out ev;
771 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
774 e->pointer.inside = 0;
776 if (e->events_frozen > 0) return;
777 e->last_timestamp = timestamp;
779 ev.buttons = e->pointer.button;
780 ev.output.x = e->pointer.x;
781 ev.output.y = e->pointer.y;
782 ev.canvas.x = e->pointer.x;
783 ev.canvas.y = e->pointer.y;
784 ev.data = (void *)data;
785 ev.modifiers = &(e->modifiers);
786 ev.locks = &(e->locks);
787 ev.timestamp = timestamp;
788 ev.event_flags = EVAS_EVENT_FLAG_NONE;
791 /* if our mouse button is grabbed to any objects */
792 if (e->pointer.mouse_grabbed == 0)
794 /* go thru old list of in objects */
797 copy = evas_event_list_copy(e->pointer.object.in);
798 for (l = copy; l; l = l->next)
806 if (e->events_frozen <= 0)
807 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev);
809 if (e->delete_me) break;
811 if (copy) copy = evas_list_free(copy);
812 /* free our old list of ins */
813 e->pointer.object.in = evas_list_free(e->pointer.object.in);
821 * FIXME: To be fixed.
825 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)
827 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
830 if (!keyname) return;
831 if (e->events_frozen > 0) return;
832 e->last_timestamp = timestamp;
835 Evas_Event_Key_Down ev;
839 ev.keyname = (char *)keyname;
840 ev.data = (void *)data;
841 ev.modifiers = &(e->modifiers);
842 ev.locks = &(e->locks);
845 ev.compose = compose;
846 ev.timestamp = timestamp;
847 ev.event_flags = EVAS_EVENT_FLAG_NONE;
853 for (l = e->grabs; l; l= l->next)
863 if (g->delete_me) continue;
864 if (((e->modifiers.mask & g->modifiers) ||
865 (g->modifiers == e->modifiers.mask)) &&
866 (!strcmp(keyname, g->keyname)))
868 if (!(e->modifiers.mask & g->not_modifiers))
870 if (e->events_frozen <= 0)
871 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_DOWN, &ev);
872 if (g->exclusive) exclusive = 1;
875 if (e->delete_me) break;
878 if (e->walking_grabs <= 0)
880 while (e->delete_grabs > 0)
885 for (l = e->grabs; l;)
892 evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
897 if ((e->focused) && (!exclusive))
899 if (e->events_frozen <= 0)
900 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN, &ev);
909 * FIXME: To be fixed.
913 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)
915 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
918 if (!keyname) return;
919 if (e->events_frozen > 0) return;
920 e->last_timestamp = timestamp;
923 Evas_Event_Key_Up ev;
927 ev.keyname = (char *)keyname;
928 ev.data = (void *)data;
929 ev.modifiers = &(e->modifiers);
930 ev.locks = &(e->locks);
933 ev.compose = compose;
934 ev.timestamp = timestamp;
935 ev.event_flags = EVAS_EVENT_FLAG_NONE;
941 for (l = e->grabs; l; l= l->next)
951 if (g->delete_me) continue;
952 if (((e->modifiers.mask & g->modifiers) ||
953 (g->modifiers == e->modifiers.mask)) &&
954 (!((e->modifiers.mask & g->not_modifiers) ||
955 (g->not_modifiers == ~e->modifiers.mask))) &&
956 (!strcmp(keyname, g->keyname)))
958 if (e->events_frozen <= 0)
959 evas_object_event_callback_call(g->object, EVAS_CALLBACK_KEY_UP, &ev);
960 if (g->exclusive) exclusive = 1;
962 if (e->delete_me) break;
965 if (e->walking_grabs <= 0)
967 while (e->delete_grabs > 0)
972 for (l = e->grabs; l; l= l->next)
979 evas_key_grab_free(g->object, g->keyname, g->modifiers, g->not_modifiers);
984 if ((e->focused) && (!exclusive))
986 if (e->events_frozen <= 0)
987 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP, &ev);
996 * FIXME: To be fixed.
1000 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1002 Evas_List *l, *copy;
1005 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1009 if (e->events_frozen > 0) return;
1010 e->last_timestamp = timestamp;
1013 ev.data = (void *)data;
1014 ev.timestamp = timestamp;
1015 ev.event_flags = EVAS_EVENT_FLAG_NONE;
1018 copy = evas_event_list_copy(e->pointer.object.in);
1019 for (l = copy; l; l = l->next)
1024 if (e->events_frozen <= 0)
1025 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev);
1026 if (e->delete_me) break;
1028 if (copy) copy = evas_list_free(copy);
1033 * @defgroup Evas_Object_Event_Flags_Group Evas Object Event Flag Functions
1035 * Functions that deal with how events on an Evas Object are processed.
1039 * Set an object's pass events state.
1040 * @param obj the evas object
1041 * @param pass whether to pass events or not
1043 * If @p pass is true, this will cause events on @p obj to be ignored.
1044 * They will be triggered on the next lower object (that is not set to
1045 * pass events) instead.
1047 * If @p pass is false, events will be processed as normal.
1049 * @ingroup Evas_Object_Event_Flags_Group
1052 evas_object_pass_events_set(Evas_Object *obj, Evas_Bool pass)
1054 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1057 obj->pass_events = pass;
1058 evas_object_smart_member_cache_invalidate(obj);
1059 if (evas_object_is_in_output_rect(obj,
1060 obj->layer->evas->pointer.x,
1061 obj->layer->evas->pointer.y, 1, 1) &&
1062 ((!obj->precise_is_inside) ||
1063 (evas_object_is_inside(obj,
1064 obj->layer->evas->pointer.x,
1065 obj->layer->evas->pointer.y))))
1066 evas_event_feed_mouse_move(obj->layer->evas,
1067 obj->layer->evas->pointer.x,
1068 obj->layer->evas->pointer.y,
1069 obj->layer->evas->last_timestamp,
1074 * Determine whether an object is set to pass events.
1076 * @return pass events state
1078 * @ingroup Evas_Object_Event_Flags_Group
1081 evas_object_pass_events_get(const Evas_Object *obj)
1083 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1086 return obj->pass_events;
1090 * Set an object's repeat events state.
1091 * @param obj the object
1092 * @param repeat wheter to repeat events or not
1094 * If @p repeat is true, this will cause events on @p obj to trigger
1095 * callbacks, but also to be repeated on the next lower object in the
1098 * If @p repeat is false, events occuring on @p obj will be processed
1101 * @ingroup Evas_Object_Event_Flags_Group
1104 evas_object_repeat_events_set(Evas_Object *obj, Evas_Bool repeat)
1106 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1109 obj->repeat_events = repeat;
1110 if (evas_object_is_in_output_rect(obj,
1111 obj->layer->evas->pointer.x,
1112 obj->layer->evas->pointer.y, 1, 1) &&
1113 ((!obj->precise_is_inside) ||
1114 (evas_object_is_inside(obj,
1115 obj->layer->evas->pointer.x,
1116 obj->layer->evas->pointer.y))))
1117 evas_event_feed_mouse_move(obj->layer->evas,
1118 obj->layer->evas->pointer.x,
1119 obj->layer->evas->pointer.y,
1120 obj->layer->evas->last_timestamp,
1125 * Determine whether an object is set to repeat events.
1127 * @return repeat events state
1129 * @ingroup Evas_Object_Event_Flags_Group
1132 evas_object_repeat_events_get(const Evas_Object *obj)
1134 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1137 return obj->repeat_events;
1141 * Set whether events on a smart member object should propagate to its parent.
1143 * @param obj the smart member object
1144 * @param prop wheter to propagate events or not
1146 * This function has no effect if @p obj is not a member of a smart
1149 * If @p prop is true, events occuring on this object will propagate on
1150 * to the smart object of which @p obj is a member.
1152 * If @p prop is false, events for which callbacks are set on the member
1153 * object, @p obj, will not be passed on to the parent smart object.
1155 * The default value is true.
1156 * @ingroup Evas_Object_Event_Flags_Group
1159 evas_object_propagate_events_set(Evas_Object *obj, Evas_Bool prop)
1161 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1164 obj->no_propagate = !prop;
1168 * Determine whether an object is set to propagate events.
1170 * @return propogate events state
1172 * @ingroup Evas_Object_Event_Flags_Group
1175 evas_object_propagate_events_get(const Evas_Object *obj)
1177 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1180 return !(obj->no_propagate);
1184 * Set pointer behavior.
1187 * @param setting desired behavior.
1189 * This function has direct effect on event callbacks related to mouse.
1191 * If @p setting is EVAS_OBJECT_POINTER_MODE_AUTOGRAB, then when mouse is
1192 * down at this object, events will be restricted to it as source, mouse
1193 * moves, for example, will be emitted even if outside this object area.
1195 * If @p setting is EVAS_OBJECT_POINTER_MODE_NOGRAB, then events will be
1196 * emitted just when inside this object area.
1198 * The default value is EVAS_OBJECT_POINTER_MODE_AUTOGRAB.
1201 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1203 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1206 obj->pointer_mode = setting;
1210 * Determine how pointer will behave.
1212 * @return pointer behavior.
1214 EAPI Evas_Object_Pointer_Mode
1215 evas_object_pointer_mode_get(const Evas_Object *obj)
1217 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1220 return obj->pointer_mode;