6 #include <Ecore_Input.h>
8 #include "ecore_private.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;
15 static int _ecore_evas_fps_debug = 0;
17 static Ecore_Evas *ecore_evases = NULL;
20 _ecore_evas_buffer_init(void)
22 _ecore_evas_init_count++;
23 if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
24 if (getenv("ECORE_EVAS_FPS_DEBUG")) _ecore_evas_fps_debug = 1;
25 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_init();
26 return _ecore_evas_init_count;
30 _ecore_evas_buffer_free(Ecore_Evas *ee)
32 if (ee->engine.buffer.image)
36 ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
37 evas_object_del(ee->engine.buffer.image);
38 ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
42 ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
44 free(ee->engine.buffer.pixels);
46 _ecore_evas_buffer_shutdown();
50 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
52 Evas_Engine_Info_Buffer *einfo;
56 if ((w == ee->w) && (h == ee->h)) return;
59 evas_output_size_set(ee->evas, ee->w, ee->h);
60 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
61 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
63 if (ee->engine.buffer.image)
65 ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
69 if (ee->engine.buffer.pixels) free(ee->engine.buffer.pixels);
70 ee->engine.buffer.pixels = malloc(ee->w * ee->h * sizeof(int));
73 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
76 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
77 einfo->info.dest_buffer = ee->engine.buffer.pixels;
78 einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
79 einfo->info.use_color_key = 0;
80 einfo->info.alpha_threshold = 0;
81 einfo->info.func.new_update_region = NULL;
82 einfo->info.func.free_update_region = NULL;
83 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
85 if (ee->func.fn_resize) ee->func.fn_resize(ee);
89 _ecore_evas_buffer_shutdown(void)
91 _ecore_evas_init_count--;
92 if (_ecore_evas_init_count == 0)
96 _ecore_evas_free(ecore_evases);
98 if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
100 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
101 return _ecore_evas_init_count;
105 _ecore_evas_buffer_render(Ecore_Evas *ee)
107 Eina_List *updates, *l, *ll;
110 EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
112 if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
113 _ecore_evas_buffer_render(ee2);
114 if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
116 if (ee->engine.buffer.image)
120 evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
121 if ((w != ee->w) || (h != ee->h))
122 _ecore_evas_resize(ee, w, h);
124 updates = evas_render_updates(ee->evas);
125 if (ee->engine.buffer.image)
129 EINA_LIST_FOREACH(updates, l, r)
130 if (ee->engine.buffer.image)
131 evas_object_image_data_update_add(ee->engine.buffer.image,
132 r->x, r->y, r->w, r->h);
136 evas_render_updates_free(updates);
137 _ecore_evas_idle_timeout_update(ee);
142 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
144 Evas_Coord xx, yy, fx, fy, fw, fh;
146 evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
147 evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
151 while (xx < 0) xx += fw;
152 while (xx > fw) xx -= fw;
153 *x = (ee->w * xx) / fw;
157 while (yy < 0) yy += fh;
158 while (yy > fh) yy -= fh;
159 *y = (ee->h * yy) / fh;
163 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
166 Evas_Event_Mouse_In *ev;
170 evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
174 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
177 Evas_Event_Mouse_Out *ev;
181 evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
185 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
188 Evas_Event_Mouse_Down *ev;
192 evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
196 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
199 Evas_Event_Mouse_Up *ev;
203 evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
207 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
210 Evas_Event_Mouse_Move *ev;
215 x = ev->cur.canvas.x;
216 y = ev->cur.canvas.y;
217 _ecore_evas_buffer_coord_translate(ee, &x, &y);
218 _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
222 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
225 Evas_Event_Mouse_Wheel *ev;
229 evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
233 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
238 if (ee->driver) _ecore_evas_free(ee);
242 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
245 Evas_Event_Key_Down *ev;
249 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
250 evas_key_modifier_on(e, "Shift");
252 evas_key_modifier_off(e, "Shift");
253 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
254 evas_key_modifier_on(e, "Control");
256 evas_key_modifier_off(e, "Control");
257 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
258 evas_key_modifier_on(e, "Alt");
260 evas_key_modifier_off(e, "Alt");
261 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
262 evas_key_modifier_on(e, "Meta");
264 evas_key_modifier_off(e, "Meta");
265 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
266 evas_key_modifier_on(e, "Hyper");
268 evas_key_modifier_off(e, "Hyper");
269 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
270 evas_key_modifier_on(e, "Super");
272 evas_key_modifier_off(e, "Super");
273 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
274 evas_key_lock_on(e, "Scroll_Lock");
276 evas_key_lock_off(e, "Scroll_Lock");
277 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
278 evas_key_lock_on(e, "Num_Lock");
280 evas_key_lock_off(e, "Num_Lock");
281 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
282 evas_key_lock_on(e, "Caps_Lock");
284 evas_key_lock_off(e, "Caps_Lock");
285 evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
289 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
292 Evas_Event_Key_Up *ev;
296 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
297 evas_key_modifier_on(e, "Shift");
299 evas_key_modifier_off(e, "Shift");
300 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
301 evas_key_modifier_on(e, "Control");
303 evas_key_modifier_off(e, "Control");
304 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
305 evas_key_modifier_on(e, "Alt");
307 evas_key_modifier_off(e, "Alt");
308 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
309 evas_key_modifier_on(e, "Meta");
311 evas_key_modifier_off(e, "Meta");
312 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
313 evas_key_modifier_on(e, "Hyper");
315 evas_key_modifier_off(e, "Hyper");
316 if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
317 evas_key_modifier_on(e, "Super");
319 evas_key_modifier_off(e, "Super");
320 if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
321 evas_key_lock_on(e, "Scroll_Lock");
323 evas_key_lock_off(e, "Scroll_Lock");
324 if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
325 evas_key_lock_on(e, "Num_Lock");
327 evas_key_lock_off(e, "Num_Lock");
328 if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
329 evas_key_lock_on(e, "Caps_Lock");
331 evas_key_lock_off(e, "Caps_Lock");
332 evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
336 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
341 ee->prop.focused = 1;
342 if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
346 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
351 ee->prop.focused = 0;
352 if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
356 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
362 if (ee->func.fn_show) ee->func.fn_show(ee);
366 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
372 if (ee->func.fn_hide) ee->func.fn_hide(ee);
375 static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
377 _ecore_evas_buffer_free,
428 * FIXME: To be fixed.
431 ecore_evas_buffer_new(int w, int h)
433 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
434 Evas_Engine_Info_Buffer *einfo;
438 rmethod = evas_render_method_lookup("buffer");
439 if (!rmethod) return NULL;
440 ee = calloc(1, sizeof(Ecore_Evas));
441 if (!ee) return NULL;
443 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
445 _ecore_evas_buffer_init();
447 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
449 ee->driver = "buffer";
461 ee->prop.focused = 1;
462 ee->prop.borderless = 1;
463 ee->prop.override = 1;
464 ee->prop.maximized = 1;
465 ee->prop.fullscreen = 0;
466 ee->prop.withdrawn = 0;
470 ee->evas = evas_new();
471 evas_data_attach_set(ee->evas, ee);
472 evas_output_method_set(ee->evas, rmethod);
473 evas_output_size_set(ee->evas, w, h);
474 evas_output_viewport_set(ee->evas, 0, 0, w, h);
476 ee->engine.buffer.pixels = malloc(w * h * sizeof(int));
478 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
481 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
482 einfo->info.dest_buffer = ee->engine.buffer.pixels;
483 einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
484 einfo->info.use_color_key = 0;
485 einfo->info.alpha_threshold = 0;
486 einfo->info.func.new_update_region = NULL;
487 einfo->info.func.free_update_region = NULL;
488 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
490 evas_key_modifier_add(ee->evas, "Shift");
491 evas_key_modifier_add(ee->evas, "Control");
492 evas_key_modifier_add(ee->evas, "Alt");
493 evas_key_modifier_add(ee->evas, "Meta");
494 evas_key_modifier_add(ee->evas, "Hyper");
495 evas_key_modifier_add(ee->evas, "Super");
496 evas_key_lock_add(ee->evas, "Caps_Lock");
497 evas_key_lock_add(ee->evas, "Num_Lock");
498 evas_key_lock_add(ee->evas, "Scroll_Lock");
500 evas_event_feed_mouse_in(ee->evas, 0, NULL);
502 ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
510 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
512 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
513 _ecore_evas_buffer_render(ee);
514 return ee->engine.buffer.pixels;
521 ecore_evas_object_image_new(Ecore_Evas *ee_target)
523 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
525 Evas_Engine_Info_Buffer *einfo;
530 rmethod = evas_render_method_lookup("buffer");
531 if (!rmethod) return NULL;
532 ee = calloc(1, sizeof(Ecore_Evas));
533 if (!ee) return NULL;
535 o = evas_object_image_add(ee_target->evas);
537 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
539 _ecore_evas_buffer_init();
541 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
543 ee->driver = "buffer";
555 ee->prop.focused = 0;
556 ee->prop.borderless = 1;
557 ee->prop.override = 1;
558 ee->prop.maximized = 0;
559 ee->prop.fullscreen = 0;
560 ee->prop.withdrawn = 0;
564 ee->evas = evas_new();
565 evas_data_attach_set(ee->evas, ee);
566 evas_output_method_set(ee->evas, rmethod);
567 evas_output_size_set(ee->evas, w, h);
568 evas_output_viewport_set(ee->evas, 0, 0, w, h);
570 ee->engine.buffer.image = o;
571 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
572 evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
573 evas_object_image_size_set(o, ee->w, ee->h);
574 evas_object_image_alpha_set(o, 1);
575 ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
576 evas_object_image_data_set(o, ee->engine.buffer.pixels);
577 evas_object_event_callback_add(ee->engine.buffer.image,
578 EVAS_CALLBACK_MOUSE_IN,
579 _ecore_evas_buffer_cb_mouse_in, ee);
580 evas_object_event_callback_add(ee->engine.buffer.image,
581 EVAS_CALLBACK_MOUSE_OUT,
582 _ecore_evas_buffer_cb_mouse_out, ee);
583 evas_object_event_callback_add(ee->engine.buffer.image,
584 EVAS_CALLBACK_MOUSE_DOWN,
585 _ecore_evas_buffer_cb_mouse_down, ee);
586 evas_object_event_callback_add(ee->engine.buffer.image,
587 EVAS_CALLBACK_MOUSE_UP,
588 _ecore_evas_buffer_cb_mouse_up, ee);
589 evas_object_event_callback_add(ee->engine.buffer.image,
590 EVAS_CALLBACK_MOUSE_MOVE,
591 _ecore_evas_buffer_cb_mouse_move, ee);
592 evas_object_event_callback_add(ee->engine.buffer.image,
593 EVAS_CALLBACK_MOUSE_WHEEL,
594 _ecore_evas_buffer_cb_mouse_wheel, ee);
595 evas_object_event_callback_add(ee->engine.buffer.image,
597 _ecore_evas_buffer_cb_free, ee);
598 evas_object_event_callback_add(ee->engine.buffer.image,
599 EVAS_CALLBACK_KEY_DOWN,
600 _ecore_evas_buffer_cb_key_down, ee);
601 evas_object_event_callback_add(ee->engine.buffer.image,
602 EVAS_CALLBACK_KEY_UP,
603 _ecore_evas_buffer_cb_key_up, ee);
604 evas_object_event_callback_add(ee->engine.buffer.image,
605 EVAS_CALLBACK_FOCUS_IN,
606 _ecore_evas_buffer_cb_focus_in, ee);
607 evas_object_event_callback_add(ee->engine.buffer.image,
608 EVAS_CALLBACK_FOCUS_OUT,
609 _ecore_evas_buffer_cb_focus_out, ee);
610 evas_object_event_callback_add(ee->engine.buffer.image,
612 _ecore_evas_buffer_cb_show, ee);
613 evas_object_event_callback_add(ee->engine.buffer.image,
615 _ecore_evas_buffer_cb_hide, ee);
616 einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
619 einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
620 einfo->info.dest_buffer = ee->engine.buffer.pixels;
621 einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
622 einfo->info.use_color_key = 0;
623 einfo->info.alpha_threshold = 0;
624 einfo->info.func.new_update_region = NULL;
625 einfo->info.func.free_update_region = NULL;
626 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
628 evas_key_modifier_add(ee->evas, "Shift");
629 evas_key_modifier_add(ee->evas, "Control");
630 evas_key_modifier_add(ee->evas, "Alt");
631 evas_key_modifier_add(ee->evas, "Meta");
632 evas_key_modifier_add(ee->evas, "Hyper");
633 evas_key_modifier_add(ee->evas, "Super");
634 evas_key_lock_add(ee->evas, "Caps_Lock");
635 evas_key_lock_add(ee->evas, "Num_Lock");
636 evas_key_lock_add(ee->evas, "Scroll_Lock");
638 ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);