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),
72 if (!obj->repeat_events) *no_rep = 1;
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) || (e->events_frozen > 0)) 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_default_flags_set(Evas *e, Evas_Event_Flags flags)
141 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
144 e->default_event_flags = flags;
147 EAPI Evas_Event_Flags
148 evas_event_default_flags_get(const Evas *e)
150 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
151 return EVAS_EVENT_FLAG_ON_HOLD;
153 return e->default_event_flags;
157 evas_event_freeze(Evas *e)
159 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
166 evas_event_thaw(Evas *e)
168 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
172 if (e->events_frozen == 0)
176 EINA_INLIST_FOREACH((EINA_INLIST_GET(e->layers)), lay)
180 EINA_INLIST_FOREACH(lay->objects, obj)
182 evas_object_clip_recalc(obj);
183 evas_object_recalc_clippees(obj);
187 if (e->events_frozen < 0)
188 evas_debug_generic(" Thaw of events when already thawed!!!\n");
192 evas_event_freeze_get(const Evas *e)
194 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
197 return e->events_frozen;
201 evas_event_thaw_eval(Evas *e)
203 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
206 if (e->events_frozen != 0) return;
208 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y,
209 e->last_timestamp, NULL);
213 evas_event_feed_mouse_down(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
216 Evas_Event_Mouse_Down ev;
221 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
225 if ((b < 1) || (b > 32)) return;
227 e->pointer.button |= (1 << (b - 1));
230 if (e->events_frozen > 0) return;
231 e->last_timestamp = timestamp;
233 _evas_object_event_new();
235 event_id = _evas_event_counter;
237 ev.output.x = e->pointer.x;
238 ev.output.y = e->pointer.y;
239 ev.canvas.x = e->pointer.x;
240 ev.canvas.y = e->pointer.y;
241 ev.data = (void *)data;
242 ev.modifiers = &(e->modifiers);
243 ev.locks = &(e->locks);
245 ev.timestamp = timestamp;
246 ev.event_flags = e->default_event_flags;
249 /* append new touch point to the touch point list */
250 _evas_touch_point_append(e, 0, e->pointer.x, e->pointer.y);
251 /* If this is the first finger down, i.e no other fingers pressed,
252 * get a new event list, otherwise, keep the current grabbed list. */
253 if (e->pointer.mouse_grabbed == 0)
255 Eina_List *ins = evas_event_objects_event_list(e,
259 /* free our old list of ins */
260 e->pointer.object.in = eina_list_free(e->pointer.object.in);
261 /* and set up the new one */
262 e->pointer.object.in = ins;
263 /* adjust grabbed count by the nuymber of currently held down
265 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
267 copy = evas_event_list_copy(e->pointer.object.in);
268 EINA_LIST_FOREACH(copy, l, obj)
270 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
272 obj->mouse_grabbed += addgrab + 1;
273 e->pointer.mouse_grabbed += addgrab + 1;
276 EINA_LIST_FOREACH(copy, l, obj)
278 if (obj->delete_me) continue;
279 ev.canvas.x = e->pointer.x;
280 ev.canvas.y = e->pointer.y;
281 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
283 if (e->events_frozen <= 0)
284 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_DOWN, &ev, event_id);
285 if (e->delete_me) break;
287 if (copy) eina_list_free(copy);
288 e->last_mouse_down_counter++;
289 _evas_post_event_callback_call(e);
290 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
291 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_STILL);
296 _post_up_handle(Evas *e, unsigned int timestamp, const void *data)
298 Eina_List *l, *copy, *ins, *ll;
299 Evas_Event_Mouse_Out ev;
304 _evas_object_event_new();
306 event_id = _evas_event_counter;
307 ev.buttons = e->pointer.button;
308 ev.output.x = e->pointer.x;
309 ev.output.y = e->pointer.y;
310 ev.canvas.x = e->pointer.x;
311 ev.canvas.y = e->pointer.y;
312 ev.data = (void *)data;
313 ev.modifiers = &(e->modifiers);
314 ev.locks = &(e->locks);
315 ev.timestamp = timestamp;
316 ev.event_flags = e->default_event_flags;
318 /* get new list of ins */
319 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
320 /* go thru old list of in objects */
321 copy = evas_event_list_copy(e->pointer.object.in);
322 EINA_LIST_FOREACH(copy, ll, obj)
324 ev.canvas.x = e->pointer.x;
325 ev.canvas.y = e->pointer.y;
326 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
327 if ((!eina_list_data_find(ins, obj)) ||
328 (!e->pointer.inside))
333 if (e->events_frozen <= 0)
334 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
337 if (e->delete_me) break;
339 _evas_post_event_callback_call(e);
341 if (copy) copy = eina_list_free(copy);
342 if (e->pointer.inside)
344 Evas_Event_Mouse_In ev_in;
345 Evas_Object *obj_itr;
348 _evas_object_event_new();
350 event_id = _evas_event_counter;
351 ev_in.buttons = e->pointer.button;
352 ev_in.output.x = e->pointer.x;
353 ev_in.output.y = e->pointer.y;
354 ev_in.canvas.x = e->pointer.x;
355 ev_in.canvas.y = e->pointer.y;
356 ev_in.data = (void *)data;
357 ev_in.modifiers = &(e->modifiers);
358 ev_in.locks = &(e->locks);
359 ev_in.timestamp = timestamp;
360 ev_in.event_flags = e->default_event_flags;
362 EINA_LIST_FOREACH(ins, l, obj_itr)
364 ev_in.canvas.x = e->pointer.x;
365 ev_in.canvas.y = e->pointer.y;
366 _evas_event_havemap_adjust(obj_itr, &ev_in.canvas.x, &ev_in.canvas.y, obj_itr->mouse_grabbed);
367 if (!eina_list_data_find(e->pointer.object.in, obj_itr))
369 if (!obj_itr->mouse_in)
371 obj_itr->mouse_in = 1;
372 if (e->events_frozen <= 0)
373 evas_object_event_callback_call(obj_itr, EVAS_CALLBACK_MOUSE_IN, &ev_in, event_id);
376 if (e->delete_me) break;
379 _evas_post_event_callback_call(e);
383 ins = eina_list_free(ins);
386 if (e->pointer.mouse_grabbed == 0)
388 /* free our old list of ins */
389 eina_list_free(e->pointer.object.in);
390 /* and set up the new one */
391 e->pointer.object.in = ins;
395 /* free our cur ins */
398 if (e->pointer.inside)
399 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
404 evas_event_feed_mouse_up(Evas *e, int b, Evas_Button_Flags flags, unsigned int timestamp, const void *data)
408 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
412 if ((b < 1) || (b > 32)) return;
414 e->pointer.button &= ~(1 << (b - 1));
417 if (e->events_frozen > 0) return;
418 e->last_timestamp = timestamp;
421 Evas_Event_Mouse_Up ev;
425 _evas_object_event_new();
427 event_id = _evas_event_counter;
429 ev.output.x = e->pointer.x;
430 ev.output.y = e->pointer.y;
431 ev.canvas.x = e->pointer.x;
432 ev.canvas.y = e->pointer.y;
433 ev.data = (void *)data;
434 ev.modifiers = &(e->modifiers);
435 ev.locks = &(e->locks);
437 ev.timestamp = timestamp;
438 ev.event_flags = e->default_event_flags;
441 /* update released touch point */
442 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_UP);
443 copy = evas_event_list_copy(e->pointer.object.in);
444 EINA_LIST_FOREACH(copy, l, obj)
446 ev.canvas.x = e->pointer.x;
447 ev.canvas.y = e->pointer.y;
448 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
449 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
450 (obj->mouse_grabbed > 0))
452 obj->mouse_grabbed--;
453 e->pointer.mouse_grabbed--;
457 if (e->events_frozen <= 0)
458 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_UP, &ev, event_id);
460 if (e->delete_me) break;
462 if (copy) copy = eina_list_free(copy);
463 e->last_mouse_up_counter++;
464 _evas_post_event_callback_call(e);
467 if (e->pointer.mouse_grabbed == 0)
469 _post_up_handle(e, timestamp, data);
472 if (e->pointer.mouse_grabbed < 0)
474 ERR("BUG? e->pointer.mouse_grabbed (=%d) < 0!",
475 e->pointer.mouse_grabbed);
477 /* remove released touch point from the touch point list */
478 _evas_touch_point_remove(e, 0);
484 evas_event_feed_mouse_cancel(Evas *e, unsigned int timestamp, const void *data)
488 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
492 if (e->events_frozen > 0) return;
495 for (i = 0; i < 32; i++)
497 if ((e->pointer.button & (1 << i)))
498 evas_event_feed_mouse_up(e, i + 1, 0, timestamp, data);
504 evas_event_feed_mouse_wheel(Evas *e, int direction, int z, unsigned int timestamp, const void *data)
507 Evas_Event_Mouse_Wheel ev;
511 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
515 if (e->events_frozen > 0) return;
516 e->last_timestamp = timestamp;
518 _evas_object_event_new();
520 event_id = _evas_event_counter;
521 ev.direction = direction;
523 ev.output.x = e->pointer.x;
524 ev.output.y = e->pointer.y;
525 ev.canvas.x = e->pointer.x;
526 ev.canvas.y = e->pointer.y;
527 ev.data = (void *) data;
528 ev.modifiers = &(e->modifiers);
529 ev.locks = &(e->locks);
530 ev.timestamp = timestamp;
531 ev.event_flags = e->default_event_flags;
534 copy = evas_event_list_copy(e->pointer.object.in);
536 EINA_LIST_FOREACH(copy, l, obj)
538 ev.canvas.x = e->pointer.x;
539 ev.canvas.y = e->pointer.y;
540 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
541 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
542 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_WHEEL, &ev, event_id);
543 if (e->delete_me) break;
545 if (copy) copy = eina_list_free(copy);
546 _evas_post_event_callback_call(e);
552 evas_event_feed_mouse_move(Evas *e, int x, int y, unsigned int timestamp, const void *data)
555 //// Evas_Coord pcx, pcy;
557 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
563 //// pcx = e->pointer.canvas_x;
564 //// pcy = e->pointer.canvas_y;
566 if (e->events_frozen > 0) return;
567 e->last_timestamp = timestamp;
571 //// e->pointer.canvas_x = x;
572 //// e->pointer.canvas_y = y;
573 //// e->pointer.canvas_x = evas_coord_screen_x_to_world(e, x);
574 //// e->pointer.canvas_y = evas_coord_screen_y_to_world(e, y);
575 if ((!e->pointer.inside) && (e->pointer.mouse_grabbed == 0)) return;
577 /* update moved touch point */
578 if ((px != x) || (py != y))
579 _evas_touch_point_update(e, 0, e->pointer.x, e->pointer.y, EVAS_TOUCH_POINT_MOVE);
580 /* if our mouse button is grabbed to any objects */
581 if (e->pointer.mouse_grabbed > 0)
583 /* go thru old list of in objects */
584 Eina_List *outs = NULL;
588 Evas_Event_Mouse_Move ev;
592 _evas_object_event_new();
594 event_id = _evas_event_counter;
595 ev.buttons = e->pointer.button;
596 ev.cur.output.x = e->pointer.x;
597 ev.cur.output.y = e->pointer.y;
598 ev.cur.canvas.x = e->pointer.x;
599 ev.cur.canvas.y = e->pointer.y;
600 ev.prev.output.x = px;
601 ev.prev.output.y = py;
602 ev.prev.canvas.x = px;
603 ev.prev.canvas.y = py;
604 ev.data = (void *)data;
605 ev.modifiers = &(e->modifiers);
606 ev.locks = &(e->locks);
607 ev.timestamp = timestamp;
608 ev.event_flags = e->default_event_flags;
609 copy = evas_event_list_copy(e->pointer.object.in);
610 EINA_LIST_FOREACH(copy, l, obj)
612 ev.cur.canvas.x = e->pointer.x;
613 ev.cur.canvas.y = e->pointer.y;
614 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x,
617 if ((e->events_frozen <= 0) &&
618 (evas_object_clippers_is_visible(obj) ||
619 obj->mouse_grabbed) &&
620 (!evas_event_passes_through(obj)) &&
621 (!evas_event_freezes_through(obj)) &&
622 (!obj->clip.clipees))
624 if ((px != x) || (py != y))
625 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
628 outs = eina_list_append(outs, obj);
629 if (e->delete_me) break;
631 _evas_post_event_callback_call(e);
634 Evas_Event_Mouse_Out ev;
637 _evas_object_event_new();
639 event_id = _evas_event_counter;
640 ev.buttons = e->pointer.button;
641 ev.output.x = e->pointer.x;
642 ev.output.y = e->pointer.y;
643 ev.canvas.x = e->pointer.x;
644 ev.canvas.y = e->pointer.y;
645 ev.data = (void *)data;
646 ev.modifiers = &(e->modifiers);
647 ev.locks = &(e->locks);
648 ev.timestamp = timestamp;
649 ev.event_flags = e->default_event_flags;
651 if (copy) eina_list_free(copy);
657 outs = eina_list_remove(outs, obj);
658 if ((obj->mouse_grabbed == 0) && (!e->delete_me))
660 ev.canvas.x = e->pointer.x;
661 ev.canvas.y = e->pointer.y;
662 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
663 e->pointer.object.in = eina_list_remove(e->pointer.object.in, obj);
669 if (e->events_frozen <= 0)
670 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
675 _evas_post_event_callback_call(e);
682 Evas_Event_Mouse_Move ev;
683 Evas_Event_Mouse_Out ev2;
684 Evas_Event_Mouse_In ev3;
686 int event_id = 0, event_id2 = 0;
688 _evas_object_event_new();
690 event_id = _evas_event_counter;
691 ev.buttons = e->pointer.button;
692 ev.cur.output.x = e->pointer.x;
693 ev.cur.output.y = e->pointer.y;
694 ev.cur.canvas.x = e->pointer.x;
695 ev.cur.canvas.y = e->pointer.y;
696 ev.prev.output.x = px;
697 ev.prev.output.y = py;
698 ev.prev.canvas.x = px;
699 ev.prev.canvas.y = py;
700 ev.data = (void *)data;
701 ev.modifiers = &(e->modifiers);
702 ev.locks = &(e->locks);
703 ev.timestamp = timestamp;
704 ev.event_flags = e->default_event_flags;
706 ev2.buttons = e->pointer.button;
707 ev2.output.x = e->pointer.x;
708 ev2.output.y = e->pointer.y;
709 ev2.canvas.x = e->pointer.x;
710 ev2.canvas.y = e->pointer.y;
711 ev2.data = (void *)data;
712 ev2.modifiers = &(e->modifiers);
713 ev2.locks = &(e->locks);
714 ev2.timestamp = timestamp;
715 ev2.event_flags = e->default_event_flags;
717 ev3.buttons = e->pointer.button;
718 ev3.output.x = e->pointer.x;
719 ev3.output.y = e->pointer.y;
720 ev3.canvas.x = e->pointer.x;
721 ev3.canvas.y = e->pointer.y;
722 ev3.data = (void *)data;
723 ev3.modifiers = &(e->modifiers);
724 ev3.locks = &(e->locks);
725 ev3.timestamp = timestamp;
726 ev3.event_flags = e->default_event_flags;
728 /* get all new in objects */
729 ins = evas_event_objects_event_list(e, NULL, x, y);
730 /* go thru old list of in objects */
731 copy = evas_event_list_copy(e->pointer.object.in);
732 EINA_LIST_FOREACH(copy, l, obj)
734 /* if its under the pointer and its visible and its in the new */
736 // FIXME: i don't think we need this
737 // evas_object_clip_recalc(obj);
738 if ((e->events_frozen <= 0) &&
739 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
740 (evas_object_clippers_is_visible(obj) ||
741 obj->mouse_grabbed) &&
742 eina_list_data_find(ins, obj) &&
743 (!evas_event_passes_through(obj)) &&
744 (!evas_event_freezes_through(obj)) &&
745 (!obj->clip.clipees) &&
746 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
749 if ((px != x) || (py != y))
751 ev.cur.canvas.x = e->pointer.x;
752 ev.cur.canvas.y = e->pointer.y;
753 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
754 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_MOVE, &ev, event_id);
757 /* otherwise it has left the object */
763 ev2.canvas.x = e->pointer.x;
764 ev2.canvas.y = e->pointer.y;
765 _evas_event_havemap_adjust(obj, &ev2.canvas.x, &ev2.canvas.y, obj->mouse_grabbed);
766 if (e->events_frozen <= 0)
767 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev2, event_id);
770 if (e->delete_me) break;
772 _evas_post_event_callback_call(e);
774 _evas_object_event_new();
776 event_id2 = _evas_event_counter;
777 if (copy) copy = eina_list_free(copy);
778 /* go thru our current list of ins */
779 EINA_LIST_FOREACH(ins, l, obj)
781 ev3.canvas.x = e->pointer.x;
782 ev3.canvas.y = e->pointer.y;
783 _evas_event_havemap_adjust(obj, &ev3.canvas.x, &ev3.canvas.y, obj->mouse_grabbed);
784 /* if its not in the old list of ins send an enter event */
785 if (!eina_list_data_find(e->pointer.object.in, obj))
790 if (e->events_frozen <= 0)
791 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev3, event_id2);
794 if (e->delete_me) break;
796 if (e->pointer.mouse_grabbed == 0)
798 /* free our old list of ins */
799 eina_list_free(e->pointer.object.in);
800 /* and set up the new one */
801 e->pointer.object.in = ins;
805 /* free our cur ins */
808 _evas_post_event_callback_call(e);
814 evas_event_feed_mouse_in(Evas *e, unsigned int timestamp, const void *data)
818 Evas_Event_Mouse_In ev;
822 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
825 e->pointer.inside = 1;
827 if (e->events_frozen > 0) return;
828 e->last_timestamp = timestamp;
830 if (e->pointer.mouse_grabbed != 0) return;
832 _evas_object_event_new();
834 event_id = _evas_event_counter;
835 ev.buttons = e->pointer.button;
836 ev.output.x = e->pointer.x;
837 ev.output.y = e->pointer.y;
838 ev.canvas.x = e->pointer.x;
839 ev.canvas.y = e->pointer.y;
840 ev.data = (void *)data;
841 ev.modifiers = &(e->modifiers);
842 ev.locks = &(e->locks);
843 ev.timestamp = timestamp;
844 ev.event_flags = e->default_event_flags;
847 /* get new list of ins */
848 ins = evas_event_objects_event_list(e, NULL, e->pointer.x, e->pointer.y);
849 EINA_LIST_FOREACH(ins, l, obj)
851 ev.canvas.x = e->pointer.x;
852 ev.canvas.y = e->pointer.y;
853 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
854 if (!eina_list_data_find(e->pointer.object.in, obj))
859 if (e->events_frozen <= 0)
860 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_IN, &ev, event_id);
863 if (e->delete_me) break;
865 /* free our old list of ins */
866 e->pointer.object.in = eina_list_free(e->pointer.object.in);
867 /* and set up the new one */
868 e->pointer.object.in = ins;
869 _evas_post_event_callback_call(e);
870 evas_event_feed_mouse_move(e, e->pointer.x, e->pointer.y, timestamp, data);
875 evas_event_feed_mouse_out(Evas *e, unsigned int timestamp, const void *data)
877 Evas_Event_Mouse_Out ev;
880 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
883 e->pointer.inside = 0;
885 if (e->events_frozen > 0) return;
886 e->last_timestamp = timestamp;
888 _evas_object_event_new();
890 event_id = _evas_event_counter;
891 ev.buttons = e->pointer.button;
892 ev.output.x = e->pointer.x;
893 ev.output.y = e->pointer.y;
894 ev.canvas.x = e->pointer.x;
895 ev.canvas.y = e->pointer.y;
896 ev.data = (void *)data;
897 ev.modifiers = &(e->modifiers);
898 ev.locks = &(e->locks);
899 ev.timestamp = timestamp;
900 ev.event_flags = e->default_event_flags;
903 /* if our mouse button is grabbed to any objects */
904 if (e->pointer.mouse_grabbed == 0)
906 /* go thru old list of in objects */
910 copy = evas_event_list_copy(e->pointer.object.in);
911 EINA_LIST_FOREACH(copy, l, obj)
913 ev.canvas.x = e->pointer.x;
914 ev.canvas.y = e->pointer.y;
915 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
921 if (e->events_frozen <= 0)
922 evas_object_event_callback_call(obj, EVAS_CALLBACK_MOUSE_OUT, &ev, event_id);
925 if (e->delete_me) break;
927 if (copy) copy = eina_list_free(copy);
928 /* free our old list of ins */
929 e->pointer.object.in = eina_list_free(e->pointer.object.in);
930 _evas_post_event_callback_call(e);
936 evas_event_feed_multi_down(Evas *e,
938 double rad, double radx, double rady,
939 double pres, double ang,
940 double fx, double fy,
941 Evas_Button_Flags flags, unsigned int timestamp,
945 Evas_Event_Multi_Down ev;
950 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
955 if (e->events_frozen > 0) return;
956 e->last_timestamp = timestamp;
958 _evas_object_event_new();
960 event_id = _evas_event_counter;
973 ev.data = (void *)data;
974 ev.modifiers = &(e->modifiers);
975 ev.locks = &(e->locks);
977 ev.timestamp = timestamp;
978 ev.event_flags = e->default_event_flags;
981 /* append new touch point to the touch point list */
982 _evas_touch_point_append(e, d, x, y);
983 if (e->pointer.mouse_grabbed == 0)
985 if (e->pointer.downs > 1) addgrab = e->pointer.downs - 1;
987 copy = evas_event_list_copy(e->pointer.object.in);
988 EINA_LIST_FOREACH(copy, l, obj)
990 if (obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB)
992 obj->mouse_grabbed += addgrab + 1;
993 e->pointer.mouse_grabbed += addgrab + 1;
996 EINA_LIST_FOREACH(copy, l, obj)
1000 ev.canvas.xsub = fx;
1001 ev.canvas.ysub = fy;
1002 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1003 if (x != ev.canvas.x)
1004 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1005 if (y != ev.canvas.y)
1006 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1007 if (e->events_frozen <= 0)
1008 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_DOWN, &ev, event_id);
1009 if (e->delete_me) break;
1011 if (copy) eina_list_free(copy);
1012 _evas_post_event_callback_call(e);
1013 /* update touch point's state to EVAS_TOUCH_POINT_STILL */
1014 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_STILL);
1019 evas_event_feed_multi_up(Evas *e,
1020 int d, int x, int y,
1021 double rad, double radx, double rady,
1022 double pres, double ang,
1023 double fx, double fy,
1024 Evas_Button_Flags flags, unsigned int timestamp,
1027 Eina_List *l, *copy;
1028 Evas_Event_Multi_Up ev;
1032 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1037 if (e->events_frozen > 0) return;
1038 e->last_timestamp = timestamp;
1040 _evas_object_event_new();
1042 event_id = _evas_event_counter;
1053 ev.canvas.xsub = fx;
1054 ev.canvas.ysub = fy;
1055 ev.data = (void *)data;
1056 ev.modifiers = &(e->modifiers);
1057 ev.locks = &(e->locks);
1059 ev.timestamp = timestamp;
1060 ev.event_flags = e->default_event_flags;
1063 /* update released touch point */
1064 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_UP);
1065 copy = evas_event_list_copy(e->pointer.object.in);
1066 EINA_LIST_FOREACH(copy, l, obj)
1070 ev.canvas.xsub = fx;
1071 ev.canvas.ysub = fy;
1072 _evas_event_havemap_adjust(obj, &ev.canvas.x, &ev.canvas.y, obj->mouse_grabbed);
1073 if (x != ev.canvas.x)
1074 ev.canvas.xsub = ev.canvas.x; // fixme - lost precision
1075 if (y != ev.canvas.y)
1076 ev.canvas.ysub = ev.canvas.y; // fixme - lost precision
1077 if ((obj->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) &&
1078 (obj->mouse_grabbed > 0))
1080 obj->mouse_grabbed--;
1081 e->pointer.mouse_grabbed--;
1083 if (e->events_frozen <= 0)
1084 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_UP, &ev, event_id);
1085 if (e->delete_me) break;
1087 if (copy) copy = eina_list_free(copy);
1088 if ((e->pointer.mouse_grabbed == 0) && !_post_up_handle(e, timestamp, data))
1089 _evas_post_event_callback_call(e);
1090 /* remove released touch point from the touch point list */
1091 _evas_touch_point_remove(e, d);
1096 evas_event_feed_multi_move(Evas *e,
1097 int d, int x, int y,
1098 double rad, double radx, double rady,
1099 double pres, double ang,
1100 double fx, double fy,
1101 unsigned int timestamp, const void *data)
1103 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1107 if (e->events_frozen > 0) return;
1108 e->last_timestamp = timestamp;
1110 if (!e->pointer.inside) return;
1113 /* update moved touch point */
1114 _evas_touch_point_update(e, d, x, y, EVAS_TOUCH_POINT_MOVE);
1115 /* if our mouse button is grabbed to any objects */
1116 if (e->pointer.mouse_grabbed > 0)
1118 /* go thru old list of in objects */
1119 Eina_List *l, *copy;
1120 Evas_Event_Multi_Move ev;
1124 _evas_object_event_new();
1126 event_id = _evas_event_counter;
1128 ev.cur.output.x = x;
1129 ev.cur.output.y = y;
1130 ev.cur.canvas.x = x;
1131 ev.cur.canvas.y = y;
1137 ev.cur.canvas.xsub = fx;
1138 ev.cur.canvas.ysub = fy;
1139 ev.data = (void *)data;
1140 ev.modifiers = &(e->modifiers);
1141 ev.locks = &(e->locks);
1142 ev.timestamp = timestamp;
1143 ev.event_flags = e->default_event_flags;
1145 copy = evas_event_list_copy(e->pointer.object.in);
1146 EINA_LIST_FOREACH(copy, l, obj)
1148 if ((e->events_frozen <= 0) &&
1149 (evas_object_clippers_is_visible(obj) || obj->mouse_grabbed) &&
1150 (!evas_event_passes_through(obj)) &&
1151 (!evas_event_freezes_through(obj)) &&
1152 (!obj->clip.clipees))
1154 ev.cur.canvas.x = x;
1155 ev.cur.canvas.y = y;
1156 ev.cur.canvas.xsub = fx;
1157 ev.cur.canvas.ysub = fy;
1158 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1159 if (x != ev.cur.canvas.x)
1160 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1161 if (y != ev.cur.canvas.y)
1162 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1163 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1165 if (e->delete_me) break;
1167 _evas_post_event_callback_call(e);
1172 Eina_List *l, *copy;
1173 Evas_Event_Multi_Move ev;
1177 _evas_object_event_new();
1179 event_id = _evas_event_counter;
1181 ev.cur.output.x = x;
1182 ev.cur.output.y = y;
1183 ev.cur.canvas.x = x;
1184 ev.cur.canvas.y = y;
1190 ev.cur.canvas.xsub = fx;
1191 ev.cur.canvas.ysub = fy;
1192 ev.data = (void *)data;
1193 ev.modifiers = &(e->modifiers);
1194 ev.locks = &(e->locks);
1195 ev.timestamp = timestamp;
1196 ev.event_flags = e->default_event_flags;
1198 /* get all new in objects */
1199 ins = evas_event_objects_event_list(e, NULL, x, y);
1200 /* go thru old list of in objects */
1201 copy = evas_event_list_copy(e->pointer.object.in);
1202 EINA_LIST_FOREACH(copy, l, obj)
1204 /* if its under the pointer and its visible and its in the new */
1206 // FIXME: i don't think we need this
1207 // evas_object_clip_recalc(obj);
1208 if ((e->events_frozen <= 0) &&
1209 evas_object_is_in_output_rect(obj, x, y, 1, 1) &&
1210 (evas_object_clippers_is_visible(obj) ||
1211 obj->mouse_grabbed) &&
1212 eina_list_data_find(ins, obj) &&
1213 (!evas_event_passes_through(obj)) &&
1214 (!evas_event_freezes_through(obj)) &&
1215 (!obj->clip.clipees) &&
1216 ((!obj->precise_is_inside) || evas_object_is_inside(obj, x, y))
1219 ev.cur.canvas.x = x;
1220 ev.cur.canvas.y = y;
1221 ev.cur.canvas.xsub = fx;
1222 ev.cur.canvas.ysub = fy;
1223 _evas_event_havemap_adjust(obj, &ev.cur.canvas.x, &ev.cur.canvas.y, obj->mouse_grabbed);
1224 if (x != ev.cur.canvas.x)
1225 ev.cur.canvas.xsub = ev.cur.canvas.x; // fixme - lost precision
1226 if (y != ev.cur.canvas.y)
1227 ev.cur.canvas.ysub = ev.cur.canvas.y; // fixme - lost precision
1228 evas_object_event_callback_call(obj, EVAS_CALLBACK_MULTI_MOVE, &ev, event_id);
1230 if (e->delete_me) break;
1232 if (copy) copy = eina_list_free(copy);
1233 if (e->pointer.mouse_grabbed == 0)
1235 /* free our old list of ins */
1236 eina_list_free(e->pointer.object.in);
1237 /* and set up the new one */
1238 e->pointer.object.in = ins;
1242 /* free our cur ins */
1243 eina_list_free(ins);
1245 _evas_post_event_callback_call(e);
1251 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)
1254 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1258 if (!keyname) return;
1259 if (e->events_frozen > 0) return;
1260 e->last_timestamp = timestamp;
1263 Evas_Event_Key_Down ev;
1264 Eina_Bool exclusive;
1266 _evas_object_event_new();
1268 event_id = _evas_event_counter;
1269 exclusive = EINA_FALSE;
1270 ev.keyname = (char *)keyname;
1271 ev.data = (void *)data;
1272 ev.modifiers = &(e->modifiers);
1273 ev.locks = &(e->locks);
1276 ev.compose = compose;
1277 ev.timestamp = timestamp;
1278 ev.event_flags = e->default_event_flags;
1286 EINA_LIST_FOREACH(e->grabs, l, g)
1290 g->just_added = EINA_FALSE;
1293 if (g->delete_me) continue;
1294 if (((e->modifiers.mask & g->modifiers) ||
1295 (g->modifiers == e->modifiers.mask)) &&
1296 (!strcmp(keyname, g->keyname)))
1298 if (!(e->modifiers.mask & g->not_modifiers))
1300 if (e->events_frozen <= 0 &&
1301 !evas_event_freezes_through(g->object))
1302 evas_object_event_callback_call(g->object,
1303 EVAS_CALLBACK_KEY_DOWN,
1305 if (g->exclusive) exclusive = EINA_TRUE;
1308 if (e->delete_me) break;
1311 if (e->walking_grabs <= 0)
1313 while (e->delete_grabs > 0)
1316 for (l = e->grabs; l;)
1318 g = eina_list_data_get(l);
1319 l = eina_list_next(l);
1321 evas_key_grab_free(g->object, g->keyname, g->modifiers,
1327 if ((e->focused) && (!exclusive))
1329 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1330 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_DOWN,
1333 _evas_post_event_callback_call(e);
1338 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)
1341 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1344 if (!keyname) return;
1345 if (e->events_frozen > 0) return;
1346 e->last_timestamp = timestamp;
1349 Evas_Event_Key_Up ev;
1350 Eina_Bool exclusive;
1352 _evas_object_event_new();
1354 event_id = _evas_event_counter;
1355 exclusive = EINA_FALSE;
1356 ev.keyname = (char *)keyname;
1357 ev.data = (void *)data;
1358 ev.modifiers = &(e->modifiers);
1359 ev.locks = &(e->locks);
1362 ev.compose = compose;
1363 ev.timestamp = timestamp;
1364 ev.event_flags = e->default_event_flags;
1372 EINA_LIST_FOREACH(e->grabs, l, g)
1376 g->just_added = EINA_FALSE;
1379 if (g->delete_me) continue;
1380 if (((e->modifiers.mask & g->modifiers) ||
1381 (g->modifiers == e->modifiers.mask)) &&
1382 (!((e->modifiers.mask & g->not_modifiers) ||
1383 (g->not_modifiers == ~e->modifiers.mask))) &&
1384 (!strcmp(keyname, g->keyname)))
1386 if (e->events_frozen <= 0 &&
1387 !evas_event_freezes_through(g->object))
1388 evas_object_event_callback_call(g->object,
1389 EVAS_CALLBACK_KEY_UP, &ev, event_id);
1390 if (g->exclusive) exclusive = EINA_TRUE;
1392 if (e->delete_me) break;
1395 if (e->walking_grabs <= 0)
1397 while (e->delete_grabs > 0)
1399 Eina_List *ll, *l_next;
1403 EINA_LIST_FOREACH_SAFE(e->grabs, ll, l_next, gr)
1406 evas_key_grab_free(gr->object, gr->keyname,
1407 gr->modifiers, gr->not_modifiers);
1412 if ((e->focused) && (!exclusive))
1414 if (e->events_frozen <= 0 && !evas_event_freezes_through(e->focused))
1415 evas_object_event_callback_call(e->focused, EVAS_CALLBACK_KEY_UP,
1418 _evas_post_event_callback_call(e);
1423 evas_event_feed_hold(Evas *e, int hold, unsigned int timestamp, const void *data)
1425 Eina_List *l, *copy;
1430 MAGIC_CHECK(e, Evas, MAGIC_EVAS);
1434 if (e->events_frozen > 0) return;
1435 e->last_timestamp = timestamp;
1437 _evas_object_event_new();
1439 event_id = _evas_event_counter;
1441 ev.data = (void *)data;
1442 ev.timestamp = timestamp;
1443 ev.event_flags = e->default_event_flags;
1446 copy = evas_event_list_copy(e->pointer.object.in);
1447 EINA_LIST_FOREACH(copy, l, obj)
1449 if ((e->events_frozen <= 0) && !evas_event_freezes_through(obj))
1450 evas_object_event_callback_call(obj, EVAS_CALLBACK_HOLD, &ev, event_id);
1451 if (e->delete_me) break;
1453 if (copy) copy = eina_list_free(copy);
1454 _evas_post_event_callback_call(e);
1456 _evas_object_event_new();
1460 evas_object_freeze_events_set(Evas_Object *obj, Eina_Bool freeze)
1462 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1467 if (obj->freeze_events == freeze) return;
1468 obj->freeze_events = freeze;
1469 evas_object_smart_member_cache_invalidate(obj, EINA_FALSE, EINA_TRUE);
1470 if (evas_object_is_in_output_rect(obj,
1471 obj->layer->evas->pointer.x,
1472 obj->layer->evas->pointer.y, 1, 1) &&
1473 ((!obj->precise_is_inside) ||
1474 (evas_object_is_inside(obj,
1475 obj->layer->evas->pointer.x,
1476 obj->layer->evas->pointer.y))))
1477 evas_event_feed_mouse_move(obj->layer->evas,
1478 obj->layer->evas->pointer.x,
1479 obj->layer->evas->pointer.y,
1480 obj->layer->evas->last_timestamp,
1485 evas_object_freeze_events_get(const Evas_Object *obj)
1487 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1490 return obj->freeze_events;
1494 evas_object_pass_events_set(Evas_Object *obj, Eina_Bool pass)
1496 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1500 if (obj->pass_events == pass) return;
1501 obj->pass_events = pass;
1502 evas_object_smart_member_cache_invalidate(obj, EINA_TRUE, EINA_FALSE);
1503 if (evas_object_is_in_output_rect(obj,
1504 obj->layer->evas->pointer.x,
1505 obj->layer->evas->pointer.y, 1, 1) &&
1506 ((!obj->precise_is_inside) ||
1507 (evas_object_is_inside(obj,
1508 obj->layer->evas->pointer.x,
1509 obj->layer->evas->pointer.y))))
1510 evas_event_feed_mouse_move(obj->layer->evas,
1511 obj->layer->evas->pointer.x,
1512 obj->layer->evas->pointer.y,
1513 obj->layer->evas->last_timestamp,
1518 evas_object_pass_events_get(const Evas_Object *obj)
1520 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1523 return obj->pass_events;
1527 evas_object_repeat_events_set(Evas_Object *obj, Eina_Bool repeat)
1529 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1533 if (obj->repeat_events == repeat) return;
1534 obj->repeat_events = repeat;
1535 if (evas_object_is_in_output_rect(obj,
1536 obj->layer->evas->pointer.x,
1537 obj->layer->evas->pointer.y, 1, 1) &&
1538 ((!obj->precise_is_inside) ||
1539 (evas_object_is_inside(obj,
1540 obj->layer->evas->pointer.x,
1541 obj->layer->evas->pointer.y))))
1542 evas_event_feed_mouse_move(obj->layer->evas,
1543 obj->layer->evas->pointer.x,
1544 obj->layer->evas->pointer.y,
1545 obj->layer->evas->last_timestamp,
1550 evas_object_repeat_events_get(const Evas_Object *obj)
1552 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1555 return obj->repeat_events;
1559 evas_object_propagate_events_set(Evas_Object *obj, Eina_Bool prop)
1561 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1564 obj->no_propagate = !prop;
1568 evas_object_propagate_events_get(const Evas_Object *obj)
1570 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1573 return !(obj->no_propagate);
1577 evas_object_pointer_mode_set(Evas_Object *obj, Evas_Object_Pointer_Mode setting)
1579 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1582 obj->pointer_mode = setting;
1585 EAPI Evas_Object_Pointer_Mode
1586 evas_object_pointer_mode_get(const Evas_Object *obj)
1588 MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
1589 return EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
1591 return obj->pointer_mode;
1595 evas_event_refeed_event(Evas *e, void *event_copy, Evas_Callback_Type event_type)
1599 case EVAS_CALLBACK_MOUSE_IN:
1601 Evas_Event_Mouse_In *ev = event_copy;
1602 evas_event_feed_mouse_in(e, ev->timestamp, ev->data);
1605 case EVAS_CALLBACK_MOUSE_OUT:
1607 Evas_Event_Mouse_Out *ev = event_copy;
1608 evas_event_feed_mouse_out(e, ev->timestamp, ev->data);
1611 case EVAS_CALLBACK_MOUSE_DOWN:
1613 Evas_Event_Mouse_Down *ev = event_copy;
1614 evas_event_feed_mouse_down(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1617 case EVAS_CALLBACK_MOUSE_UP:
1619 Evas_Event_Mouse_Up *ev = event_copy;
1620 evas_event_feed_mouse_up(e, ev->button, ev->flags, ev-> timestamp, ev->data);
1623 case EVAS_CALLBACK_MOUSE_MOVE:
1625 Evas_Event_Mouse_Move *ev = event_copy;
1626 evas_event_feed_mouse_move(e, ev->cur.canvas.x, ev->cur.canvas.y, ev->timestamp, ev->data);
1629 case EVAS_CALLBACK_MOUSE_WHEEL:
1631 Evas_Event_Mouse_Wheel *ev = event_copy;
1632 evas_event_feed_mouse_wheel(e, ev->direction, ev-> z, ev->timestamp, ev->data);
1635 case EVAS_CALLBACK_MULTI_DOWN:
1637 Evas_Event_Multi_Down *ev = event_copy;
1638 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);
1641 case EVAS_CALLBACK_MULTI_UP:
1643 Evas_Event_Multi_Up *ev = event_copy;
1644 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);
1647 case EVAS_CALLBACK_MULTI_MOVE:
1649 Evas_Event_Multi_Move *ev = event_copy;
1650 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);
1653 case EVAS_CALLBACK_KEY_DOWN:
1655 Evas_Event_Key_Down *ev = event_copy;
1656 evas_event_feed_key_down(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1659 case EVAS_CALLBACK_KEY_UP:
1661 Evas_Event_Key_Up *ev = event_copy;
1662 evas_event_feed_key_up(e, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, ev->data);
1665 default: /* All non-input events are not handeled */