6902b4704c00815310079bbd8fc922353190b373
[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
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)
62           ee->engine.buffer.free_func(ee->engine.buffer.data,
63                                       ee->engine.buffer.pixels);
64         ee->engine.buffer.pixels = 
65           ee->engine.buffer.alloc_func(ee->engine.buffer.data,
66                                        ee->w * ee->h * sizeof(int));
67      }
68
69    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
70    if (einfo)
71      {
72         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
73         einfo->info.dest_buffer = ee->engine.buffer.pixels;
74         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
75         einfo->info.use_color_key = 0;
76         einfo->info.alpha_threshold = 0;
77         einfo->info.func.new_update_region = NULL;
78         einfo->info.func.free_update_region = NULL;
79         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
80      }
81    if (ee->func.fn_resize) ee->func.fn_resize(ee);
82 }
83
84 int
85 _ecore_evas_buffer_shutdown(void)
86 {
87    _ecore_evas_init_count--;
88    if (_ecore_evas_init_count == 0)
89      {
90      }
91    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
92    return _ecore_evas_init_count;
93 }
94
95 int
96 _ecore_evas_buffer_render(Ecore_Evas *ee)
97 {
98    Eina_List *updates, *l, *ll;
99    Ecore_Evas *ee2;
100    int rend = 0;
101
102    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
103      {
104         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
105         rend |= _ecore_evas_buffer_render(ee2);
106         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
107      }
108    if (ee->engine.buffer.image)
109      {
110         int w, h;
111
112         evas_object_image_size_get(ee->engine.buffer.image, &w, &h);
113         if ((w != ee->w) || (h != ee->h))
114           _ecore_evas_resize(ee, w, h);
115      }
116    updates = evas_render_updates(ee->evas);
117    if (ee->engine.buffer.image)
118      {
119         Eina_Rectangle *r;
120
121         EINA_LIST_FOREACH(updates, l, r)
122           evas_object_image_data_update_add(ee->engine.buffer.image,
123                                             r->x, r->y, r->w, r->h);
124      }
125    if (updates)
126      {
127         evas_render_updates_free(updates);
128         _ecore_evas_idle_timeout_update(ee);
129      }
130
131    return updates ? 1 : rend;
132 }
133
134 static void
135 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
136 {
137    Evas_Coord xx, yy, fx, fy, fw, fh;
138
139    evas_object_geometry_get(ee->engine.buffer.image, &xx, &yy, NULL, NULL);
140    evas_object_image_fill_get(ee->engine.buffer.image, &fx, &fy, &fw, &fh);
141
142    if (fw < 1) fw = 1;
143    xx = (*x - xx) - fx;
144    while (xx < 0) xx += fw;
145    while (xx > fw) xx -= fw;
146    *x = (ee->w * xx) / fw;
147
148    if (fh < 1) fh = 1;
149    yy = (*y - yy) - fy;
150    while (yy < 0) yy += fh;
151    while (yy > fh) yy -= fh;
152    *y = (ee->h * yy) / fh;
153 }
154
155 static void
156 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
157 {
158    Ecore_Evas *ee;
159    Evas_Event_Mouse_In *ev;
160
161    ee = data;
162    ev = event_info;
163    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
164 }
165
166 static void
167 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
168 {
169    Ecore_Evas *ee;
170    Evas_Event_Mouse_Out *ev;
171
172    ee = data;
173    ev = event_info;
174    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
175 }
176
177 static void
178 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
179 {
180    Ecore_Evas *ee;
181    Evas_Event_Mouse_Down *ev;
182
183    ee = data;
184    ev = event_info;
185    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
186 }
187
188 static void
189 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
190 {
191    Ecore_Evas *ee;
192    Evas_Event_Mouse_Up *ev;
193
194    ee = data;
195    ev = event_info;
196    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
197 }
198
199 static void
200 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
201 {
202    Ecore_Evas *ee;
203    Evas_Event_Mouse_Move *ev;
204    Evas_Coord x, y;
205
206    ee = data;
207    ev = event_info;
208    x = ev->cur.canvas.x;
209    y = ev->cur.canvas.y;
210    _ecore_evas_buffer_coord_translate(ee, &x, &y);
211    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
212 }
213
214 static void
215 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
216 {
217    Ecore_Evas *ee;
218    Evas_Event_Mouse_Wheel *ev;
219
220    ee = data;
221    ev = event_info;
222    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
223 }
224
225 static void
226 _ecore_evas_buffer_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
227 {
228    Ecore_Evas *ee;
229    Evas_Event_Multi_Down *ev;
230    Evas_Coord x, y, xx, yy;
231    double xf, yf;
232
233    ee = data;
234    ev = event_info;
235    x = ev->canvas.x;
236    y = ev->canvas.y;
237    xx = x;
238    yy = y;
239    _ecore_evas_buffer_coord_translate(ee, &x, &y);
240    xf = (ev->canvas.xsub - (double)xx) + (double)x;
241    yf = (ev->canvas.ysub - (double)yy) + (double)y;
242    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);
243 }
244
245 static void
246 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
247 {
248    Ecore_Evas *ee;
249    Evas_Event_Multi_Up *ev;
250    Evas_Coord x, y, xx, yy;
251    double xf, yf;
252
253    ee = data;
254    ev = event_info;
255    x = ev->canvas.x;
256    y = ev->canvas.y;
257    xx = x;
258    yy = y;
259    _ecore_evas_buffer_coord_translate(ee, &x, &y);
260    xf = (ev->canvas.xsub - (double)xx) + (double)x;
261    yf = (ev->canvas.ysub - (double)yy) + (double)y;
262    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);
263 }
264
265 static void
266 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
267 {
268    Ecore_Evas *ee;
269    Evas_Event_Multi_Move *ev;
270    Evas_Coord x, y, xx, yy;
271    double xf, yf;
272
273    ee = data;
274    ev = event_info;
275    x = ev->cur.canvas.x;
276    y = ev->cur.canvas.y;
277    xx = x;
278    yy = y;
279    _ecore_evas_buffer_coord_translate(ee, &x, &y);
280    xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
281    yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
282    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);
283 }
284
285 static void
286 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
287 {
288    Ecore_Evas *ee;
289
290    ee = data;
291    if (ee->driver) _ecore_evas_free(ee);
292 }
293
294 static void
295 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
296 {
297    Ecore_Evas *ee;
298    Evas_Event_Key_Down *ev;
299
300    ee = data;
301    ev = event_info;
302    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
303      evas_key_modifier_on(e, "Shift");
304    else
305      evas_key_modifier_off(e, "Shift");
306    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
307      evas_key_modifier_on(e, "Control");
308    else
309      evas_key_modifier_off(e, "Control");
310    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
311      evas_key_modifier_on(e, "Alt");
312    else
313      evas_key_modifier_off(e, "Alt");
314    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
315      evas_key_modifier_on(e, "Meta");
316    else
317      evas_key_modifier_off(e, "Meta");
318    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
319      evas_key_modifier_on(e, "Hyper");
320    else
321      evas_key_modifier_off(e, "Hyper");
322    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
323      evas_key_modifier_on(e, "Super");
324    else
325      evas_key_modifier_off(e, "Super");
326    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
327      evas_key_lock_on(e, "Scroll_Lock");
328    else
329      evas_key_lock_off(e, "Scroll_Lock");
330    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
331      evas_key_lock_on(e, "Num_Lock");
332    else
333      evas_key_lock_off(e, "Num_Lock");
334    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
335      evas_key_lock_on(e, "Caps_Lock");
336    else
337      evas_key_lock_off(e, "Caps_Lock");
338    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
339 }
340
341 static void
342 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
343 {
344    Ecore_Evas *ee;
345    Evas_Event_Key_Up *ev;
346
347    ee = data;
348    ev = event_info;
349    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
350      evas_key_modifier_on(e, "Shift");
351    else
352      evas_key_modifier_off(e, "Shift");
353    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
354      evas_key_modifier_on(e, "Control");
355    else
356      evas_key_modifier_off(e, "Control");
357    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
358      evas_key_modifier_on(e, "Alt");
359    else
360      evas_key_modifier_off(e, "Alt");
361    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
362      evas_key_modifier_on(e, "Meta");
363    else
364      evas_key_modifier_off(e, "Meta");
365    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
366      evas_key_modifier_on(e, "Hyper");
367    else
368      evas_key_modifier_off(e, "Hyper");
369    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
370      evas_key_modifier_on(e, "Super");
371    else
372      evas_key_modifier_off(e, "Super");
373    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
374      evas_key_lock_on(e, "Scroll_Lock");
375    else
376      evas_key_lock_off(e, "Scroll_Lock");
377    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
378      evas_key_lock_on(e, "Num_Lock");
379    else
380      evas_key_lock_off(e, "Num_Lock");
381    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
382      evas_key_lock_on(e, "Caps_Lock");
383    else
384      evas_key_lock_off(e, "Caps_Lock");
385    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
386 }
387
388 static void
389 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
390 {
391    Ecore_Evas *ee;
392
393    ee = data;
394    ee->prop.focused = 1;
395    evas_focus_in(ee->evas);
396    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
397 }
398
399 static void
400 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
401 {
402    Ecore_Evas *ee;
403
404    ee = data;
405    ee->prop.focused = 0;
406    evas_focus_out(ee->evas);
407    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
408 }
409
410 static void
411 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
412 {
413    Ecore_Evas *ee;
414
415    ee = data;
416    ee->visible = 1;
417    if (ee->func.fn_show) ee->func.fn_show(ee);
418 }
419
420 static void
421 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
422 {
423    Ecore_Evas *ee;
424
425    ee = data;
426    ee->visible = 0;
427    if (ee->func.fn_hide) ee->func.fn_hide(ee);
428 }
429
430 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
431 {
432    _ecore_evas_buffer_free,
433      NULL,
434      NULL,
435      NULL,
436      NULL,
437      NULL,
438      NULL,
439      NULL,
440      NULL,
441      NULL,
442      NULL,
443      NULL,
444      NULL,
445      NULL,
446      NULL,
447      NULL,
448      NULL,
449      _ecore_evas_resize,
450      NULL,
451      NULL,
452      NULL,
453      NULL,
454      NULL,
455      NULL,
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, //transparent
478      
479      NULL // render
480 };
481 #endif
482
483 static void *
484 _ecore_evas_buffer_pix_alloc(void *data __UNUSED__, int size)
485 {
486    return malloc(size);
487 }
488
489 static void
490 _ecore_evas_buffer_pix_free(void *data __UNUSED__, void *pix)
491 {
492    free(pix);
493 }
494
495 /**
496  * To be documented.
497  *
498  * FIXME: To be fixed.
499  */
500 EAPI Ecore_Evas *
501 ecore_evas_buffer_new(int w, int h)
502 {
503     return ecore_evas_buffer_allocfunc_new
504      (w, h, _ecore_evas_buffer_pix_alloc, _ecore_evas_buffer_pix_free, NULL);
505 }
506
507 EAPI Ecore_Evas *
508 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)
509 {
510 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
511    Evas_Engine_Info_Buffer *einfo;
512    Ecore_Evas *ee;
513    int rmethod;
514
515    if ((!alloc_func) || (!free_func)) return NULL;
516    rmethod = evas_render_method_lookup("buffer");
517    if (!rmethod) return NULL;
518    ee = calloc(1, sizeof(Ecore_Evas));
519    if (!ee) return NULL;
520
521    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
522
523    _ecore_evas_buffer_init();
524
525    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
526    ee->engine.buffer.alloc_func = alloc_func;
527    ee->engine.buffer.free_func = free_func;
528    ee->engine.buffer.data = (void *)data;
529
530    ee->driver = "buffer";
531
532    if (w < 1) w = 1;
533    if (h < 1) h = 1;
534    ee->rotation = 0;
535    ee->visible = 1;
536    ee->w = w;
537    ee->h = h;
538
539    ee->prop.max.w = 0;
540    ee->prop.max.h = 0;
541    ee->prop.layer = 0;
542    ee->prop.focused = 1;
543    ee->prop.borderless = 1;
544    ee->prop.override = 1;
545    ee->prop.maximized = 1;
546    ee->prop.fullscreen = 0;
547    ee->prop.withdrawn = 0;
548    ee->prop.sticky = 0;
549
550    /* init evas here */
551    ee->evas = evas_new();
552    evas_data_attach_set(ee->evas, ee);
553    evas_output_method_set(ee->evas, rmethod);
554    evas_output_size_set(ee->evas, w, h);
555    evas_output_viewport_set(ee->evas, 0, 0, w, h);
556
557    ee->engine.buffer.pixels = 
558      ee->engine.buffer.alloc_func
559      (ee->engine.buffer.data, w * h * sizeof(int));
560
561    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
562    if (einfo)
563      {
564         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
565         einfo->info.dest_buffer = ee->engine.buffer.pixels;
566         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
567         einfo->info.use_color_key = 0;
568         einfo->info.alpha_threshold = 0;
569         einfo->info.func.new_update_region = NULL;
570         einfo->info.func.free_update_region = NULL;
571         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
572      }
573    evas_key_modifier_add(ee->evas, "Shift");
574    evas_key_modifier_add(ee->evas, "Control");
575    evas_key_modifier_add(ee->evas, "Alt");
576    evas_key_modifier_add(ee->evas, "Meta");
577    evas_key_modifier_add(ee->evas, "Hyper");
578    evas_key_modifier_add(ee->evas, "Super");
579    evas_key_lock_add(ee->evas, "Caps_Lock");
580    evas_key_lock_add(ee->evas, "Num_Lock");
581    evas_key_lock_add(ee->evas, "Scroll_Lock");
582
583    evas_event_feed_mouse_in(ee->evas, 0, NULL);
584
585    ee->engine.func->fn_render = _ecore_evas_buffer_render;
586    _ecore_evas_register(ee);
587    
588    return ee;
589 #else
590    return NULL;
591 #endif
592 }
593
594 EAPI const void *
595 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
596 {
597 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
598    _ecore_evas_buffer_render(ee);
599    return ee->engine.buffer.pixels;
600 #else
601    return NULL;
602 #endif
603 }
604
605 EAPI Evas_Object *
606 ecore_evas_object_image_new(Ecore_Evas *ee_target)
607 {
608 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
609    Evas_Object *o;
610    Evas_Engine_Info_Buffer *einfo;
611    Ecore_Evas *ee;
612    int rmethod;
613    int w, h;
614
615    rmethod = evas_render_method_lookup("buffer");
616    if (!rmethod) return NULL;
617    ee = calloc(1, sizeof(Ecore_Evas));
618    if (!ee) return NULL;
619
620    o = evas_object_image_add(ee_target->evas);
621
622    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
623
624    _ecore_evas_buffer_init();
625
626    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
627
628    ee->driver = "buffer";
629
630    w = 1;
631    h = 1;
632    ee->rotation = 0;
633    ee->visible = 0;
634    ee->w = w;
635    ee->h = h;
636
637    ee->prop.max.w = 0;
638    ee->prop.max.h = 0;
639    ee->prop.layer = 0;
640    ee->prop.focused = 0;
641    ee->prop.borderless = 1;
642    ee->prop.override = 1;
643    ee->prop.maximized = 0;
644    ee->prop.fullscreen = 0;
645    ee->prop.withdrawn = 0;
646    ee->prop.sticky = 0;
647
648    /* init evas here */
649    ee->evas = evas_new();
650    evas_data_attach_set(ee->evas, ee);
651    evas_output_method_set(ee->evas, rmethod);
652    evas_output_size_set(ee->evas, w, h);
653    evas_output_viewport_set(ee->evas, 0, 0, w, h);
654
655    ee->engine.buffer.image = o;
656    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
657    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
658    evas_object_image_size_set(o, ee->w, ee->h);
659    evas_object_image_alpha_set(o, 1);
660    ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
661    evas_object_image_data_set(o, ee->engine.buffer.pixels);
662    evas_object_event_callback_add(ee->engine.buffer.image,
663                                   EVAS_CALLBACK_MOUSE_IN,
664                                   _ecore_evas_buffer_cb_mouse_in, ee);
665    evas_object_event_callback_add(ee->engine.buffer.image,
666                                   EVAS_CALLBACK_MOUSE_OUT,
667                                   _ecore_evas_buffer_cb_mouse_out, ee);
668    evas_object_event_callback_add(ee->engine.buffer.image,
669                                   EVAS_CALLBACK_MOUSE_DOWN,
670                                   _ecore_evas_buffer_cb_mouse_down, ee);
671    evas_object_event_callback_add(ee->engine.buffer.image,
672                                   EVAS_CALLBACK_MOUSE_UP,
673                                   _ecore_evas_buffer_cb_mouse_up, ee);
674    evas_object_event_callback_add(ee->engine.buffer.image,
675                                   EVAS_CALLBACK_MOUSE_MOVE,
676                                   _ecore_evas_buffer_cb_mouse_move, ee);
677    evas_object_event_callback_add(ee->engine.buffer.image,
678                                   EVAS_CALLBACK_MOUSE_WHEEL,
679                                   _ecore_evas_buffer_cb_mouse_wheel, ee);
680    evas_object_event_callback_add(ee->engine.buffer.image,
681                                   EVAS_CALLBACK_MULTI_DOWN,
682                                   _ecore_evas_buffer_cb_multi_down, ee);
683    evas_object_event_callback_add(ee->engine.buffer.image,
684                                   EVAS_CALLBACK_MULTI_UP,
685                                   _ecore_evas_buffer_cb_multi_up, ee);
686    evas_object_event_callback_add(ee->engine.buffer.image,
687                                   EVAS_CALLBACK_MULTI_MOVE,
688                                   _ecore_evas_buffer_cb_multi_move, ee);
689    evas_object_event_callback_add(ee->engine.buffer.image,
690                                   EVAS_CALLBACK_FREE,
691                                   _ecore_evas_buffer_cb_free, ee);
692    evas_object_event_callback_add(ee->engine.buffer.image,
693                                   EVAS_CALLBACK_KEY_DOWN,
694                                   _ecore_evas_buffer_cb_key_down, ee);
695    evas_object_event_callback_add(ee->engine.buffer.image,
696                                   EVAS_CALLBACK_KEY_UP,
697                                   _ecore_evas_buffer_cb_key_up, ee);
698    evas_object_event_callback_add(ee->engine.buffer.image,
699                                   EVAS_CALLBACK_FOCUS_IN,
700                                   _ecore_evas_buffer_cb_focus_in, ee);
701    evas_object_event_callback_add(ee->engine.buffer.image,
702                                   EVAS_CALLBACK_FOCUS_OUT,
703                                   _ecore_evas_buffer_cb_focus_out, ee);
704    evas_object_event_callback_add(ee->engine.buffer.image,
705                                   EVAS_CALLBACK_SHOW,
706                                   _ecore_evas_buffer_cb_show, ee);
707    evas_object_event_callback_add(ee->engine.buffer.image,
708                                   EVAS_CALLBACK_HIDE,
709                                   _ecore_evas_buffer_cb_hide, ee);
710    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
711    if (einfo)
712      {
713         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
714         einfo->info.dest_buffer = ee->engine.buffer.pixels;
715         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
716         einfo->info.use_color_key = 0;
717         einfo->info.alpha_threshold = 0;
718         einfo->info.func.new_update_region = NULL;
719         einfo->info.func.free_update_region = NULL;
720         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
721      }
722    evas_key_modifier_add(ee->evas, "Shift");
723    evas_key_modifier_add(ee->evas, "Control");
724    evas_key_modifier_add(ee->evas, "Alt");
725    evas_key_modifier_add(ee->evas, "Meta");
726    evas_key_modifier_add(ee->evas, "Hyper");
727    evas_key_modifier_add(ee->evas, "Super");
728    evas_key_lock_add(ee->evas, "Caps_Lock");
729    evas_key_lock_add(ee->evas, "Num_Lock");
730    evas_key_lock_add(ee->evas, "Scroll_Lock");
731
732    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
733    
734    ee->engine.func->fn_render = _ecore_evas_buffer_render;
735    
736    return o;
737 #else
738    return NULL;
739 #endif
740 }