6 #include "ecore_private.h"
7 #include <Ecore_Input.h>
9 #include "ecore_evas_private.h"
10 #include "Ecore_Evas.h"
12 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
13 static int _ecore_evas_init_count = 0;
16 _ecore_evas_buffer_init(void)
18 _ecore_evas_init_count++;
19 return _ecore_evas_init_count;
23 _ecore_evas_buffer_free(Ecore_Evas *ee)
25 if (ee->engine.buffer.image)
29 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
30 evas_object_del(ee->engine.buffer.image);
31 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
35 ee->engine.buffer.free_func(ee->engine.buffer.data,
36 ee->engine.buffer.pixels);
38 _ecore_evas_buffer_shutdown();
42 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
44 Evas_Engine_Info_Buffer *einfo;
49 if ((w == ee->w) && (h == ee->h)) return;
52 evas_output_size_set(ee->evas, ee->w, ee->h);
53 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
54 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
56 if (ee->engine.buffer.image)
58 ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
59 stride = evas_object_image_stride_get(ee->engine.buffer.image);
63 if (ee->engine.buffer.pixels)
64 ee->engine.buffer.free_func(ee->engine.buffer.data,
65 ee->engine.buffer.pixels);
66 ee->engine.buffer.pixels =
67 ee->engine.buffer.alloc_func(ee->engine.buffer.data,
68 ee->w * ee->h * sizeof(int));
69 stride = ee->w * sizeof(int);
72 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
75 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
76 einfo->info.dest_buffer = ee->engine.buffer.pixels;
77 einfo->info.dest_buffer_row_bytes = stride;
78 einfo->info.use_color_key = 0;
79 einfo->info.alpha_threshold = 0;
80 einfo->info.func.new_update_region = NULL;
81 einfo->info.func.free_update_region = NULL;
82 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
84 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
87 if (ee->func.fn_resize) ee->func.fn_resize(ee);
91 _ecore_evas_buffer_shutdown(void)
93 _ecore_evas_init_count--;
94 if (_ecore_evas_init_count == 0)
97 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
98 return _ecore_evas_init_count;
102 _ecore_evas_buffer_render(Ecore_Evas *ee)
104 Eina_List *updates, *l, *ll;
108 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
110 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
111 rend |= _ecore_evas_buffer_render(ee2);
112 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
114 if (ee->engine.buffer.image)
118 evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
119 if ((w != ee->w) || (h != ee->h))
120 _ecore_evas_resize(ee, w, h);
122 updates = evas_render_updates(ee->evas);
123 if (ee->engine.buffer.image)
127 EINA_LIST_FOREACH(updates, l, r)
128 evas_object_image_data_update_add(ee->engine.buffer.image,
129 r->x, r->y, r->w, r->h);
133 evas_render_updates_free(updates);
134 _ecore_evas_idle_timeout_update(ee);
137 return updates ? 1 : rend;
141 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
143 Evas_Coord xx, yy, fx, fy, fw, fh;
145 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
146 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
150 while (xx < 0) xx += fw;
151 while (xx > fw) xx -= fw;
152 *x = (ee->w * xx) / fw;
156 while (yy < 0) yy += fh;
157 while (yy > fh) yy -= fh;
158 *y = (ee->h * yy) / fh;
162 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
165 Evas_Event_Mouse_In *ev;
169 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
173 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
176 Evas_Event_Mouse_Out *ev;
180 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
184 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
187 Evas_Event_Mouse_Down *ev;
191 evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
195 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
198 Evas_Event_Mouse_Up *ev;
202 evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
206 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
209 Evas_Event_Mouse_Move *ev;
214 x = ev->cur.canvas.x;
215 y = ev->cur.canvas.y;
216 _ecore_evas_buffer_coord_translate(ee, &x, &y);
217 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
221 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
224 Evas_Event_Mouse_Wheel *ev;
228 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
232 _ecore_evas_buffer_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
235 Evas_Event_Multi_Down *ev;
236 Evas_Coord x, y, xx, yy;
245 _ecore_evas_buffer_coord_translate(ee, &x, &y);
246 xf = (ev->canvas.xsub - (double)xx) + (double)x;
247 yf = (ev->canvas.ysub - (double)yy) + (double)y;
248 evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
252 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
255 Evas_Event_Multi_Up *ev;
256 Evas_Coord x, y, xx, yy;
265 _ecore_evas_buffer_coord_translate(ee, &x, &y);
266 xf = (ev->canvas.xsub - (double)xx) + (double)x;
267 yf = (ev->canvas.ysub - (double)yy) + (double)y;
268 evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->flags, ev->timestamp, NULL);
272 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
275 Evas_Event_Multi_Move *ev;
276 Evas_Coord x, y, xx, yy;
281 x = ev->cur.canvas.x;
282 y = ev->cur.canvas.y;
285 _ecore_evas_buffer_coord_translate(ee, &x, &y);
286 xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
287 yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
288 evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->pressure, ev->angle, xf, yf, ev->timestamp, NULL);
292 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
297 if (ee->driver) _ecore_evas_free(ee);
301 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
304 Evas_Event_Key_Down *ev;
308 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
309 evas_key_modifier_on(e, "Shift");
311 evas_key_modifier_off(e, "Shift");
312 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
313 evas_key_modifier_on(e, "Control");
315 evas_key_modifier_off(e, "Control");
316 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
317 evas_key_modifier_on(e, "Alt");
319 evas_key_modifier_off(e, "Alt");
320 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
321 evas_key_modifier_on(e, "Meta");
323 evas_key_modifier_off(e, "Meta");
324 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
325 evas_key_modifier_on(e, "Hyper");
327 evas_key_modifier_off(e, "Hyper");
328 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
329 evas_key_modifier_on(e, "Super");
331 evas_key_modifier_off(e, "Super");
332 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
333 evas_key_lock_on(e, "Scroll_Lock");
335 evas_key_lock_off(e, "Scroll_Lock");
336 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
337 evas_key_lock_on(e, "Num_Lock");
339 evas_key_lock_off(e, "Num_Lock");
340 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
341 evas_key_lock_on(e, "Caps_Lock");
343 evas_key_lock_off(e, "Caps_Lock");
344 evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
348 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
351 Evas_Event_Key_Up *ev;
355 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
356 evas_key_modifier_on(e, "Shift");
358 evas_key_modifier_off(e, "Shift");
359 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
360 evas_key_modifier_on(e, "Control");
362 evas_key_modifier_off(e, "Control");
363 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
364 evas_key_modifier_on(e, "Alt");
366 evas_key_modifier_off(e, "Alt");
367 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
368 evas_key_modifier_on(e, "Meta");
370 evas_key_modifier_off(e, "Meta");
371 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
372 evas_key_modifier_on(e, "Hyper");
374 evas_key_modifier_off(e, "Hyper");
375 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
376 evas_key_modifier_on(e, "Super");
378 evas_key_modifier_off(e, "Super");
379 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
380 evas_key_lock_on(e, "Scroll_Lock");
382 evas_key_lock_off(e, "Scroll_Lock");
383 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
384 evas_key_lock_on(e, "Num_Lock");
386 evas_key_lock_off(e, "Num_Lock");
387 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
388 evas_key_lock_on(e, "Caps_Lock");
390 evas_key_lock_off(e, "Caps_Lock");
391 evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
395 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
400 ee->prop.focused = 1;
401 evas_focus_in(ee->evas);
402 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
406 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
411 ee->prop.focused = 0;
412 evas_focus_out(ee->evas);
413 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
417 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
423 if (ee->func.fn_show) ee->func.fn_show(ee);
427 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
433 if (ee->func.fn_hide) ee->func.fn_hide(ee);
436 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
438 _ecore_evas_buffer_free,
490 _ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
496 _ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
504 * FIXME: To be fixed.
507 ecore_evas_buffer_new(int w, int h)
509 return ecore_evas_buffer_allocfunc_new
510 (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
514 ecore_evas_buffer_allocfunc_new(int w, int h, void *(*alloc_func) (void *data, int size), void (*free_func) (void *data, void *pix), const void *data)
516 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
517 Evas_Engine_Info_Buffer *einfo;
521 if ((!alloc_func) || (!free_func)) return NULL;
522 rmethod = evas_render_method_lookup("buffer");
523 if (!rmethod) return NULL;
524 ee = calloc(1, sizeof(Ecore_Evas));
525 if (!ee) return NULL;
527 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
529 _ecore_evas_buffer_init();
531 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
532 ee->engine.buffer.alloc_func = alloc_func;
533 ee->engine.buffer.free_func = free_func;
534 ee->engine.buffer.data = (void *)data;
536 ee->driver = "buffer";
548 ee->prop.focused = 1;
549 ee->prop.borderless = 1;
550 ee->prop.override = 1;
551 ee->prop.maximized = 1;
552 ee->prop.fullscreen = 0;
553 ee->prop.withdrawn = 0;
557 ee->evas = evas_new();
558 evas_data_attach_set(ee->evas, ee);
559 evas_output_method_set(ee->evas, rmethod);
560 evas_output_size_set(ee->evas, w, h);
561 evas_output_viewport_set(ee->evas, 0, 0, w, h);
563 ee->engine.buffer.pixels =
564 ee->engine.buffer.alloc_func
565 (ee->engine.buffer.data, w * h * sizeof(int));
567 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
570 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
571 einfo->info.dest_buffer = ee->engine.buffer.pixels;
572 einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
573 einfo->info.use_color_key = 0;
574 einfo->info.alpha_threshold = 0;
575 einfo->info.func.new_update_region = NULL;
576 einfo->info.func.free_update_region = NULL;
577 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
579 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
582 evas_key_modifier_add(ee->evas, "Shift");
583 evas_key_modifier_add(ee->evas, "Control");
584 evas_key_modifier_add(ee->evas, "Alt");
585 evas_key_modifier_add(ee->evas, "Meta");
586 evas_key_modifier_add(ee->evas, "Hyper");
587 evas_key_modifier_add(ee->evas, "Super");
588 evas_key_lock_add(ee->evas, "Caps_Lock");
589 evas_key_lock_add(ee->evas, "Num_Lock");
590 evas_key_lock_add(ee->evas, "Scroll_Lock");
592 evas_event_feed_mouse_in(ee->evas, 0, NULL);
594 ee->engine.func->fn_render = _ecore_evas_buffer_render;
595 _ecore_evas_register(ee);
604 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
606 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
607 _ecore_evas_buffer_render(ee);
608 return ee->engine.buffer.pixels;
615 ecore_evas_object_image_new(Ecore_Evas *ee_target)
617 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
619 Evas_Engine_Info_Buffer *einfo;
624 rmethod = evas_render_method_lookup("buffer");
625 if (!rmethod) return NULL;
626 ee = calloc(1, sizeof(Ecore_Evas));
627 if (!ee) return NULL;
629 o = evas_object_image_add(ee_target->evas);
631 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
633 _ecore_evas_buffer_init();
635 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
637 ee->driver = "buffer";
649 ee->prop.focused = 0;
650 ee->prop.borderless = 1;
651 ee->prop.override = 1;
652 ee->prop.maximized = 0;
653 ee->prop.fullscreen = 0;
654 ee->prop.withdrawn = 0;
658 ee->evas = evas_new();
659 evas_data_attach_set(ee->evas, ee);
660 evas_output_method_set(ee->evas, rmethod);
661 evas_output_size_set(ee->evas, w, h);
662 evas_output_viewport_set(ee->evas, 0, 0, w, h);
664 ee->engine.buffer.image = o;
665 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
666 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
667 evas_object_image_size_set(o, ee->w, ee->h);
668 evas_object_image_alpha_set(o, 1);
669 ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
670 evas_object_image_data_set(o, ee->engine.buffer.pixels);
671 evas_object_event_callback_add(ee->engine.buffer.image,
672 EVAS_CALLBACK_MOUSE_IN,
673 _ecore_evas_buffer_cb_mouse_in, ee);
674 evas_object_event_callback_add(ee->engine.buffer.image,
675 EVAS_CALLBACK_MOUSE_OUT,
676 _ecore_evas_buffer_cb_mouse_out, ee);
677 evas_object_event_callback_add(ee->engine.buffer.image,
678 EVAS_CALLBACK_MOUSE_DOWN,
679 _ecore_evas_buffer_cb_mouse_down, ee);
680 evas_object_event_callback_add(ee->engine.buffer.image,
681 EVAS_CALLBACK_MOUSE_UP,
682 _ecore_evas_buffer_cb_mouse_up, ee);
683 evas_object_event_callback_add(ee->engine.buffer.image,
684 EVAS_CALLBACK_MOUSE_MOVE,
685 _ecore_evas_buffer_cb_mouse_move, ee);
686 evas_object_event_callback_add(ee->engine.buffer.image,
687 EVAS_CALLBACK_MOUSE_WHEEL,
688 _ecore_evas_buffer_cb_mouse_wheel, ee);
689 evas_object_event_callback_add(ee->engine.buffer.image,
690 EVAS_CALLBACK_MULTI_DOWN,
691 _ecore_evas_buffer_cb_multi_down, ee);
692 evas_object_event_callback_add(ee->engine.buffer.image,
693 EVAS_CALLBACK_MULTI_UP,
694 _ecore_evas_buffer_cb_multi_up, ee);
695 evas_object_event_callback_add(ee->engine.buffer.image,
696 EVAS_CALLBACK_MULTI_MOVE,
697 _ecore_evas_buffer_cb_multi_move, ee);
698 evas_object_event_callback_add(ee->engine.buffer.image,
700 _ecore_evas_buffer_cb_free, ee);
701 evas_object_event_callback_add(ee->engine.buffer.image,
702 EVAS_CALLBACK_KEY_DOWN,
703 _ecore_evas_buffer_cb_key_down, ee);
704 evas_object_event_callback_add(ee->engine.buffer.image,
705 EVAS_CALLBACK_KEY_UP,
706 _ecore_evas_buffer_cb_key_up, ee);
707 evas_object_event_callback_add(ee->engine.buffer.image,
708 EVAS_CALLBACK_FOCUS_IN,
709 _ecore_evas_buffer_cb_focus_in, ee);
710 evas_object_event_callback_add(ee->engine.buffer.image,
711 EVAS_CALLBACK_FOCUS_OUT,
712 _ecore_evas_buffer_cb_focus_out, ee);
713 evas_object_event_callback_add(ee->engine.buffer.image,
715 _ecore_evas_buffer_cb_show, ee);
716 evas_object_event_callback_add(ee->engine.buffer.image,
718 _ecore_evas_buffer_cb_hide, ee);
719 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
722 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
723 einfo->info.dest_buffer = ee->engine.buffer.pixels;
724 einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
725 einfo->info.use_color_key = 0;
726 einfo->info.alpha_threshold = 0;
727 einfo->info.func.new_update_region = NULL;
728 einfo->info.func.free_update_region = NULL;
729 if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
731 ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
734 evas_key_modifier_add(ee->evas, "Shift");
735 evas_key_modifier_add(ee->evas, "Control");
736 evas_key_modifier_add(ee->evas, "Alt");
737 evas_key_modifier_add(ee->evas, "Meta");
738 evas_key_modifier_add(ee->evas, "Hyper");
739 evas_key_modifier_add(ee->evas, "Super");
740 evas_key_lock_add(ee->evas, "Caps_Lock");
741 evas_key_lock_add(ee->evas, "Num_Lock");
742 evas_key_lock_add(ee->evas, "Scroll_Lock");
744 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
746 ee->engine.func->fn_render = _ecore_evas_buffer_render;