b612830283e219ea86934ba19cf600100ed08896
[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      NULL, // profiles_set
687    
688      NULL,
689      NULL,
690      NULL,
691      NULL,
692      NULL,
693      NULL,
694
695      _ecore_evas_ews_render,
696      _ecore_evas_ews_screen_geometry_get
697 };
698
699 void
700 _ecore_evas_ews_events_init(void)
701 {
702    if (ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE != 0) return;
703    ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE = ecore_event_type_new();
704    ECORE_EVAS_EWS_EVENT_ADD = ecore_event_type_new();
705    ECORE_EVAS_EWS_EVENT_DEL = ecore_event_type_new();
706    ECORE_EVAS_EWS_EVENT_RESIZE = ecore_event_type_new();
707    ECORE_EVAS_EWS_EVENT_MOVE = ecore_event_type_new();
708    ECORE_EVAS_EWS_EVENT_SHOW = ecore_event_type_new();
709    ECORE_EVAS_EWS_EVENT_HIDE = ecore_event_type_new();
710    ECORE_EVAS_EWS_EVENT_FOCUS = ecore_event_type_new();
711    ECORE_EVAS_EWS_EVENT_UNFOCUS = ecore_event_type_new();
712    ECORE_EVAS_EWS_EVENT_RAISE = ecore_event_type_new();
713    ECORE_EVAS_EWS_EVENT_LOWER = ecore_event_type_new();
714    ECORE_EVAS_EWS_EVENT_ACTIVATE = ecore_event_type_new();
715    ECORE_EVAS_EWS_EVENT_ICONIFIED_CHANGE = ecore_event_type_new();
716    ECORE_EVAS_EWS_EVENT_MAXIMIZED_CHANGE = ecore_event_type_new();
717    ECORE_EVAS_EWS_EVENT_LAYER_CHANGE = ecore_event_type_new();
718    ECORE_EVAS_EWS_EVENT_FULLSCREEN_CHANGE = ecore_event_type_new();
719    ECORE_EVAS_EWS_EVENT_CONFIG_CHANGE = ecore_event_type_new();
720 }
721
722 static int
723 _ecore_evas_ews_init(void)
724 {
725    _ecore_evas_init_count++;
726    if (_ecore_evas_init_count > 1) return _ecore_evas_init_count;
727
728    _ecore_evas_ews_env_setup();
729
730    return _ecore_evas_init_count;
731 }
732
733 int
734 _ecore_evas_ews_shutdown(void)
735 {
736    _ecore_evas_init_count--;
737    if (_ecore_evas_init_count == 0)
738      {
739         if (_ews_ee)
740           {
741              ecore_evas_free(_ews_ee);
742              _ews_ee = NULL;
743           }
744         if (_ews_children)
745           {
746              eina_list_free(_ews_children);
747              _ews_children = NULL;
748           }
749
750         free(_ews_engine);
751         _ews_engine = NULL;
752         free(_ews_options);
753         _ews_options = NULL;
754         _ews_defaults_engine = EINA_TRUE;
755         _ews_defaults_geo = EINA_TRUE;
756
757      }
758    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
759    return _ecore_evas_init_count;
760 }
761
762 static void
763 _ecore_evas_ews_coord_translate(Ecore_Evas *ee, Evas_Coord *x, Evas_Coord *y)
764 {
765    Evas_Coord xx, yy, ww, hh, fx, fy, fw, fh;
766
767    evas_object_geometry_get(ee->engine.ews.image, &xx, &yy, &ww, &hh);
768    evas_object_image_fill_get(ee->engine.ews.image, &fx, &fy, &fw, &fh);
769
770    if (fw < 1) fw = 1;
771    if (fh < 1) fh = 1;
772
773    if ((fx == 0) && (fy == 0) && (fw == ww) && (fh == hh))
774      {
775         *x = (ee->w * (*x - xx)) / fw;
776         *y = (ee->h * (*y - yy)) / fh;
777      }
778    else
779      {
780         xx = (*x - xx) - fx;
781         while (xx < 0) xx += fw;
782         while (xx > fw) xx -= fw;
783         *x = (ee->w * xx) / fw;
784
785         yy = (*y - yy) - fy;
786         while (yy < 0) yy += fh;
787         while (yy > fh) yy -= fh;
788         *y = (ee->h * yy) / fh;
789      }
790 }
791
792 static void
793 _ecore_evas_ews_modifiers_apply(Ecore_Evas *ee, const Evas_Modifier *modifier)
794 {
795    Evas *e = ee->evas;
796
797    if (evas_key_modifier_is_set(modifier, "Shift"))
798      evas_key_modifier_on(e, "Shift");
799    else evas_key_modifier_off(e, "Shift");
800
801    if (evas_key_modifier_is_set(modifier, "Control"))
802      evas_key_modifier_on(e, "Control");
803    else evas_key_modifier_off(e, "Control");
804
805    if (evas_key_modifier_is_set(modifier, "Alt"))
806      evas_key_modifier_on(e, "Alt");
807    else evas_key_modifier_off(e, "Alt");
808
809    if (evas_key_modifier_is_set(modifier, "Super"))
810      evas_key_modifier_on(e, "Super");
811    else evas_key_modifier_off(e, "Super");
812
813    if (evas_key_modifier_is_set(modifier, "Hyper"))
814      evas_key_modifier_on(e, "Hyper");
815    else evas_key_modifier_off(e, "Hyper");
816
817    if (evas_key_modifier_is_set(modifier, "Scroll_Lock"))
818      evas_key_lock_on(e, "Scroll_Lock");
819    else evas_key_lock_off(e, "Scroll_Lock");
820
821    if (evas_key_modifier_is_set(modifier, "Num_Lock"))
822      evas_key_lock_on(e, "Num_Lock");
823    else evas_key_lock_off(e, "Num_Lock");
824
825    if (evas_key_modifier_is_set(modifier, "Caps_Lock"))
826      evas_key_lock_on(e, "Caps_Lock");
827    else evas_key_lock_off(e, "Caps_Lock");
828
829    if (evas_key_modifier_is_set(modifier, "Shift_Lock"))
830      evas_key_lock_on(e, "Shift_Lock");
831    else evas_key_lock_off(e, "Shift_Lock");
832 }
833
834 static void
835 _ecore_evas_ews_cb_mouse_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
836 {
837    Ecore_Evas *ee = data;
838    Evas_Event_Mouse_In *ev = event_info;
839    Evas_Coord x = ev->canvas.x;
840    Evas_Coord y = ev->canvas.y;
841    _ecore_evas_ews_coord_translate(ee, &x, &y);
842    if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
843    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
844    evas_event_feed_mouse_in(ee->evas, ev->timestamp, NULL);
845    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
846 }
847
848 static void
849 _ecore_evas_ews_cb_mouse_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
850 {
851    Ecore_Evas *ee = data;
852    Evas_Event_Mouse_Out *ev = event_info;
853    Evas_Coord x = ev->canvas.x;
854    Evas_Coord y = ev->canvas.y;
855    // TODO: consider grab mode in EWS
856    _ecore_evas_ews_coord_translate(ee, &x, &y);
857    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
858    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
859    evas_event_feed_mouse_out(ee->evas, ev->timestamp, NULL);
860    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
861    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
862 }
863
864 static void
865 _ecore_evas_ews_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
866 {
867    Ecore_Evas *ee = data;
868    Evas_Event_Mouse_Down *ev = event_info;
869    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
870    evas_event_feed_mouse_down(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
871 }
872
873 static void
874 _ecore_evas_ews_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
875 {
876    Ecore_Evas *ee = data;
877    Evas_Event_Mouse_Up *ev = event_info;
878    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
879    evas_event_feed_mouse_up(ee->evas, ev->button, ev->flags, ev->timestamp, NULL);
880 }
881
882 static void
883 _ecore_evas_ews_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
884 {
885    Ecore_Evas *ee = data;
886    Evas_Event_Mouse_Move *ev = event_info;
887    Evas_Coord x = ev->cur.canvas.x;
888    Evas_Coord y = ev->cur.canvas.y;
889    _ecore_evas_ews_coord_translate(ee, &x, &y);
890    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
891    _ecore_evas_mouse_move_process(ee, x, y, ev->timestamp);
892 }
893
894 static void
895 _ecore_evas_ews_cb_mouse_wheel(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
896 {
897    Ecore_Evas *ee = data;
898    Evas_Event_Mouse_Wheel *ev = event_info;
899    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
900    evas_event_feed_mouse_wheel(ee->evas, ev->direction, ev->z, ev->timestamp, NULL);
901 }
902
903 static void
904 _ecore_evas_ews_cb_multi_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
905 {
906    Ecore_Evas *ee = data;
907    Evas_Event_Multi_Down *ev = event_info;
908    Evas_Coord x, y, xx, yy;
909    double xf, yf;
910
911    x = ev->canvas.x;
912    y = ev->canvas.y;
913    xx = x;
914    yy = y;
915    _ecore_evas_ews_coord_translate(ee, &x, &y);
916    xf = (ev->canvas.xsub - (double)xx) + (double)x;
917    yf = (ev->canvas.ysub - (double)yy) + (double)y;
918    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
919    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);
920 }
921
922 static void
923 _ecore_evas_ews_cb_multi_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
924 {
925    Ecore_Evas *ee = data;
926    Evas_Event_Multi_Up *ev = event_info;
927    Evas_Coord x, y, xx, yy;
928    double xf, yf;
929
930    x = ev->canvas.x;
931    y = ev->canvas.y;
932    xx = x;
933    yy = y;
934    _ecore_evas_ews_coord_translate(ee, &x, &y);
935    xf = (ev->canvas.xsub - (double)xx) + (double)x;
936    yf = (ev->canvas.ysub - (double)yy) + (double)y;
937    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
938    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);
939 }
940
941 static void
942 _ecore_evas_ews_cb_multi_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
943 {
944    Ecore_Evas *ee = data;
945    Evas_Event_Multi_Move *ev = event_info;
946    Evas_Coord x, y, xx, yy;
947    double xf, yf;
948
949    x = ev->cur.canvas.x;
950    y = ev->cur.canvas.y;
951    xx = x;
952    yy = y;
953    _ecore_evas_ews_coord_translate(ee, &x, &y);
954    xf = (ev->cur.canvas.xsub - (double)xx) + (double)x;
955    yf = (ev->cur.canvas.ysub - (double)yy) + (double)y;
956    _ecore_evas_ews_modifiers_apply(ee, ev->modifiers);
957    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);
958 }
959
960 static void
961 _ecore_evas_ews_cb_free(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
962 {
963    Ecore_Evas *ee = data;
964    if (ee->driver) _ecore_evas_free(ee);
965 }
966
967 static void
968 _ecore_evas_ews_cb_key_down(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
969 {
970    Ecore_Evas *ee = data;
971    Evas_Event_Key_Down *ev = event_info;
972
973    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
974      evas_key_modifier_on(ee->evas, "Shift");
975    else
976      evas_key_modifier_off(ee->evas, "Shift");
977    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
978      evas_key_modifier_on(ee->evas, "Control");
979    else
980      evas_key_modifier_off(ee->evas, "Control");
981    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
982      evas_key_modifier_on(ee->evas, "Alt");
983    else
984      evas_key_modifier_off(ee->evas, "Alt");
985    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
986      evas_key_modifier_on(ee->evas, "Meta");
987    else
988      evas_key_modifier_off(ee->evas, "Meta");
989    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
990      evas_key_modifier_on(ee->evas, "Hyper");
991    else
992      evas_key_modifier_off(ee->evas, "Hyper");
993    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
994      evas_key_modifier_on(ee->evas, "Super");
995    else
996      evas_key_modifier_off(ee->evas, "Super");
997    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
998      evas_key_lock_on(ee->evas, "Scroll_Lock");
999    else
1000      evas_key_lock_off(ee->evas, "Scroll_Lock");
1001    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
1002      evas_key_lock_on(ee->evas, "Num_Lock");
1003    else
1004      evas_key_lock_off(ee->evas, "Num_Lock");
1005    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
1006      evas_key_lock_on(ee->evas, "Caps_Lock");
1007    else
1008      evas_key_lock_off(ee->evas, "Caps_Lock");
1009    evas_event_feed_key_down(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
1010 }
1011
1012 static void
1013 _ecore_evas_ews_cb_key_up(void *data, Evas *e, Evas_Object *obj __UNUSED__, void *event_info)
1014 {
1015    Ecore_Evas *ee = data;
1016    Evas_Event_Key_Up *ev = event_info;
1017
1018    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Shift"))
1019      evas_key_modifier_on(ee->evas, "Shift");
1020    else
1021      evas_key_modifier_off(ee->evas, "Shift");
1022    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Control"))
1023      evas_key_modifier_on(ee->evas, "Control");
1024    else
1025      evas_key_modifier_off(ee->evas, "Control");
1026    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Alt"))
1027      evas_key_modifier_on(ee->evas, "Alt");
1028    else
1029      evas_key_modifier_off(ee->evas, "Alt");
1030    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Meta"))
1031      evas_key_modifier_on(ee->evas, "Meta");
1032    else
1033      evas_key_modifier_off(ee->evas, "Meta");
1034    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Hyper"))
1035      evas_key_modifier_on(ee->evas, "Hyper");
1036    else
1037      evas_key_modifier_off(ee->evas, "Hyper");
1038    if (evas_key_modifier_is_set(evas_key_modifier_get(e), "Super"))
1039      evas_key_modifier_on(ee->evas, "Super");
1040    else
1041      evas_key_modifier_off(ee->evas, "Super");
1042    if (evas_key_lock_is_set(evas_key_lock_get(e), "Scroll_Lock"))
1043      evas_key_lock_on(ee->evas, "Scroll_Lock");
1044    else
1045      evas_key_lock_off(ee->evas, "Scroll_Lock");
1046    if (evas_key_lock_is_set(evas_key_lock_get(e), "Num_Lock"))
1047      evas_key_lock_on(ee->evas, "Num_Lock");
1048    else
1049      evas_key_lock_off(ee->evas, "Num_Lock");
1050    if (evas_key_lock_is_set(evas_key_lock_get(e), "Caps_Lock"))
1051      evas_key_lock_on(ee->evas, "Caps_Lock");
1052    else
1053      evas_key_lock_off(ee->evas, "Caps_Lock");
1054    evas_event_feed_key_up(ee->evas, ev->keyname, ev->key, ev->string, ev->compose, ev->timestamp, NULL);
1055 }
1056
1057 static void
1058 _ecore_evas_ews_cb_focus_in(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1059 {
1060    Ecore_Evas *ee = data;
1061    ecore_evas_focus_set(ee, EINA_TRUE);
1062 }
1063
1064 static void
1065 _ecore_evas_ews_cb_focus_out(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1066 {
1067    Ecore_Evas *ee = data;
1068    if (ee->deleted) return;
1069    ecore_evas_focus_set(ee, EINA_FALSE);
1070 }
1071
1072 static void
1073 _ecore_evas_ews_cb_show(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1074 {
1075    Ecore_Evas *ee = data;
1076    ecore_evas_show(ee);
1077 }
1078
1079 static void
1080 _ecore_evas_ews_cb_hide(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
1081 {
1082    Ecore_Evas *ee = data;
1083    if (ee->deleted) return;
1084    ecore_evas_hide(ee);
1085 }
1086 #endif
1087
1088 EAPI Ecore_Evas *
1089 ecore_evas_ews_new(int x, int y, int w, int h)
1090 {
1091 // basically a copy of ecore_evas_buffer_new() keep in sync...
1092 #ifdef BUILD_ECORE_EVAS_EWS
1093    Evas_Object *o;
1094    Evas_Engine_Info_Buffer *einfo;
1095    Ecore_Evas *ee;
1096    int rmethod;
1097
1098    if (_ecore_evas_ews_init() < 1) return NULL;
1099
1100    if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1101    if (!_ews_ee)
1102      {
1103         ERR("Could not create EWS backing store");
1104         _ecore_evas_ews_shutdown();
1105         return NULL;
1106      }
1107
1108    rmethod = evas_render_method_lookup("buffer");
1109    if (!rmethod) return NULL;
1110    ee = calloc(1, sizeof(Ecore_Evas));
1111    if (!ee) return NULL;
1112
1113    if (w < 1) w = 1;
1114    if (h < 1) h = 1;
1115
1116    o = evas_object_image_add(_ews_ee->evas);
1117    evas_object_image_content_hint_set(o, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
1118    evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
1119    evas_object_image_size_set(o, w, h);
1120    evas_object_image_alpha_set(o, 1);
1121
1122    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1123
1124    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_ews_engine_func;
1125
1126    ee->driver = EWS_ENGINE_NAME;
1127
1128    ee->x = 0;
1129    ee->y = 0;
1130    ee->w = w;
1131    ee->h = h;
1132    ee->req.x = ee->x;
1133    ee->req.y = ee->y;
1134    ee->req.w = ee->w;
1135    ee->req.h = ee->h;
1136
1137    /* init evas here */
1138    ee->evas = evas_new();
1139    evas_data_attach_set(ee->evas, ee);
1140    evas_output_method_set(ee->evas, rmethod);
1141    evas_output_size_set(ee->evas, w, h);
1142    evas_output_viewport_set(ee->evas, 0, 0, w, h);
1143
1144    evas_object_move(o, x, y);
1145    evas_object_resize(o, w, h);
1146    evas_object_image_fill_set(o, 0, 0, w, h);
1147
1148    ee->engine.ews.image = o;
1149    evas_object_data_set(ee->engine.ews.image, "Ecore_Evas", ee);
1150    evas_object_event_callback_add(ee->engine.ews.image,
1151                                   EVAS_CALLBACK_MOUSE_IN,
1152                                   _ecore_evas_ews_cb_mouse_in, ee);
1153    evas_object_event_callback_add(ee->engine.ews.image,
1154                                   EVAS_CALLBACK_MOUSE_OUT,
1155                                   _ecore_evas_ews_cb_mouse_out, ee);
1156    evas_object_event_callback_add(ee->engine.ews.image,
1157                                   EVAS_CALLBACK_MOUSE_DOWN,
1158                                   _ecore_evas_ews_cb_mouse_down, ee);
1159    evas_object_event_callback_add(ee->engine.ews.image,
1160                                   EVAS_CALLBACK_MOUSE_UP,
1161                                   _ecore_evas_ews_cb_mouse_up, ee);
1162    evas_object_event_callback_add(ee->engine.ews.image,
1163                                   EVAS_CALLBACK_MOUSE_MOVE,
1164                                   _ecore_evas_ews_cb_mouse_move, ee);
1165    evas_object_event_callback_add(ee->engine.ews.image,
1166                                   EVAS_CALLBACK_MOUSE_WHEEL,
1167                                   _ecore_evas_ews_cb_mouse_wheel, ee);
1168    evas_object_event_callback_add(ee->engine.ews.image,
1169                                   EVAS_CALLBACK_MULTI_DOWN,
1170                                   _ecore_evas_ews_cb_multi_down, ee);
1171    evas_object_event_callback_add(ee->engine.ews.image,
1172                                   EVAS_CALLBACK_MULTI_UP,
1173                                   _ecore_evas_ews_cb_multi_up, ee);
1174    evas_object_event_callback_add(ee->engine.ews.image,
1175                                   EVAS_CALLBACK_MULTI_MOVE,
1176                                   _ecore_evas_ews_cb_multi_move, ee);
1177    evas_object_event_callback_add(ee->engine.ews.image,
1178                                   EVAS_CALLBACK_FREE,
1179                                   _ecore_evas_ews_cb_free, ee);
1180    evas_object_event_callback_add(ee->engine.ews.image,
1181                                   EVAS_CALLBACK_KEY_DOWN,
1182                                   _ecore_evas_ews_cb_key_down, ee);
1183    evas_object_event_callback_add(ee->engine.ews.image,
1184                                   EVAS_CALLBACK_KEY_UP,
1185                                   _ecore_evas_ews_cb_key_up, ee);
1186    evas_object_event_callback_add(ee->engine.ews.image,
1187                                   EVAS_CALLBACK_FOCUS_IN,
1188                                   _ecore_evas_ews_cb_focus_in, ee);
1189    evas_object_event_callback_add(ee->engine.ews.image,
1190                                   EVAS_CALLBACK_FOCUS_OUT,
1191                                   _ecore_evas_ews_cb_focus_out, ee);
1192    evas_object_event_callback_add(ee->engine.ews.image,
1193                                   EVAS_CALLBACK_SHOW,
1194                                   _ecore_evas_ews_cb_show, ee);
1195    evas_object_event_callback_add(ee->engine.ews.image,
1196                                   EVAS_CALLBACK_HIDE,
1197                                   _ecore_evas_ews_cb_hide, ee);
1198    einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas);
1199    if (einfo)
1200      {
1201         void *pixels = evas_object_image_data_get(o, 1);
1202         evas_object_image_data_set(o, pixels); // refcount
1203         einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
1204         einfo->info.dest_buffer = pixels;
1205         einfo->info.dest_buffer_row_bytes = evas_object_image_stride_get(o);
1206         einfo->info.use_color_key = 0;
1207         einfo->info.alpha_threshold = 0;
1208         einfo->info.func.new_update_region = NULL;
1209         einfo->info.func.free_update_region = NULL;
1210         evas_object_image_data_set(o, pixels);
1211         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1212           {
1213              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1214              ecore_evas_free(ee);
1215              return NULL;
1216           }
1217      }
1218    else
1219      {
1220         ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1221         ecore_evas_free(ee);
1222         return NULL;
1223      }
1224    evas_key_modifier_add(ee->evas, "Shift");
1225    evas_key_modifier_add(ee->evas, "Control");
1226    evas_key_modifier_add(ee->evas, "Alt");
1227    evas_key_modifier_add(ee->evas, "Meta");
1228    evas_key_modifier_add(ee->evas, "Hyper");
1229    evas_key_modifier_add(ee->evas, "Super");
1230    evas_key_lock_add(ee->evas, "Caps_Lock");
1231    evas_key_lock_add(ee->evas, "Num_Lock");
1232    evas_key_lock_add(ee->evas, "Scroll_Lock");
1233
1234    _ews_ee->sub_ecore_evas = eina_list_append(_ews_ee->sub_ecore_evas, ee);
1235    _ews_children = eina_list_append(_ews_children, ee);
1236
1237    _ecore_evas_ews_event(ee, ECORE_EVAS_EWS_EVENT_ADD);
1238
1239    return ee;
1240 #else
1241    return NULL;
1242    (void)x;
1243    (void)y;
1244    (void)w;
1245    (void)h;
1246 #endif
1247 }
1248
1249 EAPI Evas_Object *
1250 ecore_evas_ews_backing_store_get(const Ecore_Evas *ee)
1251 {
1252 #ifdef BUILD_ECORE_EVAS_EWS
1253    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1254      {
1255         ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1256                          "ecore_evas_ews_backing_store_get");
1257         return NULL;
1258      }
1259    return ee->engine.ews.image;
1260 #else
1261    return NULL;
1262    (void)ee;
1263 #endif
1264 }
1265
1266 EAPI void
1267 ecore_evas_ews_delete_request(Ecore_Evas *ee)
1268 {
1269 #ifdef BUILD_ECORE_EVAS_EWS
1270    if (!ECORE_MAGIC_CHECK(ee, ECORE_MAGIC_EVAS))
1271      {
1272         ECORE_MAGIC_FAIL(ee, ECORE_MAGIC_EVAS,
1273                          "ecore_evas_ews_delete_request");
1274         return;
1275      }
1276    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
1277    else ecore_evas_free(ee);
1278 #else
1279    (void)ee;
1280 #endif
1281 }
1282
1283
1284 EAPI Eina_Bool
1285 ecore_evas_ews_engine_set(const char *engine, const char *options)
1286 {
1287 #ifdef BUILD_ECORE_EVAS_EWS
1288    if (_ews_ee) return EINA_FALSE;
1289
1290    free(_ews_engine);
1291    free(_ews_options);
1292
1293    _ews_engine = engine ? strdup(engine) : NULL;
1294    _ews_options = options ? strdup(options) : NULL;
1295
1296    if ((engine) && (!_ews_engine)) return EINA_FALSE;
1297    if ((options) && (!_ews_options)) return EINA_FALSE;
1298
1299    _ews_defaults_engine = EINA_FALSE;
1300    return EINA_TRUE;
1301 #else
1302    return EINA_FALSE;
1303    (void)engine;
1304    (void)options;
1305 #endif
1306 }
1307
1308 EAPI Eina_Bool
1309 ecore_evas_ews_setup(int x, int y, int w, int h)
1310 {
1311 #ifdef BUILD_ECORE_EVAS_EWS
1312    Eina_Bool ret = EINA_TRUE;
1313
1314    _ews_defaults_geo = EINA_FALSE;
1315    _ews_x = x;
1316    _ews_y = y;
1317    _ews_w = w;
1318    _ews_h = h;
1319
1320    if (!_ews_ee) return EINA_TRUE;
1321
1322    /* move-resize is not as implemented as move + resize */
1323    ecore_evas_move(_ews_ee, x, y);
1324    ecore_evas_size_min_set(_ews_ee, w, h);
1325    ecore_evas_size_max_set(_ews_ee, w, h);
1326    ecore_evas_resize(_ews_ee, w, h);
1327
1328    ecore_evas_geometry_get(_ews_ee, &x, &y, &w, &h);
1329
1330 #define TST(n) if ((n != _ews_##n))                     \
1331      {                                                  \
1332         WRN("Asked %d, got %d for "#n, _ews_##n, n);    \
1333         ret = EINA_FALSE;                               \
1334      }
1335    TST(x);
1336    TST(y);
1337    TST(w);
1338    TST(h);
1339 #undef TST
1340    return ret;
1341 #else
1342    return EINA_FALSE;
1343    (void)x;
1344    (void)y;
1345    (void)w;
1346    (void)h;
1347 #endif
1348 }
1349
1350 EAPI Ecore_Evas *
1351 ecore_evas_ews_ecore_evas_get(void)
1352 {
1353 #ifdef BUILD_ECORE_EVAS_EWS
1354    if (!_ews_ee) _ews_ee = _ecore_evas_ews_ee_new();
1355    return _ews_ee;
1356 #else
1357    return NULL;
1358 #endif
1359 }
1360
1361 EAPI Evas *
1362 ecore_evas_ews_evas_get(void)
1363 {
1364 #ifdef BUILD_ECORE_EVAS_EWS
1365    return ecore_evas_get(ecore_evas_ews_ecore_evas_get());
1366 #else
1367    return NULL;
1368 #endif
1369 }
1370
1371 EAPI Evas_Object *
1372 ecore_evas_ews_background_get(void)
1373 {
1374 #ifdef BUILD_ECORE_EVAS_EWS
1375    return _ews_bg;
1376 #else
1377    return NULL;
1378 #endif
1379 }
1380
1381 #ifdef BUILD_ECORE_EVAS_EWS
1382 static void
1383 _ecore_evas_ews_background_free(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
1384 {
1385    _ews_bg = NULL;
1386    ecore_evas_ews_background_set(NULL);
1387 }
1388 #endif
1389
1390 EAPI void
1391 ecore_evas_ews_background_set(Evas_Object *o)
1392 {
1393 #ifdef BUILD_ECORE_EVAS_EWS
1394    if ((o) && (o == _ews_bg)) return;
1395
1396    if (_ews_bg)
1397      {
1398         evas_object_del(_ews_bg);
1399         _ews_bg = NULL;
1400      }
1401
1402    if ((!o) && (_ews_ee))
1403      {
1404         o = evas_object_rectangle_add(ecore_evas_get(_ews_ee));
1405         evas_object_color_set(o, 0, 0, 0, 255);
1406      }
1407
1408    if (_ews_ee)
1409      {
1410         Evas_Coord w, h;
1411         Evas *e = ecore_evas_get(_ews_ee);
1412
1413         if (e != evas_object_evas_get(o))
1414           {
1415              ERR("background not in ecore_evas_ews_evas_get() canvas!");
1416              return;
1417           }
1418
1419         evas_output_viewport_get(e, NULL, NULL, &w, &h);
1420         evas_object_move(o, 0, 0);
1421         evas_object_resize(o, w, h);
1422         evas_object_layer_set(o, EVAS_LAYER_MIN);
1423         evas_object_lower(o);
1424         evas_object_show(o);
1425
1426         evas_object_event_callback_add
1427           (o, EVAS_CALLBACK_FREE, _ecore_evas_ews_background_free, NULL);
1428      }
1429
1430    _ews_bg = o;
1431 #else
1432    return;
1433    (void)o;
1434 #endif
1435 }
1436
1437
1438 EAPI const Eina_List *
1439 ecore_evas_ews_children_get(void)
1440 {
1441 #ifdef BUILD_ECORE_EVAS_EWS
1442    return _ews_children;
1443 #else
1444    return NULL;
1445 #endif
1446 }
1447
1448 EAPI void
1449 ecore_evas_ews_manager_set(const void *manager)
1450 {
1451 #ifdef BUILD_ECORE_EVAS_EWS
1452    if (_ews_manager ==  manager) return;
1453    _ews_manager = manager;
1454    ecore_event_add(ECORE_EVAS_EWS_EVENT_MANAGER_CHANGE, NULL, NULL, NULL);
1455 #else
1456    (void)manager;
1457 #endif
1458 }
1459
1460 EAPI const void *
1461 ecore_evas_ews_manager_get(void)
1462 {
1463 #ifdef BUILD_ECORE_EVAS_EWS
1464    return _ews_manager;
1465 #else
1466    return NULL;
1467 #endif
1468 }