[ecore] merged svn latest code (svn54830)
[profile/ivi/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    return _ecore_evas_init_count;
20 }
21
22 static void
23 _ecore_evas_buffer_free(Ecore_Evas *ee)
24 {
25    if (ee->engine.buffer.image)
26      {
27         Ecore_Evas *ee2;
28
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);
32      }
33    else
34      {
35         ee->engine.buffer.free_func(ee->engine.buffer.data, 
36                                     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    int stride = 0;
46
47    if (w < 1) w = 1;
48    if (h < 1) h = 1;
49    if ((w == ee->w) && (h == ee->h)) return;
50    ee->w = w;
51    ee->h = h;
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);
55
56    if (ee->engine.buffer.image)
57      {
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);
60      }
61    else
62      {
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);
70      }
71
72    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
73    if (einfo)
74      {
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))
83           {
84              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
85           }
86      }
87    if (ee->func.fn_resize) ee->func.fn_resize(ee);
88 }
89
90 int
91 _ecore_evas_buffer_shutdown(void)
92 {
93    _ecore_evas_init_count--;
94    if (_ecore_evas_init_count == 0)
95      {
96      }
97    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
98    return _ecore_evas_init_count;
99 }
100
101 int
102 _ecore_evas_buffer_render(Ecore_Evas *ee)
103 {
104    Eina_List *updates, *l, *ll;
105    Ecore_Evas *ee2;
106    int rend = 0;
107
108    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
109      {
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);
113      }
114    if (ee->engine.buffer.image)
115      {
116         int w, h;
117
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);
121      }
122    updates = evas_render_updates(ee->evas);
123    if (ee->engine.buffer.image)
124      {
125         Eina_Rectangle *r;
126
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);
130      }
131    if (updates)
132      {
133         evas_render_updates_free(updates);
134         _ecore_evas_idle_timeout_update(ee);
135      }
136
137    return updates ? 1 : rend;
138 }
139
140 static void
141 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
142 {
143    Evas_Coord xx, yy, fx, fy, fw, fh;
144
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);
147
148    if (fw < 1) fw = 1;
149    xx = (*x - xx) - fx;
150    while (xx < 0) xx += fw;
151    while (xx > fw) xx -= fw;
152    *x = (ee->w * xx) / fw;
153
154    if (fh < 1) fh = 1;
155    yy = (*y - yy) - fy;
156    while (yy < 0) yy += fh;
157    while (yy > fh) yy -= fh;
158    *y = (ee->h * yy) / fh;
159 }
160
161 static void
162 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
163 {
164    Ecore_Evas *ee;
165    Evas_Event_Mouse_In *ev;
166
167    ee = data;
168    ev = event_info;
169    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
170 }
171
172 static void
173 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
174 {
175    Ecore_Evas *ee;
176    Evas_Event_Mouse_Out *ev;
177
178    ee = data;
179    ev = event_info;
180    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
181 }
182
183 static void
184 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
185 {
186    Ecore_Evas *ee;
187    Evas_Event_Mouse_Down *ev;
188
189    ee = data;
190    ev = event_info;
191    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
192 }
193
194 static void
195 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
196 {
197    Ecore_Evas *ee;
198    Evas_Event_Mouse_Up *ev;
199
200    ee = data;
201    ev = event_info;
202    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
203 }
204
205 static void
206 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
207 {
208    Ecore_Evas *ee;
209    Evas_Event_Mouse_Move *ev;
210    Evas_Coord x, y;
211
212    ee = data;
213    ev = event_info;
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);
218 }
219
220 static void
221 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
222 {
223    Ecore_Evas *ee;
224    Evas_Event_Mouse_Wheel *ev;
225
226    ee = data;
227    ev = event_info;
228    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
229 }
230
231 static void
232 _ecore_evas_buffer_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
233 {
234    Ecore_Evas *ee;
235    Evas_Event_Multi_Down *ev;
236    Evas_Coord x, y, xx, yy;
237    double xf, yf;
238
239    ee = data;
240    ev = event_info;
241    x = ev->canvas.x;
242    y = ev->canvas.y;
243    xx = x;
244    yy = y;
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);
249 }
250
251 static void
252 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
253 {
254    Ecore_Evas *ee;
255    Evas_Event_Multi_Up *ev;
256    Evas_Coord x, y, xx, yy;
257    double xf, yf;
258
259    ee = data;
260    ev = event_info;
261    x = ev->canvas.x;
262    y = ev->canvas.y;
263    xx = x;
264    yy = y;
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);
269 }
270
271 static void
272 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
273 {
274    Ecore_Evas *ee;
275    Evas_Event_Multi_Move *ev;
276    Evas_Coord x, y, xx, yy;
277    double xf, yf;
278
279    ee = data;
280    ev = event_info;
281    x = ev->cur.canvas.x;
282    y = ev->cur.canvas.y;
283    xx = x;
284    yy = 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);
289 }
290
291 static void
292 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
293 {
294    Ecore_Evas *ee;
295
296    ee = data;
297    if (ee->driver) _ecore_evas_free(ee);
298 }
299
300 static void
301 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
302 {
303    Ecore_Evas *ee;
304    Evas_Event_Key_Down *ev;
305
306    ee = data;
307    ev = event_info;
308    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
309      evas_key_modifier_on(e, "Shift");
310    else
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");
314    else
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");
318    else
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");
322    else
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");
326    else
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");
330    else
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");
334    else
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");
338    else
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");
342    else
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);
345 }
346
347 static void
348 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
349 {
350    Ecore_Evas *ee;
351    Evas_Event_Key_Up *ev;
352
353    ee = data;
354    ev = event_info;
355    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
356      evas_key_modifier_on(e, "Shift");
357    else
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");
361    else
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");
365    else
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");
369    else
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");
373    else
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");
377    else
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");
381    else
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");
385    else
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");
389    else
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);
392 }
393
394 static void
395 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
396 {
397    Ecore_Evas *ee;
398
399    ee = data;
400    ee->prop.focused = 1;
401    evas_focus_in(ee->evas);
402    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
403 }
404
405 static void
406 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
407 {
408    Ecore_Evas *ee;
409
410    ee = data;
411    ee->prop.focused = 0;
412    evas_focus_out(ee->evas);
413    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
414 }
415
416 static void
417 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
418 {
419    Ecore_Evas *ee;
420
421    ee = data;
422    ee->visible = 1;
423    if (ee->func.fn_show) ee->func.fn_show(ee);
424 }
425
426 static void
427 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
428 {
429    Ecore_Evas *ee;
430
431    ee = data;
432    ee->visible = 0;
433    if (ee->func.fn_hide) ee->func.fn_hide(ee);
434 }
435
436 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
437 {
438    _ecore_evas_buffer_free,
439      NULL,
440      NULL,
441      NULL,
442      NULL,
443      NULL,
444      NULL,
445      NULL,
446      NULL,
447      NULL,
448      NULL,
449      NULL,
450      NULL,
451      NULL,
452      NULL,
453      NULL,
454      NULL,
455      _ecore_evas_resize,
456      NULL,
457      NULL,
458      NULL,
459      NULL,
460      NULL,
461      NULL,
462      NULL,
463      NULL,
464      NULL,
465      NULL,
466      NULL,
467      NULL,
468      NULL,
469      NULL,
470      NULL,
471      NULL,
472      NULL,
473      NULL,
474      NULL,
475      NULL,
476      NULL,
477      NULL,
478      NULL,
479      NULL,
480      NULL,
481      NULL,
482      NULL,
483      NULL, //transparent
484      
485      NULL // render
486 };
487 #endif
488
489 static void *
490 _ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
491 {
492    return malloc(size);
493 }
494
495 static void
496 _ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
497 {
498    free(pix);
499 }
500
501 /**
502  * To be documented.
503  *
504  * FIXME: To be fixed.
505  */
506 EAPI Ecore_Evas *
507 ecore_evas_buffer_new(int w, int h)
508 {
509     return ecore_evas_buffer_allocfunc_new
510      (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
511 }
512
513 EAPI Ecore_Evas *
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)
515 {
516 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
517    Evas_Engine_Info_Buffer *einfo;
518    Ecore_Evas *ee;
519    int rmethod;
520
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;
526
527    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
528
529    _ecore_evas_buffer_init();
530
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;
535
536    ee->driver = "buffer";
537
538    if (w < 1) w = 1;
539    if (h < 1) h = 1;
540    ee->rotation = 0;
541    ee->visible = 1;
542    ee->w = w;
543    ee->h = h;
544
545    ee->prop.max.w = 0;
546    ee->prop.max.h = 0;
547    ee->prop.layer = 0;
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;
554    ee->prop.sticky = 0;
555
556    /* init evas here */
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);
562
563    ee->engine.buffer.pixels = 
564      ee->engine.buffer.alloc_func
565      (ee->engine.buffer.data, w * h * sizeof(int));
566
567    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
568    if (einfo)
569      {
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))
578           {
579              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
580           }
581      }
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");
591
592    evas_event_feed_mouse_in(ee->evas, 0, NULL);
593
594    ee->engine.func->fn_render = _ecore_evas_buffer_render;
595    _ecore_evas_register(ee);
596    
597    return ee;
598 #else
599    return NULL;
600 #endif
601 }
602
603 EAPI const void *
604 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
605 {
606 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
607    _ecore_evas_buffer_render(ee);
608    return ee->engine.buffer.pixels;
609 #else
610    return NULL;
611 #endif
612 }
613
614 EAPI Evas_Object *
615 ecore_evas_object_image_new(Ecore_Evas *ee_target)
616 {
617 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
618    Evas_Object *o;
619    Evas_Engine_Info_Buffer *einfo;
620    Ecore_Evas *ee;
621    int rmethod;
622    int w, h;
623
624    rmethod = evas_render_method_lookup("buffer");
625    if (!rmethod) return NULL;
626    ee = calloc(1, sizeof(Ecore_Evas));
627    if (!ee) return NULL;
628
629    o = evas_object_image_add(ee_target->evas);
630
631    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
632
633    _ecore_evas_buffer_init();
634
635    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
636
637    ee->driver = "buffer";
638
639    w = 1;
640    h = 1;
641    ee->rotation = 0;
642    ee->visible = 0;
643    ee->w = w;
644    ee->h = h;
645
646    ee->prop.max.w = 0;
647    ee->prop.max.h = 0;
648    ee->prop.layer = 0;
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;
655    ee->prop.sticky = 0;
656
657    /* init evas here */
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);
663
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,
699                                   EVAS_CALLBACK_FREE,
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,
714                                   EVAS_CALLBACK_SHOW,
715                                   _ecore_evas_buffer_cb_show, ee);
716    evas_object_event_callback_add(ee->engine.buffer.image,
717                                   EVAS_CALLBACK_HIDE,
718                                   _ecore_evas_buffer_cb_hide, ee);
719    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
720    if (einfo)
721      {
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))
730           {
731              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
732           }
733      }
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");
743
744    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
745    
746    ee->engine.func->fn_render = _ecore_evas_buffer_render;
747    
748    return o;
749 #else
750    return NULL;
751 #endif
752 }