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