multitouch support for xi2 and floating xi devices
[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_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
224 {
225    Ecore_Evas *ee;
226    Evas_Event_Multi_Down *ev;
227    Evas_Coord x, y;
228
229    ee = data;
230    ev = event_info;
231    x = ev->canvas.x;
232    y = ev->canvas.y;
233    _ecore_evas_buffer_coord_translate(ee, &x, &y);
234    evas_event_feed_multi_down(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->flags, ev->timestamp, NULL);
235 }
236
237 static void
238 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
239 {
240    Ecore_Evas *ee;
241    Evas_Event_Multi_Up *ev;
242    Evas_Coord x, y;
243
244    ee = data;
245    ev = event_info;
246    x = ev->canvas.x;
247    y = ev->canvas.y;
248    _ecore_evas_buffer_coord_translate(ee, &x, &y);
249    evas_event_feed_multi_up(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->flags, ev->timestamp, NULL);
250 }
251
252 static void
253 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
254 {
255    Ecore_Evas *ee;
256    Evas_Event_Multi_Move *ev;
257    Evas_Coord x, y;
258
259    ee = data;
260    ev = event_info;
261    x = ev->cur.canvas.x;
262    y = ev->cur.canvas.y;
263    _ecore_evas_buffer_coord_translate(ee, &x, &y);
264    evas_event_feed_multi_move(ee->evas, ev->device, x, y, ev->radius, ev->radius_x, ev->radius_y, ev->timestamp, NULL);
265 }
266
267 static void
268 _ecore_evas_buffer_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
269 {
270    Ecore_Evas *ee;
271
272    ee = data;
273    if (ee->driver) _ecore_evas_free(ee);
274 }
275
276 static void
277 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
278 {
279    Ecore_Evas *ee;
280    Evas_Event_Key_Down *ev;
281
282    ee = data;
283    ev = event_info;
284    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
285      evas_key_modifier_on(e, "Shift");
286    else
287      evas_key_modifier_off(e, "Shift");
288    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
289      evas_key_modifier_on(e, "Control");
290    else
291      evas_key_modifier_off(e, "Control");
292    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
293      evas_key_modifier_on(e, "Alt");
294    else
295      evas_key_modifier_off(e, "Alt");
296    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
297      evas_key_modifier_on(e, "Meta");
298    else
299      evas_key_modifier_off(e, "Meta");
300    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
301      evas_key_modifier_on(e, "Hyper");
302    else
303      evas_key_modifier_off(e, "Hyper");
304    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
305      evas_key_modifier_on(e, "Super");
306    else
307      evas_key_modifier_off(e, "Super");
308    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
309      evas_key_lock_on(e, "Scroll_Lock");
310    else
311      evas_key_lock_off(e, "Scroll_Lock");
312    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
313      evas_key_lock_on(e, "Num_Lock");
314    else
315      evas_key_lock_off(e, "Num_Lock");
316    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
317      evas_key_lock_on(e, "Caps_Lock");
318    else
319      evas_key_lock_off(e, "Caps_Lock");
320    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
321 }
322
323 static void
324 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
325 {
326    Ecore_Evas *ee;
327    Evas_Event_Key_Up *ev;
328
329    ee = data;
330    ev = event_info;
331    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
332      evas_key_modifier_on(e, "Shift");
333    else
334      evas_key_modifier_off(e, "Shift");
335    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
336      evas_key_modifier_on(e, "Control");
337    else
338      evas_key_modifier_off(e, "Control");
339    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
340      evas_key_modifier_on(e, "Alt");
341    else
342      evas_key_modifier_off(e, "Alt");
343    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
344      evas_key_modifier_on(e, "Meta");
345    else
346      evas_key_modifier_off(e, "Meta");
347    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
348      evas_key_modifier_on(e, "Hyper");
349    else
350      evas_key_modifier_off(e, "Hyper");
351    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
352      evas_key_modifier_on(e, "Super");
353    else
354      evas_key_modifier_off(e, "Super");
355    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
356      evas_key_lock_on(e, "Scroll_Lock");
357    else
358      evas_key_lock_off(e, "Scroll_Lock");
359    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
360      evas_key_lock_on(e, "Num_Lock");
361    else
362      evas_key_lock_off(e, "Num_Lock");
363    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
364      evas_key_lock_on(e, "Caps_Lock");
365    else
366      evas_key_lock_off(e, "Caps_Lock");
367    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
368 }
369
370 static void
371 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
372 {
373    Ecore_Evas *ee;
374
375    ee = data;
376    ee->prop.focused = 1;
377    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
378 }
379
380 static void
381 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
382 {
383    Ecore_Evas *ee;
384
385    ee = data;
386    ee->prop.focused = 0;
387    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
388 }
389
390 static void
391 _ecore_evas_buffer_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
392 {
393    Ecore_Evas *ee;
394
395    ee = data;
396    ee->visible = 1;
397    if (ee->func.fn_show) ee->func.fn_show(ee);
398 }
399
400 static void
401 _ecore_evas_buffer_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
402 {
403    Ecore_Evas *ee;
404
405    ee = data;
406    ee->visible = 0;
407    if (ee->func.fn_hide) ee->func.fn_hide(ee);
408 }
409
410 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
411 {
412    _ecore_evas_buffer_free,
413      NULL,
414      NULL,
415      NULL,
416      NULL,
417      NULL,
418      NULL,
419      NULL,
420      NULL,
421      NULL,
422      NULL,
423      NULL,
424      NULL,
425      NULL,
426      NULL,
427      NULL,
428      NULL,
429      _ecore_evas_resize,
430      NULL,
431      NULL,
432      NULL,
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      NULL,
450      NULL,
451      NULL,
452      NULL,
453      NULL,
454      NULL,
455      NULL,
456      NULL,
457      
458      NULL // render
459 };
460 #endif
461
462 /**
463  * To be documented.
464  *
465  * FIXME: To be fixed.
466  */
467 EAPI Ecore_Evas *
468 ecore_evas_buffer_new(int w, int h)
469 {
470 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
471    Evas_Engine_Info_Buffer *einfo;
472    Ecore_Evas *ee;
473    int rmethod;
474
475    rmethod = evas_render_method_lookup("buffer");
476    if (!rmethod) return NULL;
477    ee = calloc(1, sizeof(Ecore_Evas));
478    if (!ee) return NULL;
479
480    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
481
482    _ecore_evas_buffer_init();
483
484    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
485
486    ee->driver = "buffer";
487
488    if (w < 1) w = 1;
489    if (h < 1) h = 1;
490    ee->rotation = 0;
491    ee->visible = 1;
492    ee->w = w;
493    ee->h = h;
494
495    ee->prop.max.w = 0;
496    ee->prop.max.h = 0;
497    ee->prop.layer = 0;
498    ee->prop.focused = 1;
499    ee->prop.borderless = 1;
500    ee->prop.override = 1;
501    ee->prop.maximized = 1;
502    ee->prop.fullscreen = 0;
503    ee->prop.withdrawn = 0;
504    ee->prop.sticky = 0;
505
506    /* init evas here */
507    ee->evas = evas_new();
508    evas_data_attach_set(ee->evas, ee);
509    evas_output_method_set(ee->evas, rmethod);
510    evas_output_size_set(ee->evas, w, h);
511    evas_output_viewport_set(ee->evas, 0, 0, w, h);
512
513    ee->engine.buffer.pixels = malloc(w * h * sizeof(int));
514
515    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
516    if (einfo)
517      {
518         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
519         einfo->info.dest_buffer = ee->engine.buffer.pixels;
520         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
521         einfo->info.use_color_key = 0;
522         einfo->info.alpha_threshold = 0;
523         einfo->info.func.new_update_region = NULL;
524         einfo->info.func.free_update_region = NULL;
525         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
526      }
527    evas_key_modifier_add(ee->evas, "Shift");
528    evas_key_modifier_add(ee->evas, "Control");
529    evas_key_modifier_add(ee->evas, "Alt");
530    evas_key_modifier_add(ee->evas, "Meta");
531    evas_key_modifier_add(ee->evas, "Hyper");
532    evas_key_modifier_add(ee->evas, "Super");
533    evas_key_lock_add(ee->evas, "Caps_Lock");
534    evas_key_lock_add(ee->evas, "Num_Lock");
535    evas_key_lock_add(ee->evas, "Scroll_Lock");
536
537    evas_event_feed_mouse_in(ee->evas, 0, NULL);
538
539    ee->engine.func->fn_render = _ecore_evas_buffer_render;
540    _ecore_evas_register(ee);
541    
542    return ee;
543 #else
544    return NULL;
545 #endif
546 }
547
548 EAPI const void *
549 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
550 {
551 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
552    _ecore_evas_buffer_render(ee);
553    return ee->engine.buffer.pixels;
554 #else
555    return NULL;
556 #endif
557 }
558
559 EAPI Evas_Object *
560 ecore_evas_object_image_new(Ecore_Evas *ee_target)
561 {
562 #ifdef BUILD_ECORE_EVAS_SOFTWARE_BUFFER
563    Evas_Object *o;
564    Evas_Engine_Info_Buffer *einfo;
565    Ecore_Evas *ee;
566    int rmethod;
567    int w, h;
568
569    rmethod = evas_render_method_lookup("buffer");
570    if (!rmethod) return NULL;
571    ee = calloc(1, sizeof(Ecore_Evas));
572    if (!ee) return NULL;
573
574    o = evas_object_image_add(ee_target->evas);
575
576    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
577
578    _ecore_evas_buffer_init();
579
580    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
581
582    ee->driver = "buffer";
583
584    w = 1;
585    h = 1;
586    ee->rotation = 0;
587    ee->visible = 0;
588    ee->w = w;
589    ee->h = h;
590
591    ee->prop.max.w = 0;
592    ee->prop.max.h = 0;
593    ee->prop.layer = 0;
594    ee->prop.focused = 0;
595    ee->prop.borderless = 1;
596    ee->prop.override = 1;
597    ee->prop.maximized = 0;
598    ee->prop.fullscreen = 0;
599    ee->prop.withdrawn = 0;
600    ee->prop.sticky = 0;
601
602    /* init evas here */
603    ee->evas = evas_new();
604    evas_data_attach_set(ee->evas, ee);
605    evas_output_method_set(ee->evas, rmethod);
606    evas_output_size_set(ee->evas, w, h);
607    evas_output_viewport_set(ee->evas, 0, 0, w, h);
608
609    ee->engine.buffer.image = o;
610    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas", ee);
611    evas_object_data_set(ee->engine.buffer.image, "Ecore_Evas_Parent", ee_target);
612    evas_object_image_size_set(o, ee->w, ee->h);
613    evas_object_image_alpha_set(o, 1);
614    ee->engine.buffer.pixels = evas_object_image_data_get(o, 1);
615    evas_object_image_data_set(o, ee->engine.buffer.pixels);
616    evas_object_event_callback_add(ee->engine.buffer.image,
617                                   EVAS_CALLBACK_MOUSE_IN,
618                                   _ecore_evas_buffer_cb_mouse_in, ee);
619    evas_object_event_callback_add(ee->engine.buffer.image,
620                                   EVAS_CALLBACK_MOUSE_OUT,
621                                   _ecore_evas_buffer_cb_mouse_out, ee);
622    evas_object_event_callback_add(ee->engine.buffer.image,
623                                   EVAS_CALLBACK_MOUSE_DOWN,
624                                   _ecore_evas_buffer_cb_mouse_down, ee);
625    evas_object_event_callback_add(ee->engine.buffer.image,
626                                   EVAS_CALLBACK_MOUSE_UP,
627                                   _ecore_evas_buffer_cb_mouse_up, ee);
628    evas_object_event_callback_add(ee->engine.buffer.image,
629                                   EVAS_CALLBACK_MOUSE_MOVE,
630                                   _ecore_evas_buffer_cb_mouse_move, ee);
631    evas_object_event_callback_add(ee->engine.buffer.image,
632                                   EVAS_CALLBACK_MOUSE_WHEEL,
633                                   _ecore_evas_buffer_cb_mouse_wheel, ee);
634    evas_object_event_callback_add(ee->engine.buffer.image,
635                                   EVAS_CALLBACK_MULTI_DOWN,
636                                   _ecore_evas_buffer_cb_multi_down, ee);
637    evas_object_event_callback_add(ee->engine.buffer.image,
638                                   EVAS_CALLBACK_MULTI_UP,
639                                   _ecore_evas_buffer_cb_multi_up, ee);
640    evas_object_event_callback_add(ee->engine.buffer.image,
641                                   EVAS_CALLBACK_MULTI_MOVE,
642                                   _ecore_evas_buffer_cb_multi_move, ee);
643    evas_object_event_callback_add(ee->engine.buffer.image,
644                                   EVAS_CALLBACK_FREE,
645                                   _ecore_evas_buffer_cb_free, ee);
646    evas_object_event_callback_add(ee->engine.buffer.image,
647                                   EVAS_CALLBACK_KEY_DOWN,
648                                   _ecore_evas_buffer_cb_key_down, ee);
649    evas_object_event_callback_add(ee->engine.buffer.image,
650                                   EVAS_CALLBACK_KEY_UP,
651                                   _ecore_evas_buffer_cb_key_up, ee);
652    evas_object_event_callback_add(ee->engine.buffer.image,
653                                   EVAS_CALLBACK_FOCUS_IN,
654                                   _ecore_evas_buffer_cb_focus_in, ee);
655    evas_object_event_callback_add(ee->engine.buffer.image,
656                                   EVAS_CALLBACK_FOCUS_OUT,
657                                   _ecore_evas_buffer_cb_focus_out, ee);
658    evas_object_event_callback_add(ee->engine.buffer.image,
659                                   EVAS_CALLBACK_SHOW,
660                                   _ecore_evas_buffer_cb_show, ee);
661    evas_object_event_callback_add(ee->engine.buffer.image,
662                                   EVAS_CALLBACK_HIDE,
663                                   _ecore_evas_buffer_cb_hide, ee);
664    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
665    if (einfo)
666      {
667         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
668         einfo->info.dest_buffer = ee->engine.buffer.pixels;
669         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
670         einfo->info.use_color_key = 0;
671         einfo->info.alpha_threshold = 0;
672         einfo->info.func.new_update_region = NULL;
673         einfo->info.func.free_update_region = NULL;
674         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
675      }
676    evas_key_modifier_add(ee->evas, "Shift");
677    evas_key_modifier_add(ee->evas, "Control");
678    evas_key_modifier_add(ee->evas, "Alt");
679    evas_key_modifier_add(ee->evas, "Meta");
680    evas_key_modifier_add(ee->evas, "Hyper");
681    evas_key_modifier_add(ee->evas, "Super");
682    evas_key_lock_add(ee->evas, "Caps_Lock");
683    evas_key_lock_add(ee->evas, "Num_Lock");
684    evas_key_lock_add(ee->evas, "Scroll_Lock");
685
686    ee_target->sub_ecore_evas = eina_list_append(ee_target->sub_ecore_evas, ee);
687    
688    ee->engine.func->fn_render = _ecore_evas_buffer_render;
689    
690    return o;
691 #else
692    return NULL;
693 #endif
694 }