43506bfb78e3402e4333183ffb1a66a7244a4903
[framework/uifw/ecore.git] / src / lib / ecore_evas / ecore_evas_buffer.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <Ecore.h>
6 #include "ecore_private.h"
7 #include <Ecore_Input.h>
8
9 #include "ecore_evas_private.h"
10 #include "Ecore_Evas.h"
11
12 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
13 static int _ecore_evas_init_count = 0;
14
15 static int
16 _ecore_evas_buffer_init(void)
17 {
18    _ecore_evas_init_count++;
19    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
20    return _ecore_evas_init_count;
21 }
22
23 static void
24 _ecore_evas_buffer_free(Ecore_Evas *ee)
25 {
26    if (ee->engine.buffer.image)
27      {
28         Ecore_Evas *ee2;
29
30         ee2 = evas_object_data_get(ee->engine.buffer.image, "Ecore_Evas_Parent");
31         evas_object_del(ee->engine.buffer.image);
32         ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
33      }
34    else
35      {
36         free(ee->engine.buffer.pixels);
37      }
38    _ecore_evas_buffer_shutdown();
39 }
40
41 static void
42 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
43 {
44    Evas_Engine_Info_Buffer *einfo;
45
46    if (w < 1) w = 1;
47    if (h < 1) h = 1;
48    if ((w == ee->w) && (h == ee->h)) return;
49    ee->w = w;
50    ee->h = h;
51    evas_output_size_set(ee->evas, ee->w, ee->h);
52    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
53    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
54
55    if (ee->engine.buffer.image)
56      {
57         ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
58      }
59    else
60      {
61         if (ee->engine.buffer.pixels) free(ee->engine.buffer.pixels);
62         ee->engine.buffer.pixels = malloc(ee->w * ee->h * sizeof(int));
63      }
64
65    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
66    if (einfo)
67      {
68         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
69         einfo->info.dest_buffer = ee->engine.buffer.pixels;
70         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
71         einfo->info.use_color_key = 0;
72         einfo->info.alpha_threshold = 0;
73         einfo->info.func.new_update_region = NULL;
74         einfo->info.func.free_update_region = NULL;
75         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
76      }
77    if (ee->func.fn_resize) ee->func.fn_resize(ee);
78 }
79
80 int
81 _ecore_evas_buffer_shutdown(void)
82 {
83    _ecore_evas_init_count--;
84    if (_ecore_evas_init_count == 0)
85      {
86      }
87    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
88    return _ecore_evas_init_count;
89 }
90
91 int
92 _ecore_evas_buffer_render(Ecore_Evas *ee)
93 {
94    Eina_List *updates, *l, *ll;
95    Ecore_Evas *ee2;
96    int rend = 0;
97
98    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
99      {
100         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
101         rend |= _ecore_evas_buffer_render(ee2);
102         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
103      }
104    if (ee->engine.buffer.image)
105      {
106         int w, h;
107
108         evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
109         if ((w != ee->w) || (h != ee->h))
110           _ecore_evas_resize(ee, w, h);
111      }
112    updates = evas_render_updates(ee->evas);
113    if (ee->engine.buffer.image)
114      {
115         Eina_Rectangle *r;
116
117         EINA_LIST_FOREACH(updates, l, r)
118           if (ee->engine.buffer.image)
119             evas_object_image_data_update_add(ee->engine.buffer.image,
120                                               r->x, r->y, r->w, r->h);
121      }
122    if (updates)
123      {
124         evas_render_updates_free(updates);
125         _ecore_evas_idle_timeout_update(ee);
126      }
127
128    return updates ? 1 : rend;
129 }
130
131 static void
132 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
133 {
134    Evas_Coord xx, yy, fx, fy, fw, fh;
135
136    evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
137    evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
138
139    if (fw < 1) fw = 1;
140    xx = (*x - xx) - fx;
141    while (xx < 0) xx += fw;
142    while (xx > fw) xx -= fw;
143    *x = (ee->w * xx) / fw;
144
145    if (fh < 1) fh = 1;
146    yy = (*y - yy) - fy;
147    while (yy < 0) yy += fh;
148    while (yy > fh) yy -= fh;
149    *y = (ee->h * yy) / fh;
150 }
151
152 static void
153 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
154 {
155    Ecore_Evas *ee;
156    Evas_Event_Mouse_In *ev;
157
158    ee = data;
159    ev = event_info;
160    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
161 }
162
163 static void
164 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
165 {
166    Ecore_Evas *ee;
167    Evas_Event_Mouse_Out *ev;
168
169    ee = data;
170    ev = event_info;
171    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
172 }
173
174 static void
175 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
176 {
177    Ecore_Evas *ee;
178    Evas_Event_Mouse_Down *ev;
179
180    ee = data;
181    ev = event_info;
182    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
183 }
184
185 static void
186 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
187 {
188    Ecore_Evas *ee;
189    Evas_Event_Mouse_Up *ev;
190
191    ee = data;
192    ev = event_info;
193    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
194 }
195
196 static void
197 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
198 {
199    Ecore_Evas *ee;
200    Evas_Event_Mouse_Move *ev;
201    Evas_Coord x, y;
202
203    ee = data;
204    ev = event_info;
205    x = ev->cur.canvas.x;
206    y = ev->cur.canvas.y;
207    _ecore_evas_buffer_coord_translate(ee, &x, &y);
208    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
209 }
210
211 static void
212 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
213 {
214    Ecore_Evas *ee;
215    Evas_Event_Mouse_Wheel *ev;
216
217    ee = data;
218    ev = event_info;
219    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
220 }
221
222 static void
223 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
224 {
225    Ecore_Evas *ee;
226
227    ee = data;
228    if (ee->driver) _ecore_evas_free(ee);
229 }
230
231 static void
232 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
233 {
234    Ecore_Evas *ee;
235    Evas_Event_Key_Down *ev;
236
237    ee = data;
238    ev = event_info;
239    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
240      evas_key_modifier_on(e, "Shift");
241    else
242      evas_key_modifier_off(e, "Shift");
243    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
244      evas_key_modifier_on(e, "Control");
245    else
246      evas_key_modifier_off(e, "Control");
247    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
248      evas_key_modifier_on(e, "Alt");
249    else
250      evas_key_modifier_off(e, "Alt");
251    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
252      evas_key_modifier_on(e, "Meta");
253    else
254      evas_key_modifier_off(e, "Meta");
255    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
256      evas_key_modifier_on(e, "Hyper");
257    else
258      evas_key_modifier_off(e, "Hyper");
259    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
260      evas_key_modifier_on(e, "Super");
261    else
262      evas_key_modifier_off(e, "Super");
263    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
264      evas_key_lock_on(e, "Scroll_Lock");
265    else
266      evas_key_lock_off(e, "Scroll_Lock");
267    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
268      evas_key_lock_on(e, "Num_Lock");
269    else
270      evas_key_lock_off(e, "Num_Lock");
271    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
272      evas_key_lock_on(e, "Caps_Lock");
273    else
274      evas_key_lock_off(e, "Caps_Lock");
275    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
276 }
277
278 static void
279 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
280 {
281    Ecore_Evas *ee;
282    Evas_Event_Key_Up *ev;
283
284    ee = data;
285    ev = event_info;
286    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
287      evas_key_modifier_on(e, "Shift");
288    else
289      evas_key_modifier_off(e, "Shift");
290    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
291      evas_key_modifier_on(e, "Control");
292    else
293      evas_key_modifier_off(e, "Control");
294    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
295      evas_key_modifier_on(e, "Alt");
296    else
297      evas_key_modifier_off(e, "Alt");
298    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
299      evas_key_modifier_on(e, "Meta");
300    else
301      evas_key_modifier_off(e, "Meta");
302    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
303      evas_key_modifier_on(e, "Hyper");
304    else
305      evas_key_modifier_off(e, "Hyper");
306    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
307      evas_key_modifier_on(e, "Super");
308    else
309      evas_key_modifier_off(e, "Super");
310    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
311      evas_key_lock_on(e, "Scroll_Lock");
312    else
313      evas_key_lock_off(e, "Scroll_Lock");
314    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
315      evas_key_lock_on(e, "Num_Lock");
316    else
317      evas_key_lock_off(e, "Num_Lock");
318    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
319      evas_key_lock_on(e, "Caps_Lock");
320    else
321      evas_key_lock_off(e, "Caps_Lock");
322    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
323 }
324
325 static void
326 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
327 {
328    Ecore_Evas *ee;
329
330    ee = data;
331    ee->prop.focused = 1;
332    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
333 }
334
335 static void
336 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
337 {
338    Ecore_Evas *ee;
339
340    ee = data;
341    ee->prop.focused = 0;
342    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
343 }
344
345 static void
346 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
347 {
348    Ecore_Evas *ee;
349
350    ee = data;
351    ee->visible = 1;
352    if (ee->func.fn_show) ee->func.fn_show(ee);
353 }
354
355 static void
356 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
357 {
358    Ecore_Evas *ee;
359
360    ee = data;
361    ee->visible = 0;
362    if (ee->func.fn_hide) ee->func.fn_hide(ee);
363 }
364
365 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
366 {
367    _ecore_evas_buffer_free,
368      NULL,
369      NULL,
370      NULL,
371      NULL,
372      NULL,
373      NULL,
374      NULL,
375      NULL,
376      NULL,
377      NULL,
378      NULL,
379      NULL,
380      NULL,
381      NULL,
382      NULL,
383      NULL,
384      _ecore_evas_resize,
385      NULL,
386      NULL,
387      NULL,
388      NULL,
389      NULL,
390      NULL,
391      NULL,
392      NULL,
393      NULL,
394      NULL,
395      NULL,
396      NULL,
397      NULL,
398      NULL,
399      NULL,
400      NULL,
401      NULL,
402      NULL,
403      NULL,
404      NULL,
405      NULL,
406      NULL,
407      NULL,
408      NULL,
409      NULL,
410      NULL,
411      NULL,
412      
413      NULL // render
414 };
415 #endif
416
417 /**
418  * To be documented.
419  *
420  * FIXME: To be fixed.
421  */
422 EAPI Ecore_Evas *
423 ecore_evas_buffer_new(int w, int h)
424 {
425 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
426    Evas_Engine_Info_Buffer *einfo;
427    Ecore_Evas *ee;
428    int rmethod;
429
430    rmethod = evas_render_method_lookup("buffer");
431    if (!rmethod) return NULL;
432    ee = calloc(1, sizeof(Ecore_Evas));
433    if (!ee) return NULL;
434
435    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
436
437    _ecore_evas_buffer_init();
438
439    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
440
441    ee->driver = "buffer";
442
443    if (w < 1) w = 1;
444    if (h < 1) h = 1;
445    ee->rotation = 0;
446    ee->visible = 1;
447    ee->w = w;
448    ee->h = h;
449
450    ee->prop.max.w = 0;
451    ee->prop.max.h = 0;
452    ee->prop.layer = 0;
453    ee->prop.focused = 1;
454    ee->prop.borderless = 1;
455    ee->prop.override = 1;
456    ee->prop.maximized = 1;
457    ee->prop.fullscreen = 0;
458    ee->prop.withdrawn = 0;
459    ee->prop.sticky = 0;
460
461    /* init evas here */
462    ee->evas = evas_new();
463    evas_data_attach_set(ee->evas, ee);
464    evas_output_method_set(ee->evas, rmethod);
465    evas_output_size_set(ee->evas, w, h);
466    evas_output_viewport_set(ee->evas, 0, 0, w, h);
467
468    ee->engine.buffer.pixels = malloc(w * h * sizeof(int));
469
470    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
471    if (einfo)
472      {
473         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
474         einfo->info.dest_buffer = ee->engine.buffer.pixels;
475         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
476         einfo->info.use_color_key = 0;
477         einfo->info.alpha_threshold = 0;
478         einfo->info.func.new_update_region = NULL;
479         einfo->info.func.free_update_region = NULL;
480         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
481      }
482    evas_key_modifier_add(ee->evas, "Shift");
483    evas_key_modifier_add(ee->evas, "Control");
484    evas_key_modifier_add(ee->evas, "Alt");
485    evas_key_modifier_add(ee->evas, "Meta");
486    evas_key_modifier_add(ee->evas, "Hyper");
487    evas_key_modifier_add(ee->evas, "Super");
488    evas_key_lock_add(ee->evas, "Caps_Lock");
489    evas_key_lock_add(ee->evas, "Num_Lock");
490    evas_key_lock_add(ee->evas, "Scroll_Lock");
491
492    evas_event_feed_mouse_in(ee->evas, 0, NULL);
493
494    ee->engine.func->fn_render = _ecore_evas_buffer_render;
495    _ecore_evas_register(ee);
496    
497    return ee;
498 #else
499    return NULL;
500 #endif
501 }
502
503 EAPI const void *
504 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
505 {
506 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
507    _ecore_evas_buffer_render(ee);
508    return ee->engine.buffer.pixels;
509 #else
510    return NULL;
511 #endif
512 }
513
514 EAPI Evas_Object *
515 ecore_evas_object_image_new(Ecore_Evas *ee_target)
516 {
517 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
518    Evas_Object *o;
519    Evas_Engine_Info_Buffer *einfo;
520    Ecore_Evas *ee;
521    int rmethod;
522    int w, h;
523
524    rmethod = evas_render_method_lookup("buffer");
525    if (!rmethod) return NULL;
526    ee = calloc(1, sizeof(Ecore_Evas));
527    if (!ee) return NULL;
528
529    o = evas_object_image_add(ee_target->evas);
530
531    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
532
533    _ecore_evas_buffer_init();
534
535    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
536
537    ee->driver = "buffer";
538
539    w = 1;
540    h = 1;
541    ee->rotation = 0;
542    ee->visible = 0;
543    ee->w = w;
544    ee->h = h;
545
546    ee->prop.max.w = 0;
547    ee->prop.max.h = 0;
548    ee->prop.layer = 0;
549    ee->prop.focused = 0;
550    ee->prop.borderless = 1;
551    ee->prop.override = 1;
552    ee->prop.maximized = 0;
553    ee->prop.fullscreen = 0;
554    ee->prop.withdrawn = 0;
555    ee->prop.sticky = 0;
556
557    /* init evas here */
558    ee->evas = evas_new();
559    evas_data_attach_set(ee->evas, ee);
560    evas_output_method_set(ee->evas, rmethod);
561    evas_output_size_set(ee->evas, w, h);
562    evas_output_viewport_set(ee->evas, 0, 0, w, h);
563
564    ee->engine.buffer.image = o;
565    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
566    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
567    evas_object_image_size_set(o, ee->w, ee->h);
568    evas_object_image_alpha_set(o, 1);
569    ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
570    evas_object_image_data_set(o, ee->engine.buffer.pixels);
571    evas_object_event_callback_add(ee->engine.buffer.image,
572                                   EVAS_CALLBACK_MOUSE_IN,
573                                   _ecore_evas_buffer_cb_mouse_in, ee);
574    evas_object_event_callback_add(ee->engine.buffer.image,
575                                   EVAS_CALLBACK_MOUSE_OUT,
576                                   _ecore_evas_buffer_cb_mouse_out, ee);
577    evas_object_event_callback_add(ee->engine.buffer.image,
578                                   EVAS_CALLBACK_MOUSE_DOWN,
579                                   _ecore_evas_buffer_cb_mouse_down, ee);
580    evas_object_event_callback_add(ee->engine.buffer.image,
581                                   EVAS_CALLBACK_MOUSE_UP,
582                                   _ecore_evas_buffer_cb_mouse_up, ee);
583    evas_object_event_callback_add(ee->engine.buffer.image,
584                                   EVAS_CALLBACK_MOUSE_MOVE,
585                                   _ecore_evas_buffer_cb_mouse_move, ee);
586    evas_object_event_callback_add(ee->engine.buffer.image,
587                                   EVAS_CALLBACK_MOUSE_WHEEL,
588                                   _ecore_evas_buffer_cb_mouse_wheel, ee);
589    evas_object_event_callback_add(ee->engine.buffer.image,
590                                   EVAS_CALLBACK_FREE,
591                                   _ecore_evas_buffer_cb_free, ee);
592    evas_object_event_callback_add(ee->engine.buffer.image,
593                                   EVAS_CALLBACK_KEY_DOWN,
594                                   _ecore_evas_buffer_cb_key_down, ee);
595    evas_object_event_callback_add(ee->engine.buffer.image,
596                                   EVAS_CALLBACK_KEY_UP,
597                                   _ecore_evas_buffer_cb_key_up, ee);
598    evas_object_event_callback_add(ee->engine.buffer.image,
599                                   EVAS_CALLBACK_FOCUS_IN,
600                                   _ecore_evas_buffer_cb_focus_in, ee);
601    evas_object_event_callback_add(ee->engine.buffer.image,
602                                   EVAS_CALLBACK_FOCUS_OUT,
603                                   _ecore_evas_buffer_cb_focus_out, ee);
604    evas_object_event_callback_add(ee->engine.buffer.image,
605                                   EVAS_CALLBACK_SHOW,
606                                   _ecore_evas_buffer_cb_show, ee);
607    evas_object_event_callback_add(ee->engine.buffer.image,
608                                   EVAS_CALLBACK_HIDE,
609                                   _ecore_evas_buffer_cb_hide, ee);
610    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
611    if (einfo)
612      {
613         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
614         einfo->info.dest_buffer = ee->engine.buffer.pixels;
615         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
616         einfo->info.use_color_key = 0;
617         einfo->info.alpha_threshold = 0;
618         einfo->info.func.new_update_region = NULL;
619         einfo->info.func.free_update_region = NULL;
620         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
621      }
622    evas_key_modifier_add(ee->evas, "Shift");
623    evas_key_modifier_add(ee->evas, "Control");
624    evas_key_modifier_add(ee->evas, "Alt");
625    evas_key_modifier_add(ee->evas, "Meta");
626    evas_key_modifier_add(ee->evas, "Hyper");
627    evas_key_modifier_add(ee->evas, "Super");
628    evas_key_lock_add(ee->evas, "Caps_Lock");
629    evas_key_lock_add(ee->evas, "Num_Lock");
630    evas_key_lock_add(ee->evas, "Scroll_Lock");
631
632    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
633    
634    ee->engine.func->fn_render = _ecore_evas_buffer_render;
635    
636    return o;
637 #else
638    return NULL;
639 #endif
640 }