do not remove sub-evases from ecore_evases list.
[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_Input.h>
7
8 #include "ecore_private.h"
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 _ecore_evas_fps_debug = 0;
16
17 static Ecore_Evas *ecore_evases = NULL;
18
19 static int
20 _ecore_evas_buffer_init(void)
21 {
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;
27 }
28
29 static void
30 _ecore_evas_buffer_free(Ecore_Evas *ee)
31 {
32    if (ee->engine.buffer.image)
33      {
34         Ecore_Evas *ee2;
35
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);
39      }
40    else
41      {
42         ecore_evases = (Ecore_Evas *) eina_inlist_remove(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
43
44         free(ee->engine.buffer.pixels);
45      }
46    _ecore_evas_buffer_shutdown();
47 }
48
49 static void
50 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
51 {
52    Evas_Engine_Info_Buffer *einfo;
53
54    if (w < 1) w = 1;
55    if (h < 1) h = 1;
56    if ((w == ee->w) && (h == ee->h)) return;
57    ee->w = w;
58    ee->h = h;
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);
62
63    if (ee->engine.buffer.image)
64      {
65         ee->engine.buffer.pixels = evas_object_image_data_get(ee->engine.buffer.image, 1);
66      }
67    else
68      {
69         if (ee->engine.buffer.pixels) free(ee->engine.buffer.pixels);
70         ee->engine.buffer.pixels = malloc(ee->w * ee->h * sizeof(int));
71      }
72
73    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
74    if (einfo)
75      {
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);
84      }
85    if (ee->func.fn_resize) ee->func.fn_resize(ee);
86 }
87
88 int
89 _ecore_evas_buffer_shutdown(void)
90 {
91    _ecore_evas_init_count--;
92    if (_ecore_evas_init_count == 0)
93      {
94         while (ecore_evases)
95           {
96              _ecore_evas_free(ecore_evases);
97           }
98         if (_ecore_evas_fps_debug) _ecore_evas_fps_debug_shutdown();
99      }
100    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
101    return _ecore_evas_init_count;
102 }
103
104 void
105 _ecore_evas_buffer_render(Ecore_Evas *ee)
106 {
107    Eina_List *updates, *l, *ll;
108    Ecore_Evas *ee2;
109
110    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
111      {
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);
115      }
116    if (ee->engine.buffer.image)
117      {
118         int w, h;
119
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);
123      }
124    updates = evas_render_updates(ee->evas);
125    if (ee->engine.buffer.image)
126      {
127         Eina_Rectangle *r;
128
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);
133      }
134    if (updates)
135      {
136         evas_render_updates_free(updates);
137         _ecore_evas_idle_timeout_update(ee);
138      }
139 }
140
141 static void
142 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
143 {
144    Evas_Coord xx, yy, fx, fy, fw, fh;
145
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);
148
149    if (fw < 1) fw = 1;
150    xx = (*x - xx) - fx;
151    while (xx < 0) xx += fw;
152    while (xx > fw) xx -= fw;
153    *x = (ee->w * xx) / fw;
154
155    if (fh < 1) fh = 1;
156    yy = (*y - yy) - fy;
157    while (yy < 0) yy += fh;
158    while (yy > fh) yy -= fh;
159    *y = (ee->h * yy) / fh;
160 }
161
162 static void
163 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
164 {
165    Ecore_Evas *ee;
166    Evas_Event_Mouse_In *ev;
167
168    ee = data;
169    ev = event_info;
170    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
171 }
172
173 static void
174 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
175 {
176    Ecore_Evas *ee;
177    Evas_Event_Mouse_Out *ev;
178
179    ee = data;
180    ev = event_info;
181    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
182 }
183
184 static void
185 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
186 {
187    Ecore_Evas *ee;
188    Evas_Event_Mouse_Down *ev;
189
190    ee = data;
191    ev = event_info;
192    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
193 }
194
195 static void
196 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
197 {
198    Ecore_Evas *ee;
199    Evas_Event_Mouse_Up *ev;
200
201    ee = data;
202    ev = event_info;
203    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
204 }
205
206 static void
207 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
208 {
209    Ecore_Evas *ee;
210    Evas_Event_Mouse_Move *ev;
211    Evas_Coord x, y;
212
213    ee = data;
214    ev = event_info;
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);
219 }
220
221 static void
222 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
223 {
224    Ecore_Evas *ee;
225    Evas_Event_Mouse_Wheel *ev;
226
227    ee = data;
228    ev = event_info;
229    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
230 }
231
232 static void
233 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
234 {
235    Ecore_Evas *ee;
236
237    ee = data;
238    if (ee->driver) _ecore_evas_free(ee);
239 }
240
241 static void
242 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
243 {
244    Ecore_Evas *ee;
245    Evas_Event_Key_Down *ev;
246
247    ee = data;
248    ev = event_info;
249    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
250      evas_key_modifier_on(e, "Shift");
251    else
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");
255    else
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");
259    else
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");
263    else
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");
267    else
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");
271    else
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");
275    else
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");
279    else
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");
283    else
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);
286 }
287
288 static void
289 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
290 {
291    Ecore_Evas *ee;
292    Evas_Event_Key_Up *ev;
293
294    ee = data;
295    ev = event_info;
296    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
297      evas_key_modifier_on(e, "Shift");
298    else
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");
302    else
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");
306    else
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");
310    else
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");
314    else
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");
318    else
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");
322    else
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");
326    else
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");
330    else
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);
333 }
334
335 static void
336 _ecore_evas_buffer_cb_focus_in(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 = 1;
342    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
343 }
344
345 static void
346 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
347 {
348    Ecore_Evas *ee;
349
350    ee = data;
351    ee->prop.focused = 0;
352    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
353 }
354
355 static void
356 _ecore_evas_buffer_cb_show(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 = 1;
362    if (ee->func.fn_show) ee->func.fn_show(ee);
363 }
364
365 static void
366 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
367 {
368    Ecore_Evas *ee;
369
370    ee = data;
371    ee->visible = 0;
372    if (ee->func.fn_hide) ee->func.fn_hide(ee);
373 }
374
375 static const Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
376 {
377    _ecore_evas_buffer_free,
378      NULL,
379      NULL,
380      NULL,
381      NULL,
382      NULL,
383      NULL,
384      NULL,
385      NULL,
386      NULL,
387      NULL,
388      NULL,
389      NULL,
390      NULL,
391      NULL,
392      NULL,
393      NULL,
394      _ecore_evas_resize,
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      NULL,
413      NULL,
414      NULL,
415      NULL,
416      NULL,
417      NULL,
418      NULL,
419      NULL,
420      NULL,
421      NULL
422 };
423 #endif
424
425 /**
426  * To be documented.
427  *
428  * FIXME: To be fixed.
429  */
430 EAPI Ecore_Evas *
431 ecore_evas_buffer_new(int w, int h)
432 {
433 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
434    Evas_Engine_Info_Buffer *einfo;
435    Ecore_Evas *ee;
436    int rmethod;
437
438    rmethod = evas_render_method_lookup("buffer");
439    if (!rmethod) return NULL;
440    ee = calloc(1, sizeof(Ecore_Evas));
441    if (!ee) return NULL;
442
443    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
444
445    _ecore_evas_buffer_init();
446
447    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
448
449    ee->driver = "buffer";
450
451    if (w < 1) w = 1;
452    if (h < 1) h = 1;
453    ee->rotation = 0;
454    ee->visible = 1;
455    ee->w = w;
456    ee->h = h;
457
458    ee->prop.max.w = 0;
459    ee->prop.max.h = 0;
460    ee->prop.layer = 0;
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;
467    ee->prop.sticky = 0;
468
469    /* init evas here */
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);
475
476    ee->engine.buffer.pixels = malloc(w * h * sizeof(int));
477
478    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
479    if (einfo)
480      {
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);
489      }
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");
499
500    evas_event_feed_mouse_in(ee->evas, 0, NULL);
501
502    ecore_evases = (Ecore_Evas *) eina_inlist_prepend(EINA_INLIST_GET(ecore_evases), EINA_INLIST_GET(ee));
503    return ee;
504 #else
505    return NULL;
506 #endif
507 }
508
509 EAPI const void *
510 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
511 {
512 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
513    _ecore_evas_buffer_render(ee);
514    return ee->engine.buffer.pixels;
515 #else
516    return NULL;
517 #endif
518 }
519
520 EAPI Evas_Object *
521 ecore_evas_object_image_new(Ecore_Evas *ee_target)
522 {
523 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
524    Evas_Object *o;
525    Evas_Engine_Info_Buffer *einfo;
526    Ecore_Evas *ee;
527    int rmethod;
528    int w, h;
529
530    rmethod = evas_render_method_lookup("buffer");
531    if (!rmethod) return NULL;
532    ee = calloc(1, sizeof(Ecore_Evas));
533    if (!ee) return NULL;
534
535    o = evas_object_image_add(ee_target->evas);
536
537    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
538
539    _ecore_evas_buffer_init();
540
541    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
542
543    ee->driver = "buffer";
544
545    w = 1;
546    h = 1;
547    ee->rotation = 0;
548    ee->visible = 0;
549    ee->w = w;
550    ee->h = h;
551
552    ee->prop.max.w = 0;
553    ee->prop.max.h = 0;
554    ee->prop.layer = 0;
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;
561    ee->prop.sticky = 0;
562
563    /* init evas here */
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);
569
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,
596                                   EVAS_CALLBACK_FREE,
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,
611                                   EVAS_CALLBACK_SHOW,
612                                   _ecore_evas_buffer_cb_show, ee);
613    evas_object_event_callback_add(ee->engine.buffer.image,
614                                   EVAS_CALLBACK_HIDE,
615                                   _ecore_evas_buffer_cb_hide, ee);
616    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
617    if (einfo)
618      {
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);
627      }
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");
637
638    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
639    return o;
640 #else
641    return NULL;
642 #endif
643 }