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