1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4 
5 #include <stdlib.h>
6 
7 #include <Evas.h>
8 #include <Evas_Engine_Buffer.h>
9 #include <Ecore.h>
10 #include "ecore_private.h"
11 #include <Ecore_Input.h>
12 #include <Ecore_Input_Evas.h>
13 
14 #include "Ecore_Evas.h"
15 #include "ecore_evas_buffer.h"
16 #include "ecore_evas_private.h"
17 
18 static void
_ecore_evas_buffer_free(Ecore_Evas * ee)19 _ecore_evas_buffer_free(Ecore_Evas *ee)
20 {
21    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
22 
23    ecore_evas_input_event_unregister(ee);
24 
25    if (!bdata) return;
26    if (bdata->image)
27      {
28         Ecore_Evas *ee2;
29 
30         ee2 = evas_object_data_get(bdata->image, "Ecore_Evas_Parent");
31         evas_object_del(bdata->image);
32         if (ee2)
33           ee2->sub_ecore_evas = eina_list_remove(ee2->sub_ecore_evas, ee);
34      }
35    else
36      {
37         bdata->free_func(bdata->data, bdata->pixels);
38      }
39 
40    free(bdata);
41    ee->engine.data = NULL;
42 
43    ecore_event_evas_shutdown();
44 }
45 
46 static void
_ecore_evas_move(Ecore_Evas * ee,int x,int y)47 _ecore_evas_move(Ecore_Evas *ee, int x, int y)
48 {
49    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
50 
51    if (bdata->image) return;
52    ee->x = ee->req.x = x;
53    ee->y = ee->req.y = y;
54 }
55 
56 static void
_ecore_evas_resize(Ecore_Evas * ee,int w,int h)57 _ecore_evas_resize(Ecore_Evas *ee, int w, int h)
58 {
59    Evas_Engine_Info_Buffer *einfo;
60    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
61    int stride = 0;
62 
63    if (w < 1) w = 1;
64    if (h < 1) h = 1;
65    ee->req.w = w;
66    ee->req.h = h;
67    if ((w == ee->w) && (h == ee->h)) return;
68    ee->w = w;
69    ee->h = h;
70    evas_output_size_set(ee->evas, ee->w, ee->h);
71    evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
72    evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
73 
74    if (bdata->image)
75      {
76         bdata->pixels = evas_object_image_data_get(bdata->image, 1);
77         stride = evas_object_image_stride_get(bdata->image);
78      }
79    else
80      {
81         if (bdata->pixels)
82           bdata->free_func(bdata->data, bdata->pixels);
83         bdata->pixels =
84           bdata->alloc_func(bdata->data, ee->w * ee->h * sizeof(int));
85         stride = ee->w * sizeof(int);
86      }
87 
88    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
89    if (einfo)
90      {
91         if (ee->alpha)
92           einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
93         else
94           einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
95         einfo->info.dest_buffer = bdata->pixels;
96         einfo->info.dest_buffer_row_bytes = stride;
97         einfo->info.use_color_key = 0;
98         einfo->info.alpha_threshold = 0;
99         einfo->info.func.new_update_region = NULL;
100         einfo->info.func.free_update_region = NULL;
101         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
102           {
103              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
104           }
105      }
106    if (bdata->image)
107      evas_object_image_data_set(bdata->image, bdata->pixels);
108    else
109      bdata->resized = 1;
110 }
111 
112 static void
_ecore_evas_move_resize(Ecore_Evas * ee,int x EINA_UNUSED,int y EINA_UNUSED,int w,int h)113 _ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, int w, int h)
114 {
115    _ecore_evas_resize(ee, w, h);
116 }
117 
118 static void
_ecore_evas_buffer_ignore_events_set(Ecore_Evas * ee,int val)119 _ecore_evas_buffer_ignore_events_set(Ecore_Evas *ee, int val)
120 {
121    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
122 
123    if (ee->ignore_events == val) return;
124    ee->ignore_events = val;
125    if (bdata->image)
126      evas_object_pass_events_set(bdata->image, val);
127 }
128 
129 static void
_ecore_evas_show(Ecore_Evas * ee)130 _ecore_evas_show(Ecore_Evas *ee)
131 {
132    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
133 
134    if (bdata->image) return;
135    if (ecore_evas_focus_device_get(ee, NULL)) return;
136    ee->prop.withdrawn = EINA_FALSE;
137    if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
138    _ecore_evas_focus_device_set(ee, NULL, EINA_TRUE);
139 }
140 
141 static void
_ecore_evas_buffer_title_set(Ecore_Evas * ee,const char * t)142 _ecore_evas_buffer_title_set(Ecore_Evas *ee, const char *t)
143 {
144    if (eina_streq(ee->prop.title, t)) return;
145    if (ee->prop.title) free(ee->prop.title);
146    ee->prop.title = NULL;
147    if (!t) return;
148    ee->prop.title = strdup(t);
149 }
150 
151 static void
_ecore_evas_buffer_name_class_set(Ecore_Evas * ee,const char * n,const char * c)152 _ecore_evas_buffer_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
153 {
154    if (!eina_streq(n, ee->prop.name))
155      {
156        	free(ee->prop.name);
157        	ee->prop.name = NULL;
158        	if (n) ee->prop.name = strdup(n);
159      }
160    if (!eina_streq(c, ee->prop.clas))
161      {
162        	free(ee->prop.clas);
163        	ee->prop.clas = NULL;
164        	if (c) ee->prop.clas = strdup(c);
165      }
166 }
167 
168 static Eina_Bool
_ecore_evas_buffer_prepare(Ecore_Evas * ee)169 _ecore_evas_buffer_prepare(Ecore_Evas *ee)
170 {
171    Ecore_Evas_Engine_Buffer_Data *bdata;
172 
173    bdata = ee->engine.data;
174    if (bdata->image)
175      {
176         int w, h;
177 
178         evas_object_image_size_get(bdata->image, &w, &h);
179         if ((w != ee->w) || (h != ee->h))
180           _ecore_evas_resize(ee, w, h);
181         if (evas_changed_get(ee->evas) && !bdata->lock_data)
182           {
183              bdata->pixels = evas_object_image_data_get(bdata->image, 1);
184              bdata->lock_data = EINA_TRUE;
185           }
186      }
187    else if (bdata->resized)
188      {
189         if (ee->func.fn_resize) ee->func.fn_resize(ee);
190         bdata->resized = 0;
191      }
192    return EINA_TRUE;
193 }
194 
195 static void
_ecore_evas_buffer_update_image(void * data,Evas * e EINA_UNUSED,void * event_info)196 _ecore_evas_buffer_update_image(void *data, Evas *e EINA_UNUSED, void *event_info)
197 {
198    Evas_Event_Render_Post *post = event_info;
199    Ecore_Evas *ee = data;
200    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
201    Eina_Rectangle *r;
202    Eina_List *l;
203 
204    evas_object_image_data_set(bdata->image, bdata->pixels);
205    EINA_LIST_FOREACH(post->updated_area, l, r)
206      evas_object_image_data_update_add(bdata->image,
207                                        r->x, r->y, r->w, r->h);
208 
209    bdata->lock_data = EINA_FALSE;
210 }
211 
212 EAPI int
ecore_evas_buffer_render(Ecore_Evas * ee)213 ecore_evas_buffer_render(Ecore_Evas *ee)
214 {
215    int r;
216 
217    r = ecore_evas_render(ee);
218    ecore_evas_render_wait(ee);
219    return r;
220 }
221 
222 // NOTE: if you fix this, consider fixing ecore_evas_ews.c as it is similar!
223 static void
_ecore_evas_buffer_coord_translate(Ecore_Evas * ee,Evas_Coord * x,Evas_Coord * y)224 _ecore_evas_buffer_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
225 {
226    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
227    Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
228 
229    evas_object_geometry_get(bdata->image, &xx, &yy, &ww, &hh);
230    evas_object_image_fill_get(bdata->image, &fx, &fy, &fw, &fh);
231 
232    if (fw < 1) fw = 1;
233    if (fh < 1) fh = 1;
234 
235    if (evas_object_map_get(bdata->image) &&
236        evas_object_map_enable_get(bdata->image))
237      {
238         fx = 0; fy = 0;
239         fw = ee->w; fh = ee->h;
240         ww = ee->w; hh = ee->h;
241      }
242 
243    if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
244      {
245         *x = (ee->w * (*x - xx)) / fw;
246         *y = (ee->h * (*y - yy)) / fh;
247      }
248    else
249      {
250         xx = (*x - xx) - fx;
251         while (xx < 0) xx += fw;
252         while (xx > fw) xx -= fw;
253         *x = (ee->w * xx) / fw;
254 
255         yy = (*y - yy) - fy;
256         while (yy < 0) yy += fh;
257         while (yy > fh) yy -= fh;
258         *y = (ee->h * yy) / fh;
259      }
260 }
261 
262 static void
_ecore_evas_buffer_transfer_modifiers_locks(Evas * e,Evas * e2)263 _ecore_evas_buffer_transfer_modifiers_locks(Evas *e, Evas *e2)
264 {
265    const char *mods[] =
266      { "Shift", "Control", "Alt", "Meta", "Hyper", "Super", NULL };
267    const char *locks[] =
268      { "Scroll_Lock", "Num_Lock", "Caps_Lock", NULL };
269    int i;
270 
271    for (i = 0; mods[i]; i++)
272      {
273         if (evas_key_modifier_is_set(evas_key_modifier_get(e), mods[i]))
274           evas_key_modifier_on(e2, mods[i]);
275         else
276           evas_key_modifier_off(e2, mods[i]);
277      }
278    for (i = 0; locks[i]; i++)
279      {
280         if (evas_key_lock_is_set(evas_key_lock_get(e), locks[i]))
281           evas_key_lock_on(e2, locks[i]);
282         else
283           evas_key_lock_off(e2, locks[i]);
284      }
285 }
286 
287 static void
_ecore_evas_buffer_cb_mouse_in(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)288 _ecore_evas_buffer_cb_mouse_in(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
289 {
290    Ecore_Evas *ee;
291    Evas_Event_Mouse_In *ev;
292 
293    ee = data;
294    ev = event_info;
295    if (!ee->evas) return;
296    if (ee->ignore_events) return;
297    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
298    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
299 }
300 
301 static void
_ecore_evas_buffer_cb_mouse_out(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)302 _ecore_evas_buffer_cb_mouse_out(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
303 {
304    Ecore_Evas *ee;
305    Evas_Event_Mouse_Out *ev;
306 
307    ee = data;
308    ev = event_info;
309    if (!ee->evas) return;
310    if (ee->ignore_events) return;
311    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
312    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
313 }
314 
315 static void
_ecore_evas_buffer_cb_mouse_down(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)316 _ecore_evas_buffer_cb_mouse_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
317 {
318    Ecore_Evas *ee;
319    Evas_Event_Mouse_Down *ev;
320 
321    ee = data;
322    ev = event_info;
323    if (!ee->evas) return;
324    if (ee->ignore_events) return;
325    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
326    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
327 }
328 
329 static void
_ecore_evas_buffer_cb_mouse_up(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)330 _ecore_evas_buffer_cb_mouse_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
331 {
332    Ecore_Evas *ee;
333    Evas_Event_Mouse_Up *ev;
334 
335    ee = data;
336    ev = event_info;
337    if (!ee->evas) return;
338    if (ee->ignore_events) return;
339    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
340    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
341 }
342 
343 static void
_ecore_evas_buffer_cb_mouse_move(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)344 _ecore_evas_buffer_cb_mouse_move(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
345 {
346    Ecore_Evas *ee;
347    Evas_Event_Mouse_Move *ev;
348    Evas_Coord x, y;
349 
350    ee = data;
351    ev = event_info;
352    x = ev->cur.canvas.x;
353    y = ev->cur.canvas.y;
354    if (!ee->evas) return;
355    _ecore_evas_buffer_coord_translate(ee, &x, &y);
356    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
357    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
358 }
359 
360 static void
_ecore_evas_buffer_cb_mouse_wheel(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)361 _ecore_evas_buffer_cb_mouse_wheel(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
362 {
363    Ecore_Evas *ee;
364    Evas_Event_Mouse_Wheel *ev;
365 
366    ee = data;
367    ev = event_info;
368    if (!ee->evas) return;
369    if (ee->ignore_events) return;
370    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
371    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
372 }
373 
374 static void
_ecore_evas_buffer_cb_multi_down(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)375 _ecore_evas_buffer_cb_multi_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
376 {
377    Ecore_Evas *ee;
378    Evas_Event_Multi_Down *ev;
379    Evas_Coord x, y, xx, yy;
380    double xf, yf;
381 
382    ee = data;
383    ev = event_info;
384    x = ev->canvas.x;
385    y = ev->canvas.y;
386    xx = x;
387    yy = y;
388    if (!ee->evas) return;
389    if (ee->ignore_events) return;
390    _ecore_evas_buffer_coord_translate(ee, &x, &y);
391    xf = (ev->canvas.xsub - (double)xx) + (double)x;
392    yf = (ev->canvas.ysub - (double)yy) + (double)y;
393    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
394    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);
395 }
396 
397 static void
_ecore_evas_buffer_cb_multi_up(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)398 _ecore_evas_buffer_cb_multi_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
399 {
400    Ecore_Evas *ee;
401    Evas_Event_Multi_Up *ev;
402    Evas_Coord x, y, xx, yy;
403    double xf, yf;
404 
405    ee = data;
406    ev = event_info;
407    x = ev->canvas.x;
408    y = ev->canvas.y;
409    xx = x;
410    yy = y;
411    if (!ee->evas) return;
412    if (ee->ignore_events) return;
413    _ecore_evas_buffer_coord_translate(ee, &x, &y);
414    xf = (ev->canvas.xsub - (double)xx) + (double)x;
415    yf = (ev->canvas.ysub - (double)yy) + (double)y;
416    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
417    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);
418 }
419 
420 static void
_ecore_evas_buffer_cb_multi_move(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)421 _ecore_evas_buffer_cb_multi_move(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
422 {
423    Ecore_Evas *ee;
424    Evas_Event_Multi_Move *ev;
425    Evas_Coord x, y, xx, yy;
426    double xf, yf;
427 
428    ee = data;
429    ev = event_info;
430    x = ev->cur.canvas.x;
431    y = ev->cur.canvas.y;
432    xx = x;
433    yy = y;
434    if (!ee->evas) return;
435    if (ee->ignore_events) return;
436    _ecore_evas_buffer_coord_translate(ee, &x, &y);
437    xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
438    yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
439    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
440    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);
441 }
442 
443 static void
_ecore_evas_buffer_cb_free(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)444 _ecore_evas_buffer_cb_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
445 {
446    Ecore_Evas *ee;
447 
448    ee = data;
449    if (ee->driver) _ecore_evas_free(ee);
450 }
451 
452 static void
_ecore_evas_buffer_cb_key_down(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)453 _ecore_evas_buffer_cb_key_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
454 {
455    Ecore_Evas *ee;
456    Evas_Event_Key_Down *ev;
457 
458    ee = data;
459    ev = event_info;
460    if (!ee->evas) return;
461    if (ee->ignore_events) return;
462    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
463    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
464 }
465 
466 static void
_ecore_evas_buffer_cb_key_up(void * data,Evas * e,Evas_Object * obj EINA_UNUSED,void * event_info)467 _ecore_evas_buffer_cb_key_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
468 {
469    Ecore_Evas *ee;
470    Evas_Event_Key_Up *ev;
471 
472    ee = data;
473    ev = event_info;
474    if (!ee->evas) return;
475    if (ee->ignore_events) return;
476    _ecore_evas_buffer_transfer_modifiers_locks(e, ee->evas);
477    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
478 }
479 
480 static void
_ecore_evas_buffer_cb_focus_in(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)481 _ecore_evas_buffer_cb_focus_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
482 {
483    Ecore_Evas *ee;
484 
485    ee = data;
486    if (!ee->evas) return;
487    _ecore_evas_focus_device_set(ee, NULL, EINA_TRUE);
488 }
489 
490 static void
_ecore_evas_buffer_cb_focus_out(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)491 _ecore_evas_buffer_cb_focus_out(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
492 {
493    Ecore_Evas *ee;
494 
495    ee = data;
496    if (!ee->evas) return;
497    _ecore_evas_focus_device_set(ee, NULL, EINA_FALSE);
498 }
499 
500 static void
_ecore_evas_buffer_cb_show(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)501 _ecore_evas_buffer_cb_show(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
502 {
503    Ecore_Evas *ee;
504 
505    ee = data;
506    ee->prop.withdrawn = EINA_FALSE;
507    if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
508    ee->visible = 1;
509    if (ee->func.fn_show) ee->func.fn_show(ee);
510 }
511 
512 static void
_ecore_evas_buffer_cb_hide(void * data,Evas * e EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)513 _ecore_evas_buffer_cb_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
514 {
515    Ecore_Evas *ee;
516 
517    ee = data;
518    ee->prop.withdrawn = EINA_TRUE;
519    if (ee->func.fn_state_change) ee->func.fn_state_change(ee);
520    ee->visible = 0;
521    if (ee->func.fn_hide) ee->func.fn_hide(ee);
522 }
523 
524 static void
_ecore_evas_buffer_alpha_set(Ecore_Evas * ee,int alpha)525 _ecore_evas_buffer_alpha_set(Ecore_Evas *ee, int alpha)
526 {
527    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
528    if (((ee->alpha) && (alpha)) || ((!ee->alpha) && (!alpha))) return;
529    ee->alpha = alpha;
530    if (bdata->image)
531      evas_object_image_alpha_set(bdata->image, ee->alpha);
532    else
533      {
534         Evas_Engine_Info_Buffer *einfo;
535 
536         einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
537         if (einfo)
538           {
539              if (ee->alpha)
540                einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
541              else
542                einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
543              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
544                ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
545           }
546      }
547 }
548 
549 static void
_ecore_evas_buffer_profile_set(Ecore_Evas * ee,const char * profile)550 _ecore_evas_buffer_profile_set(Ecore_Evas *ee, const char *profile)
551 {
552    _ecore_evas_window_profile_free(ee);
553    ee->prop.profile.name = NULL;
554 
555    if (profile)
556      {
557         ee->prop.profile.name = (char *)eina_stringshare_add(profile);
558 
559         /* just change ee's state.*/
560         if (ee->func.fn_state_change)
561           ee->func.fn_state_change(ee);
562      }
563 }
564 
565 static void
_ecore_evas_buffer_msg_parent_send(Ecore_Evas * ee,int msg_domain,int msg_id,void * data,int size)566 _ecore_evas_buffer_msg_parent_send(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
567 {
568    Ecore_Evas *parent_ee = NULL;
569    parent_ee = ecore_evas_data_get(ee, "parent");
570 
571    if (parent_ee)
572      {
573         if (parent_ee->func.fn_msg_parent_handle)
574           parent_ee ->func.fn_msg_parent_handle(parent_ee, msg_domain, msg_id, data, size);
575      }
576    else
577      {
578         if (ee->func.fn_msg_parent_handle)
579           ee ->func.fn_msg_parent_handle(ee, msg_domain, msg_id, data, size);
580      }
581 }
582 
583 static void
_ecore_evas_buffer_msg_send(Ecore_Evas * ee,int msg_domain,int msg_id,void * data,int size)584 _ecore_evas_buffer_msg_send(Ecore_Evas *ee, int msg_domain, int msg_id, void *data, int size)
585 {
586    Ecore_Evas *child_ee = NULL;
587    child_ee = ecore_evas_data_get(ee, "child");
588 
589    if (child_ee)
590      {
591         if (child_ee->func.fn_msg_handle)
592           child_ee->func.fn_msg_handle(child_ee, msg_domain, msg_id, data, size);
593      }
594    else
595      {
596         if (ee->func.fn_msg_handle)
597           ee->func.fn_msg_handle(ee, msg_domain, msg_id, data, size);
598      }
599 }
600 
601 static void
_ecore_evas_buffer_screen_geometry_get(const Ecore_Evas * ee,int * x,int * y,int * w,int * h)602 _ecore_evas_buffer_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h)
603 {
604    if (x) *x = ee->x;
605    if (y) *y = ee->y;
606    if (w) *w = ee->w;
607    if (h) *h = ee->h;
608 }
609 
610 static void
_ecore_evas_buffer_pointer_xy_get(const Ecore_Evas * ee,Evas_Coord * x,Evas_Coord * y)611 _ecore_evas_buffer_pointer_xy_get(const Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
612 {
613    evas_pointer_canvas_xy_get(ee->evas, x, y);
614 }
615 
616 static Eina_Bool
_ecore_evas_buffer_pointer_warp(const Ecore_Evas * ee,Evas_Coord x,Evas_Coord y)617 _ecore_evas_buffer_pointer_warp(const Ecore_Evas *ee, Evas_Coord x, Evas_Coord y)
618 {
619    Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data;
620 
621    if (bdata->image)
622      _ecore_evas_mouse_move_process((Ecore_Evas*)ee, x, y, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff));
623    else if (!ee->ignore_events)
624      {
625         Ecore_Event_Mouse_Move *ev;
626 
627         ev = calloc(1, sizeof(Ecore_Event_Mouse_Move));
628         EINA_SAFETY_ON_NULL_RETURN_VAL(ev, EINA_FALSE);
629 
630         ev->window = ee->prop.window;
631         ev->event_window = ee->prop.window;
632         ev->root_window = ee->prop.window;
633         ev->timestamp = (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff);
634         ev->same_screen = 1;
635 
636         ev->x = x;
637         ev->y = y;
638         ev->root.x = x;
639         ev->root.y = y;
640 
641         {
642            const char *mods[] =
643              { "Shift", "Control", "Alt", "Super", NULL };
644            int modifiers[] =
645              { ECORE_EVENT_MODIFIER_SHIFT, ECORE_EVENT_MODIFIER_CTRL, ECORE_EVENT_MODIFIER_ALT,
646                ECORE_EVENT_MODIFIER_WIN, 0 };
647            int i;
648 
649            for (i = 0; mods[i]; i++)
650              if (evas_key_modifier_is_set(evas_key_modifier_get(ee->evas), mods[i]))
651                ev->modifiers |= modifiers[i];
652         }
653 
654         //FIXME ev->multi.device = ???
655 
656         ev->multi.radius = 1;
657         ev->multi.radius_x = 1;
658         ev->multi.radius_y = 1;
659         ev->multi.pressure = 1.0;
660         ev->multi.angle = 0.0;
661         ev->multi.x = ev->x;
662         ev->multi.y = ev->y;
663         ev->multi.root.x = ev->x;
664         ev->multi.root.y = ev->y;
665 
666         ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL);
667      }
668    return EINA_TRUE;
669 }
670 
671 static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
672 {
673    _ecore_evas_buffer_free,
674    NULL,
675    NULL,
676    NULL,
677    NULL,
678    NULL,
679    NULL,
680    NULL,
681    NULL,
682    NULL,
683    NULL,
684    NULL,
685    NULL,
686    NULL,
687    NULL,
688    _ecore_evas_move,
689    NULL,
690    _ecore_evas_resize,
691    _ecore_evas_move_resize,
692    NULL,
693    NULL,
694    _ecore_evas_show,
695    NULL,
696    NULL,
697    NULL,
698    NULL,
699    _ecore_evas_buffer_title_set,
700    _ecore_evas_buffer_name_class_set,
701    NULL,
702    NULL,
703    NULL,
704    NULL,
705    NULL,
706    NULL,
707    NULL,
708    NULL,
709    NULL,
710    NULL,
711    NULL,
712    NULL,
713    NULL,
714    NULL,
715    NULL,
716    NULL,
717    _ecore_evas_buffer_ignore_events_set,
718    _ecore_evas_buffer_alpha_set,
719    NULL, //transparent
720    NULL, // profiles_set
721    _ecore_evas_buffer_profile_set,
722 
723    NULL,
724    NULL,
725    NULL,
726    NULL,
727    NULL,
728    NULL,
729 
730    NULL,
731    _ecore_evas_buffer_screen_geometry_get,
732    NULL,  // screen_dpi_get
733    _ecore_evas_buffer_msg_parent_send,
734    _ecore_evas_buffer_msg_send,
735 
736    _ecore_evas_buffer_pointer_xy_get, // pointer_xy_get
737    _ecore_evas_buffer_pointer_warp, // pointer_warp
738 
739    NULL, // wm_rot_preferred_rotation_set
740    NULL, // wm_rot_available_rotations_set
741    NULL, // wm_rot_manual_rotation_done_set
742    NULL, // wm_rot_manual_rotation_done
743 
744    NULL, // aux_hints_set
745 
746    NULL, // fn_animator_register
747    NULL, // fn_animator_unregister
748 
749    NULL, // fn_evas_changed
750    NULL, //fn_focus_device_set
751    NULL, //fn_callback_focus_device_in_set
752    NULL, //fn_callback_focus_device_out_set
753    NULL, //fn_callback_device_mouse_in_set
754    NULL, //fn_callback_device_mouse_out_set
755    NULL, //fn_pointer_device_xy_get
756    _ecore_evas_buffer_prepare,
757    NULL // fn_last_tick_get
758 };
759 
760 static void *
_ecore_evas_buffer_pix_alloc(void * data EINA_UNUSED,int size)761 _ecore_evas_buffer_pix_alloc(void *data EINA_UNUSED, int size)
762 {
763    return malloc(size);
764 }
765 
766 static void
_ecore_evas_buffer_pix_free(void * data EINA_UNUSED,void * pix)767 _ecore_evas_buffer_pix_free(void *data EINA_UNUSED, void *pix)
768 {
769    free(pix);
770 }
771 
772 EAPI Ecore_Evas *
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)773 ecore_evas_buffer_allocfunc_new(int w, int h,
774                                 void *(*alloc_func) (void *data, int size),
775                                 void (*free_func) (void *data, void *pix),
776                                 const void *data)
777 {
778    Evas_Engine_Info_Buffer *einfo;
779    Ecore_Evas_Engine_Buffer_Data *bdata;
780    Ecore_Evas *ee;
781    int rmethod;
782 
783    EINA_SAFETY_ON_NULL_RETURN_VAL(alloc_func, NULL);
784    EINA_SAFETY_ON_NULL_RETURN_VAL(free_func, NULL);
785 
786    rmethod = evas_render_method_lookup("buffer");
787    EINA_SAFETY_ON_TRUE_RETURN_VAL(rmethod == 0, NULL);
788 
789    ee = calloc(1, sizeof(Ecore_Evas));
790    EINA_SAFETY_ON_NULL_RETURN_VAL(ee, NULL);
791 
792    bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
793    if (!bdata)
794      {
795 	free(ee);
796 	return NULL;
797      }
798 
799    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
800 
801    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
802    ee->engine.data = bdata;
803    bdata->alloc_func = alloc_func;
804    bdata->free_func = free_func;
805    bdata->data = (void *)data;
806 
807    ee->driver = "buffer";
808 
809    if (w < 1) w = 1;
810    if (h < 1) h = 1;
811    ee->rotation = 0;
812    ee->visible = 1;
813    ee->w = w;
814    ee->h = h;
815    ee->req.w = ee->w;
816    ee->req.h = ee->h;
817    ee->profile_supported = 1;
818 
819    if (getenv("ECORE_EVAS_FORCE_SYNC_RENDER"))
820      ee->can_async_render = 0;
821    else
822      ee->can_async_render = 1;
823 
824    ee->prop.max.w = 0;
825    ee->prop.max.h = 0;
826    ee->prop.layer = 0;
827    ee->prop.borderless = EINA_TRUE;
828    ee->prop.override = EINA_TRUE;
829    ee->prop.maximized = EINA_TRUE;
830    ee->prop.fullscreen = EINA_FALSE;
831    ee->prop.withdrawn = EINA_FALSE;
832    ee->prop.sticky = EINA_FALSE;
833 
834    /* init evas here */
835    if (!ecore_evas_evas_new(ee, w, h))
836      {
837         ERR("Can not create a Canvas.");
838         ecore_evas_free(ee);
839         return NULL;
840      }
841 
842    evas_output_method_set(ee->evas, rmethod);
843 
844    bdata->pixels = bdata->alloc_func(bdata->data, w * h * sizeof(int));
845 
846    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
847    if (einfo)
848      {
849         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32;
850         einfo->info.dest_buffer = bdata->pixels;
851         einfo->info.dest_buffer_row_bytes = ee->w * sizeof(int);
852         einfo->info.use_color_key = 0;
853         einfo->info.alpha_threshold = 0;
854         einfo->info.func.new_update_region = NULL;
855         einfo->info.func.free_update_region = NULL;
856         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
857           {
858              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
859              ecore_evas_free(ee);
860              return NULL;
861           }
862      }
863    else
864      {
865         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
866         ecore_evas_free(ee);
867         return NULL;
868      }
869    evas_key_modifier_add(ee->evas, "Shift");
870    evas_key_modifier_add(ee->evas, "Control");
871    evas_key_modifier_add(ee->evas, "Alt");
872    evas_key_modifier_add(ee->evas, "Meta");
873    evas_key_modifier_add(ee->evas, "Hyper");
874    evas_key_modifier_add(ee->evas, "Super");
875    evas_key_lock_add(ee->evas, "Caps_Lock");
876    evas_key_lock_add(ee->evas, "Num_Lock");
877    evas_key_lock_add(ee->evas, "Scroll_Lock");
878 
879    if (!_ecore_evas_cursors_init(ee))
880      {
881         ERR("Could not init the Ecore Evas cursors");
882         ecore_evas_free(ee);
883         return NULL;
884      }
885    evas_event_feed_mouse_in(ee->evas, 0, NULL);
886 
887    _ecore_evas_register(ee);
888 
889    evas_event_feed_mouse_in(ee->evas, (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff), NULL);
890    _ecore_evas_focus_device_set(ee, NULL, EINA_TRUE);
891 
892    return ee;
893 }
894 
895 EAPI Ecore_Evas *
ecore_evas_buffer_new(int w,int h)896 ecore_evas_buffer_new(int w, int h)
897 {
898    Ecore_Evas *ee;
899 
900    ecore_event_evas_init();
901 
902    ee =
903      ecore_evas_buffer_allocfunc_new(w, h, _ecore_evas_buffer_pix_alloc,
904                                      _ecore_evas_buffer_pix_free, NULL);
905 
906    if (!ee)
907      {
908         ecore_event_evas_shutdown();
909         return NULL;
910      }
911 
912    ecore_evas_done(ee, EINA_TRUE);
913 
914    return ee;
915 }
916 
917 EAPI const void *
ecore_evas_buffer_pixels_get(Ecore_Evas * ee)918 ecore_evas_buffer_pixels_get(Ecore_Evas *ee)
919 {
920    Ecore_Evas_Engine_Buffer_Data *bdata;
921 
922    EINA_SAFETY_ON_NULL_RETURN_VAL(ee, NULL);
923 
924    bdata = ee->engine.data;
925    ecore_evas_render(ee);
926    ecore_evas_render_wait(ee);
927    return bdata->pixels;
928 }
929 
930 EAPI Ecore_Evas *
ecore_evas_buffer_ecore_evas_parent_get(Ecore_Evas * ee)931 ecore_evas_buffer_ecore_evas_parent_get(Ecore_Evas *ee)
932 {
933    Ecore_Evas_Engine_Buffer_Data *bdata;
934 
935    EINA_SAFETY_ON_NULL_RETURN_VAL(ee, NULL);
936 
937    bdata = ee->engine.data;
938    return evas_object_data_get(bdata->image, "Ecore_Evas_Parent");
939 }
940 
941 EAPI Evas_Object *
ecore_evas_object_image_new(Ecore_Evas * ee_target)942 ecore_evas_object_image_new(Ecore_Evas *ee_target)
943 {
944    Evas_Object *o;
945    Ecore_Evas_Engine_Buffer_Data *bdata;
946    Evas_Engine_Info_Buffer *einfo;
947    Ecore_Evas *ee;
948    int rmethod;
949    int w = 1, h = 1;
950 
951    EINA_SAFETY_ON_NULL_RETURN_VAL(ee_target, NULL);
952 
953    rmethod = evas_render_method_lookup("buffer");
954    EINA_SAFETY_ON_TRUE_RETURN_VAL(rmethod == 0, NULL);
955 
956    ee = calloc(1, sizeof(Ecore_Evas));
957    EINA_SAFETY_ON_NULL_RETURN_VAL(ee, NULL);
958 
959    bdata = calloc(1, sizeof(Ecore_Evas_Engine_Buffer_Data));
960    if (!bdata)
961      {
962 	free(ee);
963 	return NULL;
964      }
965 
966    ee->engine.data = bdata;
967 
968    o = evas_object_image_add(ee_target->evas);
969    evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
970    evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
971    evas_object_image_alpha_set(o, 0);
972    evas_object_image_size_set(o, w, h);
973 
974    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
975 
976    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_buffer_engine_func;
977 
978    ee->driver = "buffer";
979 
980    ee->rotation = 0;
981    ee->visible = 0;
982    ee->w = w;
983    ee->h = h;
984    ee->req.w = ee->w;
985    ee->req.h = ee->h;
986    ee->profile_supported = 1;
987    ee->can_async_render = 0;
988 
989    ee->prop.max.w = 0;
990    ee->prop.max.h = 0;
991    ee->prop.layer = 0;
992    ee->prop.borderless = EINA_TRUE;
993    ee->prop.override = EINA_TRUE;
994    ee->prop.maximized = EINA_FALSE;
995    ee->prop.fullscreen = EINA_FALSE;
996    ee->prop.withdrawn = EINA_TRUE;
997    ee->prop.sticky = EINA_FALSE;
998 
999    /* init evas here */
1000    ee->evas = evas_new();
1001    evas_data_attach_set(ee->evas, ee);
1002    evas_output_method_set(ee->evas, rmethod);
1003    evas_output_size_set(ee->evas, w, h);
1004    evas_output_viewport_set(ee->evas, 0, 0, w, h);
1005    evas_event_callback_add(ee->evas, EVAS_CALLBACK_RENDER_POST, _ecore_evas_buffer_update_image, ee);
1006 
1007    bdata->image = o;
1008    evas_object_data_set(bdata->image, "Ecore_Evas", ee);
1009    evas_object_data_set(bdata->image, "Ecore_Evas_Parent", ee_target);
1010    evas_object_event_callback_add(bdata->image,
1011                                   EVAS_CALLBACK_MOUSE_IN,
1012                                   _ecore_evas_buffer_cb_mouse_in, ee);
1013    evas_object_event_callback_add(bdata->image,
1014                                   EVAS_CALLBACK_MOUSE_OUT,
1015                                   _ecore_evas_buffer_cb_mouse_out, ee);
1016    evas_object_event_callback_add(bdata->image,
1017                                   EVAS_CALLBACK_MOUSE_DOWN,
1018                                   _ecore_evas_buffer_cb_mouse_down, ee);
1019    evas_object_event_callback_add(bdata->image,
1020                                   EVAS_CALLBACK_MOUSE_UP,
1021                                   _ecore_evas_buffer_cb_mouse_up, ee);
1022    evas_object_event_callback_add(bdata->image,
1023                                   EVAS_CALLBACK_MOUSE_MOVE,
1024                                   _ecore_evas_buffer_cb_mouse_move, ee);
1025    evas_object_event_callback_add(bdata->image,
1026                                   EVAS_CALLBACK_MOUSE_WHEEL,
1027                                   _ecore_evas_buffer_cb_mouse_wheel, ee);
1028    evas_object_event_callback_add(bdata->image,
1029                                   EVAS_CALLBACK_MULTI_DOWN,
1030                                   _ecore_evas_buffer_cb_multi_down, ee);
1031    evas_object_event_callback_add(bdata->image,
1032                                   EVAS_CALLBACK_MULTI_UP,
1033                                   _ecore_evas_buffer_cb_multi_up, ee);
1034    evas_object_event_callback_add(bdata->image,
1035                                   EVAS_CALLBACK_MULTI_MOVE,
1036                                   _ecore_evas_buffer_cb_multi_move, ee);
1037    evas_object_event_callback_add(bdata->image,
1038                                   EVAS_CALLBACK_FREE,
1039                                   _ecore_evas_buffer_cb_free, ee);
1040    evas_object_event_callback_add(bdata->image,
1041                                   EVAS_CALLBACK_KEY_DOWN,
1042                                   _ecore_evas_buffer_cb_key_down, ee);
1043    evas_object_event_callback_add(bdata->image,
1044                                   EVAS_CALLBACK_KEY_UP,
1045                                   _ecore_evas_buffer_cb_key_up, ee);
1046    evas_object_event_callback_add(bdata->image,
1047                                   EVAS_CALLBACK_FOCUS_IN,
1048                                   _ecore_evas_buffer_cb_focus_in, ee);
1049    evas_object_event_callback_add(bdata->image,
1050                                   EVAS_CALLBACK_FOCUS_OUT,
1051                                   _ecore_evas_buffer_cb_focus_out, ee);
1052    evas_object_event_callback_add(bdata->image,
1053                                   EVAS_CALLBACK_SHOW,
1054                                   _ecore_evas_buffer_cb_show, ee);
1055    evas_object_event_callback_add(bdata->image,
1056                                   EVAS_CALLBACK_HIDE,
1057                                   _ecore_evas_buffer_cb_hide, ee);
1058    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1059    if (einfo)
1060      {
1061         bdata->pixels = evas_object_image_data_get(o, 1);
1062         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1063         einfo->info.dest_buffer = bdata->pixels;
1064         einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
1065         einfo->info.use_color_key = 0;
1066         einfo->info.alpha_threshold = 0;
1067         einfo->info.func.new_update_region = NULL;
1068         einfo->info.func.free_update_region = NULL;
1069         evas_object_image_data_set(o, bdata->pixels);
1070         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1071           {
1072              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1073              ecore_evas_free(ee);
1074              return NULL;
1075           }
1076      }
1077    else
1078      {
1079         ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1080         ecore_evas_free(ee);
1081         return NULL;
1082      }
1083    evas_key_modifier_add(ee->evas, "Shift");
1084    evas_key_modifier_add(ee->evas, "Control");
1085    evas_key_modifier_add(ee->evas, "Alt");
1086    evas_key_modifier_add(ee->evas, "Meta");
1087    evas_key_modifier_add(ee->evas, "Hyper");
1088    evas_key_modifier_add(ee->evas, "Super");
1089    evas_key_lock_add(ee->evas, "Caps_Lock");
1090    evas_key_lock_add(ee->evas, "Num_Lock");
1091    evas_key_lock_add(ee->evas, "Scroll_Lock");
1092 
1093    if (!_ecore_evas_cursors_init(ee))
1094      {
1095         ERR("Could not init the Ecore Evas cursors");
1096         ecore_evas_free(ee);
1097         return NULL;
1098      }
1099 
1100    _ecore_evas_subregister(ee_target, ee);
1101    ecore_event_evas_init();
1102    return o;
1103 }
1104