ecore: unused-params--
[framework/uifw/ecore.git] / src / lib / ecore_evas / ecore_evas_ews.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdlib.h>
6 #include <string.h>
7 #include <sys/types.h>
8
9 #include <Eina.h>
10 #include <Ecore.h>
11 #include "ecore_private.h"
12 #include <Ecore_Input.h>
13
14 #include "ecore_evas_private.h"
15 #include "Ecore_Evas.h"
16
17 EAPI int ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = 0;
18 EAPI int ECORE_EVAS_EWS_EVENT_ADD = 0;
19 EAPI int ECORE_EVAS_EWS_EVENT_DEL = 0;
20 EAPI int ECORE_EVAS_EWS_EVENT_RESIZE = 0;
21 EAPI int ECORE_EVAS_EWS_EVENT_MOVE = 0;
22 EAPI int ECORE_EVAS_EWS_EVENT_SHOW = 0;
23 EAPI int ECORE_EVAS_EWS_EVENT_HIDE = 0;
24 EAPI int ECORE_EVAS_EWS_EVENT_FOCUS = 0;
25 EAPI int ECORE_EVAS_EWS_EVENT_UNFOCUS = 0;
26 EAPI int ECORE_EVAS_EWS_EVENT_RAISE = 0;
27 EAPI int ECORE_EVAS_EWS_EVENT_LOWER = 0;
28 EAPI int ECORE_EVAS_EWS_EVENT_ACTIVATE = 0;
29
30 EAPI int ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = 0;
31 EAPI int ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = 0;
32 EAPI int ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = 0;
33 EAPI int ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = 0;
34 EAPI int ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = 0;
35
36 #ifdef BUILD_ECORE_EVAS_EWS
37 static int _ecore_evas_init_count = 0;
38
39 static Ecore_Evas *_ews_ee = NULL;
40 static Evas_Object *_ews_bg = NULL;
41 static Eina_List *_ews_children = NULL;
42 static const void *_ews_manager = NULL;
43 static char *_ews_engine = NULL;
44 static char *_ews_options = NULL;
45 static int _ews_x = 0;
46 static int _ews_y = 0;
47 static int _ews_w = 1024;
48 static int _ews_h = 768;
49 static Eina_Bool _ews_defaults_engine = EINA_TRUE;
50 static Eina_Bool _ews_defaults_geo = EINA_TRUE;
51
52 static const char EWS_ENGINE_NAME[] = "ews";
53
54 static void
55 _ecore_evas_ews_pre_free(Ecore_Evas *ee __UNUSED__)
56 {
57    DBG("EWS backing store free'd");
58    _ews_children = eina_list_free(_ews_children);
59    _ews_ee = NULL;
60    _ews_bg = NULL;
61 }
62
63 static void
64 _ecore_evas_ews_del_request(Ecore_Evas *ee __UNUSED__)
65 {
66    INF("EWS backing store deletion is forbidden!");
67 }
68
69 static Ecore_Evas *
70 _ecore_evas_ews_ee_new(void)
71 {
72    Ecore_Evas *ee = ecore_evas_new(_ews_engine, _ews_x, _ews_y, _ews_w, _ews_h,
73                                    _ews_options);
74    if (!ee)
75      ERR("Failed: ecore_evas_new(%s, %d, %d, %d, %d, %s)",
76          _ews_engine, _ews_x, _ews_y, _ews_w, _ews_h, _ews_options);
77    else
78      {
79         ecore_evas_size_min_set(ee, _ews_w, _ews_h);
80         ecore_evas_size_max_set(ee, _ews_w, _ews_h);
81         ecore_evas_callback_pre_free_set(ee, _ecore_evas_ews_pre_free);
82         ecore_evas_callback_delete_request_set(ee, _ecore_evas_ews_del_request);
83         ecore_evas_name_class_set(ee, "ecore_evas_ews", "ews");
84         ecore_evas_title_set
85           (ee, "EWS: Ecore + Evas Single Process Windowing System");
86         ecore_evas_show(ee);
87      }
88
89    return ee;
90 }
91
92 static void
93 _ecore_evas_ews_env_setup(void)
94 {
95    const char *env = getenv("ECORE_EVAS_EWS");
96    char *p, *n, *tmp;
97
98    if (_ews_defaults_engine)
99      {
100         free(_ews_engine);
101         _ews_engine = NULL;
102         free(_ews_options);
103         _ews_options = NULL;
104      }
105    if (_ews_defaults_geo)
106      {
107         _ews_x = 0;
108         _ews_y = 0;
109         _ews_w = 1024;
110         _ews_h = 768;
111      }
112
113    if ((!env) || (!*env)) return;
114
115    p = tmp = strdup(env);
116    if (!tmp) return;
117
118    n = strchr(p, ':');
119    if (n) *n = '\0';
120    if (_ews_defaults_engine) _ews_engine = strdup(p);
121    if (!n) goto end;
122
123    p = n + 1;
124    n = strchr(p, ':');
125    if (!n) goto end;
126    *n = '\0';
127    if (_ews_defaults_geo) _ews_x = atoi(p);
128
129    p = n + 1;
130    n = strchr(p, ':');
131    if (!n) goto end;
132    *n = '\0';
133    if (_ews_defaults_geo) _ews_y = atoi(p);
134
135    p = n + 1;
136    n = strchr(p, ':');
137    if (!n) goto end;
138    *n = '\0';
139    if (_ews_defaults_geo) _ews_w = atoi(p);
140
141    p = n + 1;
142    n = strchr(p, ':');
143    if (n) *n = '\0';
144    if (_ews_defaults_geo) _ews_h = atoi(p);
145    if (!n) goto end;
146
147    p = n + 1;
148    if (_ews_defaults_engine) _ews_options = strdup(p);
149
150  end:
151    free(tmp);
152 }
153
154 static void
155 _ecore_evas_ews_event_free(void *data __UNUSED__, void *ev)
156 {
157    Ecore_Evas *ee = ev;
158    _ecore_evas_unref(ee);
159 }
160
161 static void
162 _ecore_evas_ews_event(Ecore_Evas *ee, int event)
163 {
164    _ecore_evas_ref(ee);
165    ecore_event_add(event, ee, _ecore_evas_ews_event_free, NULL);
166 }
167
168 static void
169 _ecore_evas_ews_event_free_del(void *data __UNUSED__, void *ev __UNUSED__)
170 {
171    _ecore_evas_ews_shutdown();
172 }
173
174 static void
175 _ecore_evas_ews_free(Ecore_Evas *ee)
176 {
177    evas_object_del(ee->engine.ews.image);
178    _ews_ee->sub_ecore_evas = eina_list_remove(_ews_ee->sub_ecore_evas, ee);
179
180    ecore_event_add(ECORE_EVAS_EWS_EVENT_DEL, ee, _ecore_evas_ews_event_free_del, NULL);
181 }
182
183 static void
184 _ecore_evas_ews_move(Ecore_Evas *ee, int x, int y)
185 {
186    ee->req.x = x;
187    ee->req.y = y;
188
189    if ((x == ee->x) && (y == ee->y)) return;
190    ee->x = x;
191    ee->y = y;
192    evas_object_move(ee->engine.ews.image, x, y);
193    if (ee->func.fn_move) ee->func.fn_move(ee);
194
195    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
196 }
197
198 static void
199 _ecore_evas_ews_managed_move(Ecore_Evas *ee, int x, int y)
200 {
201    ee->req.x = x;
202    ee->req.y = y;
203
204    if ((x == ee->x) && (y == ee->y)) return;
205    ee->x = x;
206    ee->y = y;
207    if (ee->func.fn_move) ee->func.fn_move(ee);
208    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MOVE);
209 }
210
211 static void
212 _ecore_evas_ews_resize_internal(Ecore_Evas *ee, int w, int h)
213 {
214    Evas_Engine_Info_Buffer *einfo;
215    void *pixels;
216    int stride;
217
218    evas_output_size_set(ee->evas, w, h);
219    evas_output_viewport_set(ee->evas, 0, 0, w, h);
220    evas_damage_rectangle_add(ee->evas, 0, 0, w, h);
221
222    evas_object_image_size_set(ee->engine.ews.image, w, h);
223    evas_object_image_fill_set(ee->engine.ews.image, 0, 0, w, h);
224    evas_object_resize(ee->engine.ews.image, w, h);
225
226    pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
227    evas_object_image_data_set(ee->engine.ews.image, pixels); // refcount
228    stride = evas_object_image_stride_get(ee->engine.ews.image);
229
230    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
231    EINA_SAFETY_ON_NULL_RETURN(einfo);
232
233    einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
234    einfo->info.dest_buffer = pixels;
235    einfo->info.dest_buffer_row_bytes = stride;
236    einfo->info.use_color_key = 0;
237    einfo->info.alpha_threshold = 0;
238    einfo->info.func.new_update_region = NULL;
239    einfo->info.func.free_update_region = NULL;
240    evas_object_image_data_set(ee->engine.ews.image, pixels);
241    if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
242      {
243         ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
244      }
245 }
246
247 static void
248 _ecore_evas_ews_resize(Ecore_Evas *ee, int w, int h)
249 {
250    if (w < 1) w = 1;
251    if (h < 1) h = 1;
252
253    ee->req.w = w;
254    ee->req.h = h;
255
256    if ((w == ee->w) && (h == ee->h)) return;
257    ee->w = w;
258    ee->h = h;
259    _ecore_evas_ews_resize_internal(ee, w, h);
260    if (ee->func.fn_resize) ee->func.fn_resize(ee);
261    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RESIZE);
262 }
263
264 static void
265 _ecore_evas_ews_move_resize(Ecore_Evas *ee, int x, int y, int w, int h)
266 {
267    _ecore_evas_ews_move(ee, x, y);
268    _ecore_evas_ews_resize(ee, w, h);
269 }
270
271 static void
272 _ecore_evas_ews_rotation_set(Ecore_Evas *ee, int rot, int resize __UNUSED__)
273 {
274    if (ee->rotation == rot) return;
275    ee->rotation = rot;
276
277    ERR("TODO: rot=%d, resize=%d", rot, resize);
278
279    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
280 }
281
282 static void
283 _ecore_evas_ews_shaped_set(Ecore_Evas *ee, int val)
284 {
285    if (ee->shaped == val) return;
286    ee->shaped = val;
287    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
288 }
289
290 static void
291 _ecore_evas_ews_show(Ecore_Evas *ee)
292 {
293    ee->should_be_visible = EINA_TRUE;
294    evas_object_show(ee->engine.ews.image);
295    if (ee->prop.fullscreen)
296      evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
297
298    if (ee->func.fn_show) ee->func.fn_show(ee);
299    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_SHOW);
300 }
301
302 static void
303 _ecore_evas_ews_hide(Ecore_Evas *ee)
304 {
305    ee->should_be_visible = EINA_FALSE;
306    evas_object_hide(ee->engine.ews.image);
307
308    if (ee->func.fn_hide) ee->func.fn_hide(ee);
309    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_HIDE);
310 }
311
312 static void
313 _ecore_evas_ews_raise(Ecore_Evas *ee)
314 {
315    evas_object_raise(ee->engine.ews.image);
316    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_RAISE);
317 }
318
319 static void
320 _ecore_evas_ews_lower(Ecore_Evas *ee)
321 {
322    evas_object_lower(ee->engine.ews.image);
323    evas_object_lower(_ews_bg);
324    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LOWER);
325 }
326
327 static void
328 _ecore_evas_ews_activate(Ecore_Evas *ee)
329 {
330    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ACTIVATE);
331 }
332
333 static void
334 _ecore_evas_ews_title_set(Ecore_Evas *ee, const char *t)
335 {
336    if (ee->prop.title) free(ee->prop.title);
337    ee->prop.title = NULL;
338    if (t) ee->prop.title = strdup(t);
339    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
340 }
341
342 static void
343 _ecore_evas_ews_name_class_set(Ecore_Evas *ee, const char *n, const char *c)
344 {
345    if (ee->prop.name) free(ee->prop.name);
346    if (ee->prop.clas) free(ee->prop.clas);
347    ee->prop.name = NULL;
348    ee->prop.clas = NULL;
349    if (n) ee->prop.name = strdup(n);
350    if (c) ee->prop.clas = strdup(c);
351    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
352 }
353
354 static void
355 _ecore_evas_ews_size_min_set(Ecore_Evas *ee, int w, int h)
356 {
357    if (w < 0) w = 0;
358    if (h < 0) h = 0;
359    if ((ee->prop.min.w == w) && (ee->prop.min.h == h)) return;
360    ee->prop.min.w = w;
361    ee->prop.min.h = h;
362    evas_object_size_hint_min_set(ee->engine.ews.image, w, h);
363    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
364 }
365
366 static void
367 _ecore_evas_ews_size_max_set(Ecore_Evas *ee, int w, int h)
368 {
369    if (w < 0) w = 0;
370    if (h < 0) h = 0;
371    if ((ee->prop.max.w == w) && (ee->prop.max.h == h)) return;
372    ee->prop.max.w = w;
373    ee->prop.max.h = h;
374    evas_object_size_hint_max_set(ee->engine.ews.image, w, h);
375    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
376 }
377
378 static void
379 _ecore_evas_ews_size_base_set(Ecore_Evas *ee, int w, int h)
380 {
381    if (w < 0) w = 0;
382    if (h < 0) h = 0;
383    if ((ee->prop.base.w == w) && (ee->prop.base.h == h)) return;
384    ee->prop.base.w = w;
385    ee->prop.base.h = h;
386    evas_object_size_hint_request_set(ee->engine.ews.image, w, h);
387    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
388 }
389
390 static void
391 _ecore_evas_ews_size_step_set(Ecore_Evas *ee, int w, int h)
392 {
393    if (w < 1) w = 1;
394    if (h < 1) h = 1;
395    if ((ee->prop.step.w == w) && (ee->prop.step.h == h)) return;
396    ee->prop.step.w = w;
397    ee->prop.step.h = h;
398    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
399 }
400
401 static void
402 _ecore_evas_ews_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
403 {
404    Ecore_Evas *ee = data;
405    ee->prop.cursor.object = NULL;
406 }
407
408 static void
409 _ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
410 {
411    int x, y;
412
413    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
414
415    if (!obj)
416      {
417         ee->prop.cursor.object = NULL;
418         ee->prop.cursor.layer = 0;
419         ee->prop.cursor.hot.x = 0;
420         ee->prop.cursor.hot.y = 0;
421         return;
422      }
423
424    ee->prop.cursor.object = obj;
425    ee->prop.cursor.layer = layer;
426    ee->prop.cursor.hot.x = hot_x;
427    ee->prop.cursor.hot.y = hot_y;
428    evas_pointer_output_xy_get(ee->evas, &x, &y);
429    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
430    evas_object_move(ee->prop.cursor.object,
431                     x - ee->prop.cursor.hot.x,
432                     y - ee->prop.cursor.hot.y);
433    evas_object_pass_events_set(ee->prop.cursor.object, 1);
434    if (evas_pointer_inside_get(ee->evas))
435      evas_object_show(ee->prop.cursor.object);
436
437    evas_object_event_callback_add
438      (obj, EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
439
440    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
441 }
442
443 static void
444 _ecore_evas_ews_layer_set(Ecore_Evas *ee, int layer)
445 {
446    if (layer < EVAS_LAYER_MIN + 1)
447      layer = EVAS_LAYER_MIN + 1;
448    else if (layer > EVAS_LAYER_MAX)
449      layer = EVAS_LAYER_MAX;
450
451    if (ee->prop.layer == layer) return;
452    ee->prop.layer = layer;
453    evas_object_layer_set(ee->engine.ews.image, layer);
454    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_LAYER_CHANGE);
455 }
456
457 static void
458 _ecore_evas_ews_focus_set(Ecore_Evas *ee, int val)
459 {
460    evas_object_focus_set(ee->engine.ews.image, val);
461    ee->prop.focused = val;
462    if (val)
463      {
464         evas_focus_in(ee->evas);
465         if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
466         _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FOCUS);
467      }
468    else
469      {
470         evas_focus_out(ee->evas);
471         if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
472         _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_UNFOCUS);
473      }
474 }
475
476 static void
477 _ecore_evas_ews_iconified_set(Ecore_Evas *ee, int val)
478 {
479    if (ee->prop.iconified == val) return;
480    ee->prop.iconified = val;
481    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE);
482 }
483
484 static void
485 _ecore_evas_ews_borderless_set(Ecore_Evas *ee, int val)
486 {
487    if (ee->prop.borderless == val) return;
488    ee->prop.borderless = val;
489    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
490 }
491
492 static void
493 _ecore_evas_ews_override_set(Ecore_Evas *ee, int val)
494 {
495    if (ee->prop.override == val) return;
496    if (ee->visible) evas_object_show(ee->engine.ews.image);
497    if (ee->prop.focused) evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
498    ee->prop.override = val;
499    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
500 }
501
502 static void
503 _ecore_evas_ews_maximized_set(Ecore_Evas *ee, int val)
504 {
505    if (ee->prop.maximized == val) return;
506    ee->prop.maximized = val;
507    if (val) evas_object_show(ee->engine.ews.image);
508    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE);
509 }
510
511 static void
512 _ecore_evas_ews_fullscreen_set(Ecore_Evas *ee, int val)
513 {
514    if (ee->prop.fullscreen == val) return;
515    ee->prop.fullscreen = val;
516
517    if (!val)
518      {
519         evas_object_move(ee->engine.ews.image, ee->x, ee->y);
520         evas_object_resize(ee->engine.ews.image, ee->w, ee->h);
521      }
522    else
523      {
524         Evas_Coord w, h;
525         ecore_evas_geometry_get(_ews_ee, NULL, NULL, &w, &h);
526         evas_object_move(ee->engine.ews.image, 0, 0);
527         evas_object_resize(ee->engine.ews.image, w, h);
528         evas_object_focus_set(ee->engine.ews.image, EINA_TRUE);
529      }
530
531    if (ee->should_be_visible)
532      evas_object_show(ee->engine.ews.image);
533    else
534      evas_object_hide(ee->engine.ews.image);
535
536    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE);
537 }
538
539 static void
540 _ecore_evas_ews_avoid_damage_set(Ecore_Evas *ee, int val)
541 {
542    if (ee->prop.avoid_damage == val) return;
543    ee->prop.avoid_damage = val;
544    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
545 }
546
547 static void
548 _ecore_evas_ews_withdrawn_set(Ecore_Evas *ee, int val)
549 {
550    if (ee->prop.withdrawn == val) return;
551    ee->prop.withdrawn = val;
552    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
553 }
554
555 static void
556 _ecore_evas_ews_sticky_set(Ecore_Evas *ee, int val)
557 {
558    if (ee->prop.sticky == val) return;
559    ee->prop.sticky = val;
560    if ((val) && (ee->func.fn_sticky)) ee->func.fn_sticky(ee);
561    else if ((!val) && (ee->func.fn_unsticky)) ee->func.fn_unsticky(ee);
562    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
563 }
564
565 static void
566 _ecore_evas_ews_ignore_events_set(Ecore_Evas *ee, int val)
567 {
568    if (ee->ignore_events == val) return;
569    ee->ignore_events = val;
570    evas_object_pass_events_set(ee->engine.ews.image, val);
571    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
572 }
573
574 static void
575 _ecore_evas_ews_alpha_set(Ecore_Evas *ee, int val)
576 {
577    if (ee->alpha == val) return;
578    ee->alpha = val;
579    evas_object_image_alpha_set(ee->engine.ews.image, val);
580    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
581 }
582
583 static void
584 _ecore_evas_ews_transparent_set(Ecore_Evas *ee, int val)
585 {
586    if (ee->transparent == val) return;
587    ee->transparent = val;
588    evas_object_image_alpha_set(ee->engine.ews.image, val);
589    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE);
590 }
591
592 static int
593 _ecore_evas_ews_render(Ecore_Evas *ee)
594 {
595    Eina_List *updates = NULL, *l, *ll;
596    Ecore_Evas *ee2;
597    Eina_Rectangle *r;
598    int w, h, rend = 0;
599    void *pixels;
600    
601    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
602      {
603         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
604         rend |= _ecore_evas_ews_render(ee2);
605         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
606      }
607
608    evas_object_image_size_get(ee->engine.ews.image, &w, &h);
609    if ((w != ee->w) || (h != ee->h))
610      ecore_evas_resize(ee, w, h);
611
612    pixels = evas_object_image_data_get(ee->engine.ews.image, 1);
613    if (pixels)
614      {
615         updates = evas_render_updates(ee->evas);
616      }
617    evas_object_image_data_set(ee->engine.ews.image, pixels);
618    
619    EINA_LIST_FOREACH(updates, l, r)
620      evas_object_image_data_update_add(ee->engine.ews.image,
621                                        r->x, r->y, r->w, r->h);
622
623    if (updates)
624      {
625         evas_render_updates_free(updates);
626         _ecore_evas_idle_timeout_update(ee);
627      }
628
629    return updates ? 1 : rend;
630 }
631
632 static void
633 _ecore_evas_ews_screen_geometry_get(const Ecore_Evas *ee __UNUSED__, int *x, int *y, int *w, int *h)
634 {
635    ecore_evas_geometry_get(_ews_ee, x, y, w, h);
636 }
637
638 static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
639 {
640      _ecore_evas_ews_free,
641      NULL,
642      NULL,
643      NULL,
644      NULL,
645      NULL,
646      NULL,
647      NULL,
648      NULL,
649      NULL,
650      NULL,
651      NULL,
652      NULL,
653      NULL,
654      NULL,
655      _ecore_evas_ews_move,
656      _ecore_evas_ews_managed_move,
657      _ecore_evas_ews_resize,
658      _ecore_evas_ews_move_resize,
659      _ecore_evas_ews_rotation_set,
660      _ecore_evas_ews_shaped_set,
661      _ecore_evas_ews_show,
662      _ecore_evas_ews_hide,
663      _ecore_evas_ews_raise,
664      _ecore_evas_ews_lower,
665      _ecore_evas_ews_activate,
666      _ecore_evas_ews_title_set,
667      _ecore_evas_ews_name_class_set,
668      _ecore_evas_ews_size_min_set,
669      _ecore_evas_ews_size_max_set,
670      _ecore_evas_ews_size_base_set,
671      _ecore_evas_ews_size_step_set,
672      _ecore_evas_ews_object_cursor_set,
673      _ecore_evas_ews_layer_set,
674      _ecore_evas_ews_focus_set,
675      _ecore_evas_ews_iconified_set,
676      _ecore_evas_ews_borderless_set,
677      _ecore_evas_ews_override_set,
678      _ecore_evas_ews_maximized_set,
679      _ecore_evas_ews_fullscreen_set,
680      _ecore_evas_ews_avoid_damage_set,
681      _ecore_evas_ews_withdrawn_set,
682      _ecore_evas_ews_sticky_set,
683      _ecore_evas_ews_ignore_events_set,
684      _ecore_evas_ews_alpha_set,
685      _ecore_evas_ews_transparent_set,
686    
687      NULL,
688      NULL,
689      NULL,
690      NULL,
691      NULL,
692      NULL,
693
694      _ecore_evas_ews_render,
695      _ecore_evas_ews_screen_geometry_get
696 };
697
698 void
699 _ecore_evas_ews_events_init(void)
700 {
701    if (ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE != 0) return;
702    ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = ecore_event_type_new();
703    ECORE_EVAS_EWS_EVENT_ADD = ecore_event_type_new();
704    ECORE_EVAS_EWS_EVENT_DEL = ecore_event_type_new();
705    ECORE_EVAS_EWS_EVENT_RESIZE = ecore_event_type_new();
706    ECORE_EVAS_EWS_EVENT_MOVE = ecore_event_type_new();
707    ECORE_EVAS_EWS_EVENT_SHOW = ecore_event_type_new();
708    ECORE_EVAS_EWS_EVENT_HIDE = ecore_event_type_new();
709    ECORE_EVAS_EWS_EVENT_FOCUS = ecore_event_type_new();
710    ECORE_EVAS_EWS_EVENT_UNFOCUS = ecore_event_type_new();
711    ECORE_EVAS_EWS_EVENT_RAISE = ecore_event_type_new();
712    ECORE_EVAS_EWS_EVENT_LOWER = ecore_event_type_new();
713    ECORE_EVAS_EWS_EVENT_ACTIVATE = ecore_event_type_new();
714    ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = ecore_event_type_new();
715    ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = ecore_event_type_new();
716    ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = ecore_event_type_new();
717    ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = ecore_event_type_new();
718    ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = ecore_event_type_new();
719 }
720
721 static int
722 _ecore_evas_ews_init(void)
723 {
724    _ecore_evas_init_count++;
725    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
726
727    _ecore_evas_ews_env_setup();
728
729    return _ecore_evas_init_count;
730 }
731
732 int
733 _ecore_evas_ews_shutdown(void)
734 {
735    _ecore_evas_init_count--;
736    if (_ecore_evas_init_count == 0)
737      {
738         if (_ews_ee)
739           {
740              ecore_evas_free(_ews_ee);
741              _ews_ee = NULL;
742           }
743         if (_ews_children)
744           {
745              eina_list_free(_ews_children);
746              _ews_children = NULL;
747           }
748
749         free(_ews_engine);
750         _ews_engine = NULL;
751         free(_ews_options);
752         _ews_options = NULL;
753         _ews_defaults_engine = EINA_TRUE;
754         _ews_defaults_geo = EINA_TRUE;
755
756      }
757    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
758    return _ecore_evas_init_count;
759 }
760
761 static void
762 _ecore_evas_ews_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
763 {
764    Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
765
766    evas_object_geometry_get(ee->engine.ews.image, &xx, &yy, &ww, &hh);
767    evas_object_image_fill_get(ee->engine.ews.image, &fx, &fy, &fw, &fh);
768
769    if (fw < 1) fw = 1;
770    if (fh < 1) fh = 1;
771
772    if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
773      {
774         *x = (ee->w * (*x - xx)) / fw;
775         *y = (ee->h * (*y - yy)) / fh;
776      }
777    else
778      {
779         xx = (*x - xx) - fx;
780         while (xx < 0) xx += fw;
781         while (xx > fw) xx -= fw;
782         *x = (ee->w * xx) / fw;
783
784         yy = (*y - yy) - fy;
785         while (yy < 0) yy += fh;
786         while (yy > fh) yy -= fh;
787         *y = (ee->h * yy) / fh;
788      }
789 }
790
791 static void
792 _ecore_evas_ews_modifiers_apply(Ecore_Evas *ee, const Evas_Modifier *modifier)
793 {
794    Evas *e = ee->evas;
795
796    if (evas_key_modifier_is_set(modifier, "Shift"))
797      evas_key_modifier_on(e, "Shift");
798    else evas_key_modifier_off(e, "Shift");
799
800    if (evas_key_modifier_is_set(modifier, "Control"))
801      evas_key_modifier_on(e, "Control");
802    else evas_key_modifier_off(e, "Control");
803
804    if (evas_key_modifier_is_set(modifier, "Alt"))
805      evas_key_modifier_on(e, "Alt");
806    else evas_key_modifier_off(e, "Alt");
807
808    if (evas_key_modifier_is_set(modifier, "Super"))
809      evas_key_modifier_on(e, "Super");
810    else evas_key_modifier_off(e, "Super");
811
812    if (evas_key_modifier_is_set(modifier, "Hyper"))
813      evas_key_modifier_on(e, "Hyper");
814    else evas_key_modifier_off(e, "Hyper");
815
816    if (evas_key_modifier_is_set(modifier, "Scroll_Lock"))
817      evas_key_lock_on(e, "Scroll_Lock");
818    else evas_key_lock_off(e, "Scroll_Lock");
819
820    if (evas_key_modifier_is_set(modifier, "Num_Lock"))
821      evas_key_lock_on(e, "Num_Lock");
822    else evas_key_lock_off(e, "Num_Lock");
823
824    if (evas_key_modifier_is_set(modifier, "Caps_Lock"))
825      evas_key_lock_on(e, "Caps_Lock");
826    else evas_key_lock_off(e, "Caps_Lock");
827
828    if (evas_key_modifier_is_set(modifier, "Shift_Lock"))
829      evas_key_lock_on(e, "Shift_Lock");
830    else evas_key_lock_off(e, "Shift_Lock");
831 }
832
833 static void
834 _ecore_evas_ews_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
835 {
836    Ecore_Evas *ee = data;
837    Evas_Event_Mouse_In *ev = event_info;
838    Evas_Coord x = ev->canvas.x;
839    Evas_Coord y = ev->canvas.y;
840    _ecore_evas_ews_coord_translate(ee, &x, &y);
841    if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
842    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
843    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
844    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
845 }
846
847 static void
848 _ecore_evas_ews_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
849 {
850    Ecore_Evas *ee = data;
851    Evas_Event_Mouse_Out *ev = event_info;
852    Evas_Coord x = ev->canvas.x;
853    Evas_Coord y = ev->canvas.y;
854    // TODO: consider grab mode in EWS
855    _ecore_evas_ews_coord_translate(ee, &x, &y);
856    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
857    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
858    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
859    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
860    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
861 }
862
863 static void
864 _ecore_evas_ews_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
865 {
866    Ecore_Evas *ee = data;
867    Evas_Event_Mouse_Down *ev = event_info;
868    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
869    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
870 }
871
872 static void
873 _ecore_evas_ews_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
874 {
875    Ecore_Evas *ee = data;
876    Evas_Event_Mouse_Up *ev = event_info;
877    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
878    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
879 }
880
881 static void
882 _ecore_evas_ews_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
883 {
884    Ecore_Evas *ee = data;
885    Evas_Event_Mouse_Move *ev = event_info;
886    Evas_Coord x = ev->cur.canvas.x;
887    Evas_Coord y = ev->cur.canvas.y;
888    _ecore_evas_ews_coord_translate(ee, &x, &y);
889    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
890    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
891 }
892
893 static void
894 _ecore_evas_ews_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
895 {
896    Ecore_Evas *ee = data;
897    Evas_Event_Mouse_Wheel *ev = event_info;
898    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
899    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
900 }
901
902 static void
903 _ecore_evas_ews_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
904 {
905    Ecore_Evas *ee = data;
906    Evas_Event_Multi_Down *ev = event_info;
907    Evas_Coord x, y, xx, yy;
908    double xf, yf;
909
910    x = ev->canvas.x;
911    y = ev->canvas.y;
912    xx = x;
913    yy = y;
914    _ecore_evas_ews_coord_translate(ee, &x, &y);
915    xf = (ev->canvas.xsub - (double)xx) + (double)x;
916    yf = (ev->canvas.ysub - (double)yy) + (double)y;
917    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
918    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);
919 }
920
921 static void
922 _ecore_evas_ews_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
923 {
924    Ecore_Evas *ee = data;
925    Evas_Event_Multi_Up *ev = event_info;
926    Evas_Coord x, y, xx, yy;
927    double xf, yf;
928
929    x = ev->canvas.x;
930    y = ev->canvas.y;
931    xx = x;
932    yy = y;
933    _ecore_evas_ews_coord_translate(ee, &x, &y);
934    xf = (ev->canvas.xsub - (double)xx) + (double)x;
935    yf = (ev->canvas.ysub - (double)yy) + (double)y;
936    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
937    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);
938 }
939
940 static void
941 _ecore_evas_ews_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
942 {
943    Ecore_Evas *ee = data;
944    Evas_Event_Multi_Move *ev = event_info;
945    Evas_Coord x, y, xx, yy;
946    double xf, yf;
947
948    x = ev->cur.canvas.x;
949    y = ev->cur.canvas.y;
950    xx = x;
951    yy = y;
952    _ecore_evas_ews_coord_translate(ee, &x, &y);
953    xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
954    yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
955    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
956    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);
957 }
958
959 static void
960 _ecore_evas_ews_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
961 {
962    Ecore_Evas *ee = data;
963    if (ee->driver) _ecore_evas_free(ee);
964 }
965
966 static void
967 _ecore_evas_ews_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
968 {
969    Ecore_Evas *ee = data;
970    Evas_Event_Key_Down *ev = event_info;
971
972    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
973      evas_key_modifier_on(ee->evas, "Shift");
974    else
975      evas_key_modifier_off(ee->evas, "Shift");
976    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
977      evas_key_modifier_on(ee->evas, "Control");
978    else
979      evas_key_modifier_off(ee->evas, "Control");
980    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
981      evas_key_modifier_on(ee->evas, "Alt");
982    else
983      evas_key_modifier_off(ee->evas, "Alt");
984    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
985      evas_key_modifier_on(ee->evas, "Meta");
986    else
987      evas_key_modifier_off(ee->evas, "Meta");
988    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
989      evas_key_modifier_on(ee->evas, "Hyper");
990    else
991      evas_key_modifier_off(ee->evas, "Hyper");
992    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
993      evas_key_modifier_on(ee->evas, "Super");
994    else
995      evas_key_modifier_off(ee->evas, "Super");
996    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
997      evas_key_lock_on(ee->evas, "Scroll_Lock");
998    else
999      evas_key_lock_off(ee->evas, "Scroll_Lock");
1000    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
1001      evas_key_lock_on(ee->evas, "Num_Lock");
1002    else
1003      evas_key_lock_off(ee->evas, "Num_Lock");
1004    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
1005      evas_key_lock_on(ee->evas, "Caps_Lock");
1006    else
1007      evas_key_lock_off(ee->evas, "Caps_Lock");
1008    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
1009 }
1010
1011 static void
1012 _ecore_evas_ews_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
1013 {
1014    Ecore_Evas *ee = data;
1015    Evas_Event_Key_Up *ev = event_info;
1016
1017    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
1018      evas_key_modifier_on(ee->evas, "Shift");
1019    else
1020      evas_key_modifier_off(ee->evas, "Shift");
1021    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
1022      evas_key_modifier_on(ee->evas, "Control");
1023    else
1024      evas_key_modifier_off(ee->evas, "Control");
1025    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
1026      evas_key_modifier_on(ee->evas, "Alt");
1027    else
1028      evas_key_modifier_off(ee->evas, "Alt");
1029    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
1030      evas_key_modifier_on(ee->evas, "Meta");
1031    else
1032      evas_key_modifier_off(ee->evas, "Meta");
1033    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
1034      evas_key_modifier_on(ee->evas, "Hyper");
1035    else
1036      evas_key_modifier_off(ee->evas, "Hyper");
1037    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
1038      evas_key_modifier_on(ee->evas, "Super");
1039    else
1040      evas_key_modifier_off(ee->evas, "Super");
1041    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
1042      evas_key_lock_on(ee->evas, "Scroll_Lock");
1043    else
1044      evas_key_lock_off(ee->evas, "Scroll_Lock");
1045    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
1046      evas_key_lock_on(ee->evas, "Num_Lock");
1047    else
1048      evas_key_lock_off(ee->evas, "Num_Lock");
1049    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
1050      evas_key_lock_on(ee->evas, "Caps_Lock");
1051    else
1052      evas_key_lock_off(ee->evas, "Caps_Lock");
1053    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
1054 }
1055
1056 static void
1057 _ecore_evas_ews_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1058 {
1059    Ecore_Evas *ee = data;
1060    ecore_evas_focus_set(ee, EINA_TRUE);
1061 }
1062
1063 static void
1064 _ecore_evas_ews_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1065 {
1066    Ecore_Evas *ee = data;
1067    if (ee->deleted) return;
1068    ecore_evas_focus_set(ee, EINA_FALSE);
1069 }
1070
1071 static void
1072 _ecore_evas_ews_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1073 {
1074    Ecore_Evas *ee = data;
1075    ecore_evas_show(ee);
1076 }
1077
1078 static void
1079 _ecore_evas_ews_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1080 {
1081    Ecore_Evas *ee = data;
1082    if (ee->deleted) return;
1083    ecore_evas_hide(ee);
1084 }
1085 #endif
1086
1087 EAPI Ecore_Evas *
1088 ecore_evas_ews_new(int x, int y, int w, int h)
1089 {
1090 // basically a copy of ecore_evas_buffer_new() keep in sync...
1091 #ifdef BUILD_ECORE_EVAS_EWS
1092    Evas_Object *o;
1093    Evas_Engine_Info_Buffer *einfo;
1094    Ecore_Evas *ee;
1095    int rmethod;
1096
1097    if (_ecore_evas_ews_init() < 1) return NULL;
1098
1099    if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1100    if (!_ews_ee)
1101      {
1102         ERR("Could not create EWS backing store");
1103         _ecore_evas_ews_shutdown();
1104         return NULL;
1105      }
1106
1107    rmethod = evas_render_method_lookup("buffer");
1108    if (!rmethod) return NULL;
1109    ee = calloc(1, sizeof(Ecore_Evas));
1110    if (!ee) return NULL;
1111
1112    if (w < 1) w = 1;
1113    if (h < 1) h = 1;
1114
1115    o = evas_object_image_add(_ews_ee->evas);
1116    evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
1117    evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1118    evas_object_image_size_set(o, w, h);
1119    evas_object_image_alpha_set(o, 1);
1120
1121    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1122
1123    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_ews_engine_func;
1124
1125    ee->driver = EWS_ENGINE_NAME;
1126
1127    ee->x = 0;
1128    ee->y = 0;
1129    ee->w = w;
1130    ee->h = h;
1131    ee->req.x = ee->x;
1132    ee->req.y = ee->y;
1133    ee->req.w = ee->w;
1134    ee->req.h = ee->h;
1135
1136    /* init evas here */
1137    ee->evas = evas_new();
1138    evas_data_attach_set(ee->evas, ee);
1139    evas_output_method_set(ee->evas, rmethod);
1140    evas_output_size_set(ee->evas, w, h);
1141    evas_output_viewport_set(ee->evas, 0, 0, w, h);
1142
1143    evas_object_move(o, x, y);
1144    evas_object_resize(o, w, h);
1145    evas_object_image_fill_set(o, 0, 0, w, h);
1146
1147    ee->engine.ews.image = o;
1148    evas_object_data_set(ee->engine.ews.image, "Ecore_Evas", ee);
1149    evas_object_event_callback_add(ee->engine.ews.image,
1150                                   EVAS_CALLBACK_MOUSE_IN,
1151                                   _ecore_evas_ews_cb_mouse_in, ee);
1152    evas_object_event_callback_add(ee->engine.ews.image,
1153                                   EVAS_CALLBACK_MOUSE_OUT,
1154                                   _ecore_evas_ews_cb_mouse_out, ee);
1155    evas_object_event_callback_add(ee->engine.ews.image,
1156                                   EVAS_CALLBACK_MOUSE_DOWN,
1157                                   _ecore_evas_ews_cb_mouse_down, ee);
1158    evas_object_event_callback_add(ee->engine.ews.image,
1159                                   EVAS_CALLBACK_MOUSE_UP,
1160                                   _ecore_evas_ews_cb_mouse_up, ee);
1161    evas_object_event_callback_add(ee->engine.ews.image,
1162                                   EVAS_CALLBACK_MOUSE_MOVE,
1163                                   _ecore_evas_ews_cb_mouse_move, ee);
1164    evas_object_event_callback_add(ee->engine.ews.image,
1165                                   EVAS_CALLBACK_MOUSE_WHEEL,
1166                                   _ecore_evas_ews_cb_mouse_wheel, ee);
1167    evas_object_event_callback_add(ee->engine.ews.image,
1168                                   EVAS_CALLBACK_MULTI_DOWN,
1169                                   _ecore_evas_ews_cb_multi_down, ee);
1170    evas_object_event_callback_add(ee->engine.ews.image,
1171                                   EVAS_CALLBACK_MULTI_UP,
1172                                   _ecore_evas_ews_cb_multi_up, ee);
1173    evas_object_event_callback_add(ee->engine.ews.image,
1174                                   EVAS_CALLBACK_MULTI_MOVE,
1175                                   _ecore_evas_ews_cb_multi_move, ee);
1176    evas_object_event_callback_add(ee->engine.ews.image,
1177                                   EVAS_CALLBACK_FREE,
1178                                   _ecore_evas_ews_cb_free, ee);
1179    evas_object_event_callback_add(ee->engine.ews.image,
1180                                   EVAS_CALLBACK_KEY_DOWN,
1181                                   _ecore_evas_ews_cb_key_down, ee);
1182    evas_object_event_callback_add(ee->engine.ews.image,
1183                                   EVAS_CALLBACK_KEY_UP,
1184                                   _ecore_evas_ews_cb_key_up, ee);
1185    evas_object_event_callback_add(ee->engine.ews.image,
1186                                   EVAS_CALLBACK_FOCUS_IN,
1187                                   _ecore_evas_ews_cb_focus_in, ee);
1188    evas_object_event_callback_add(ee->engine.ews.image,
1189                                   EVAS_CALLBACK_FOCUS_OUT,
1190                                   _ecore_evas_ews_cb_focus_out, ee);
1191    evas_object_event_callback_add(ee->engine.ews.image,
1192                                   EVAS_CALLBACK_SHOW,
1193                                   _ecore_evas_ews_cb_show, ee);
1194    evas_object_event_callback_add(ee->engine.ews.image,
1195                                   EVAS_CALLBACK_HIDE,
1196                                   _ecore_evas_ews_cb_hide, ee);
1197    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1198    if (einfo)
1199      {
1200         void *pixels = evas_object_image_data_get(o, 1);
1201         evas_object_image_data_set(o, pixels); // refcount
1202         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1203         einfo->info.dest_buffer = pixels;
1204         einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
1205         einfo->info.use_color_key = 0;
1206         einfo->info.alpha_threshold = 0;
1207         einfo->info.func.new_update_region = NULL;
1208         einfo->info.func.free_update_region = NULL;
1209         evas_object_image_data_set(o, pixels);
1210         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1211           {
1212              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1213              ecore_evas_free(ee);
1214              return NULL;
1215           }
1216      }
1217    else
1218      {
1219         ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1220         ecore_evas_free(ee);
1221         return NULL;
1222      }
1223    evas_key_modifier_add(ee->evas, "Shift");
1224    evas_key_modifier_add(ee->evas, "Control");
1225    evas_key_modifier_add(ee->evas, "Alt");
1226    evas_key_modifier_add(ee->evas, "Meta");
1227    evas_key_modifier_add(ee->evas, "Hyper");
1228    evas_key_modifier_add(ee->evas, "Super");
1229    evas_key_lock_add(ee->evas, "Caps_Lock");
1230    evas_key_lock_add(ee->evas, "Num_Lock");
1231    evas_key_lock_add(ee->evas, "Scroll_Lock");
1232
1233    _ews_ee->sub_ecore_evas = eina_list_append(_ews_ee->sub_ecore_evas, ee);
1234    _ews_children = eina_list_append(_ews_children, ee);
1235
1236    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ADD);
1237
1238    return ee;
1239 #else
1240    return NULL;
1241    (void)x;
1242    (void)y;
1243    (void)w;
1244    (void)h;
1245 #endif
1246 }
1247
1248 EAPI Evas_Object *
1249 ecore_evas_ews_backing_store_get(const Ecore_Evas *ee)
1250 {
1251 #ifdef BUILD_ECORE_EVAS_EWS
1252    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1253      {
1254         ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1255                          "ecore_evas_ews_backing_store_get");
1256         return NULL;
1257      }
1258    return ee->engine.ews.image;
1259 #else
1260    return NULL;
1261    (void)ee;
1262 #endif
1263 }
1264
1265 EAPI void
1266 ecore_evas_ews_delete_request(Ecore_Evas *ee)
1267 {
1268 #ifdef BUILD_ECORE_EVAS_EWS
1269    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1270      {
1271         ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1272                          "ecore_evas_ews_delete_request");
1273         return;
1274      }
1275    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1276    else ecore_evas_free(ee);
1277 #else
1278    (void)ee;
1279 #endif
1280 }
1281
1282
1283 EAPI Eina_Bool
1284 ecore_evas_ews_engine_set(const char *engine, const char *options)
1285 {
1286 #ifdef BUILD_ECORE_EVAS_EWS
1287    if (_ews_ee) return EINA_FALSE;
1288
1289    free(_ews_engine);
1290    free(_ews_options);
1291
1292    _ews_engine = engine ? strdup(engine) : NULL;
1293    _ews_options = options ? strdup(options) : NULL;
1294
1295    if ((engine) && (!_ews_engine)) return EINA_FALSE;
1296    if ((options) && (!_ews_options)) return EINA_FALSE;
1297
1298    _ews_defaults_engine = EINA_FALSE;
1299    return EINA_TRUE;
1300 #else
1301    return EINA_FALSE;
1302    (void)engine;
1303    (void)options;
1304 #endif
1305 }
1306
1307 EAPI Eina_Bool
1308 ecore_evas_ews_setup(int x, int y, int w, int h)
1309 {
1310 #ifdef BUILD_ECORE_EVAS_EWS
1311    Eina_Bool ret = EINA_TRUE;
1312
1313    _ews_defaults_geo = EINA_FALSE;
1314    _ews_x = x;
1315    _ews_y = y;
1316    _ews_w = w;
1317    _ews_h = h;
1318
1319    if (!_ews_ee) return EINA_TRUE;
1320
1321    /* move-resize is not as implemented as move + resize */
1322    ecore_evas_move(_ews_ee, x, y);
1323    ecore_evas_size_min_set(_ews_ee, w, h);
1324    ecore_evas_size_max_set(_ews_ee, w, h);
1325    ecore_evas_resize(_ews_ee, w, h);
1326
1327    ecore_evas_geometry_get(_ews_ee, &x, &y, &w, &h);
1328
1329 #define TST(n) if ((n != _ews_##n))                     \
1330      {                                                  \
1331         WRN("Asked %d, got %d for "#n, _ews_##n, n);    \
1332         ret = EINA_FALSE;                               \
1333      }
1334    TST(x);
1335    TST(y);
1336    TST(w);
1337    TST(h);
1338 #undef TST
1339    return ret;
1340 #else
1341    return EINA_FALSE;
1342    (void)x;
1343    (void)y;
1344    (void)w;
1345    (void)h;
1346 #endif
1347 }
1348
1349 EAPI Ecore_Evas *
1350 ecore_evas_ews_ecore_evas_get(void)
1351 {
1352 #ifdef BUILD_ECORE_EVAS_EWS
1353    if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1354    return _ews_ee;
1355 #else
1356    return NULL;
1357 #endif
1358 }
1359
1360 EAPI Evas *
1361 ecore_evas_ews_evas_get(void)
1362 {
1363 #ifdef BUILD_ECORE_EVAS_EWS
1364    return ecore_evas_get(ecore_evas_ews_ecore_evas_get());
1365 #else
1366    return NULL;
1367 #endif
1368 }
1369
1370 EAPI Evas_Object *
1371 ecore_evas_ews_background_get(void)
1372 {
1373 #ifdef BUILD_ECORE_EVAS_EWS
1374    return _ews_bg;
1375 #else
1376    return NULL;
1377 #endif
1378 }
1379
1380 #ifdef BUILD_ECORE_EVAS_EWS
1381 static void
1382 _ecore_evas_ews_background_free(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
1383 {
1384    _ews_bg = NULL;
1385    ecore_evas_ews_background_set(NULL);
1386 }
1387 #endif
1388
1389 EAPI void
1390 ecore_evas_ews_background_set(Evas_Object *o)
1391 {
1392 #ifdef BUILD_ECORE_EVAS_EWS
1393    if ((o) && (o == _ews_bg)) return;
1394
1395    if (_ews_bg)
1396      {
1397         evas_object_del(_ews_bg);
1398         _ews_bg = NULL;
1399      }
1400
1401    if ((!o) && (_ews_ee))
1402      {
1403         o = evas_object_rectangle_add(ecore_evas_get(_ews_ee));
1404         evas_object_color_set(o, 0, 0, 0, 255);
1405      }
1406
1407    if (_ews_ee)
1408      {
1409         Evas_Coord w, h;
1410         Evas *e = ecore_evas_get(_ews_ee);
1411
1412         if (e != evas_object_evas_get(o))
1413           {
1414              ERR("background not in ecore_evas_ews_evas_get() canvas!");
1415              return;
1416           }
1417
1418         evas_output_viewport_get(e, NULL, NULL, &w, &h);
1419         evas_object_move(o, 0, 0);
1420         evas_object_resize(o, w, h);
1421         evas_object_layer_set(o, EVAS_LAYER_MIN);
1422         evas_object_lower(o);
1423         evas_object_show(o);
1424
1425         evas_object_event_callback_add
1426           (o, EVAS_CALLBACK_FREE, _ecore_evas_ews_background_free, NULL);
1427      }
1428
1429    _ews_bg = o;
1430 #else
1431    return;
1432    (void)o;
1433 #endif
1434 }
1435
1436
1437 EAPI const Eina_List *
1438 ecore_evas_ews_children_get(void)
1439 {
1440 #ifdef BUILD_ECORE_EVAS_EWS
1441    return _ews_children;
1442 #else
1443    return NULL;
1444 #endif
1445 }
1446
1447 EAPI void
1448 ecore_evas_ews_manager_set(const void *manager)
1449 {
1450 #ifdef BUILD_ECORE_EVAS_EWS
1451    if (_ews_manager ==  manager) return;
1452    _ews_manager = manager;
1453    ecore_event_add(ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE, NULL, NULL, NULL);
1454 #else
1455    (void)manager;
1456 #endif
1457 }
1458
1459 EAPI const void *
1460 ecore_evas_ews_manager_get(void)
1461 {
1462 #ifdef BUILD_ECORE_EVAS_EWS
1463    return _ews_manager;
1464 #else
1465    return NULL;
1466 #endif
1467 }