Upstream merge
[framework/uifw/ecore.git] / src / lib / ecore_evas / ecore_evas_win32.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4
5 #include <stdlib.h> /* for NULL */
6
7 #include <Ecore.h>
8 #include "ecore_private.h"
9 #ifdef BUILD_ECORE_EVAS_WIN32
10 # define WIN32_LEAN_AND_MEAN
11 # include <windows.h>
12 # undef WIN32_LEAN_AND_MEAN
13 # include <Ecore_Win32.h>
14 # include <ecore_win32_private.h>
15 #endif /* BUILD_ECORE_EVAS_WIN32 */
16
17 #include "ecore_evas_private.h"
18 #include "Ecore_Evas.h"
19
20 #ifdef BUILD_ECORE_EVAS_WIN32
21
22 #define ECORE_EVAS_EVENT_COUNT 10
23
24 static int _ecore_evas_init_count = 0;
25
26 static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
27
28 static Eina_Bool _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
29
30 static Eina_Bool _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
31
32 static Eina_Bool _ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event);
33
34 static Eina_Bool _ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event);
35
36 static Eina_Bool _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
37
38 static Eina_Bool _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
39
40 static Eina_Bool _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
41
42 static Eina_Bool _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
43
44 static Eina_Bool _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
45
46 static Eina_Bool _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
47
48 /* Private functions */
49
50 static int
51 _ecore_evas_win32_render(Ecore_Evas *ee)
52 {
53    int rend = 0;
54    Eina_List *updates = NULL;
55    Eina_List *ll;
56    Ecore_Evas *ee2;
57
58    EINA_LIST_FOREACH(ee->sub_ecore_evas, ll, ee2)
59      {
60         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
61         if (ee2->engine.func->fn_render)
62           rend |= ee2->engine.func->fn_render(ee2);
63         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
64      }
65
66    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
67    if (ee->prop.avoid_damage)
68      {
69         updates = evas_render_updates(ee->evas);
70         if (updates) evas_render_updates_free(updates);
71      }
72    else if ((ee->visible) ||
73             ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
74             ((ee->should_be_visible) && (ee->prop.override)))
75      {
76         if (ee->shaped)
77           {
78              updates = evas_render_updates(ee->evas);
79              if (updates) evas_render_updates_free(updates);
80           }
81         else
82           {
83              updates = evas_render_updates(ee->evas);
84              if (updates) evas_render_updates_free(updates);
85           }
86      }
87    else
88      evas_norender(ee->evas);
89    if (updates) rend = 1;
90    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
91    return rend;
92 }
93
94 static int
95 _ecore_evas_win32_init(void)
96 {
97    _ecore_evas_init_count++;
98    if (_ecore_evas_init_count > 1)
99      return _ecore_evas_init_count;
100
101    ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL);
102    ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL);
103    ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_IN, _ecore_evas_win32_event_window_focus_in, NULL);
104    ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_FOCUS_OUT, _ecore_evas_win32_event_window_focus_out, NULL);
105    ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL);
106    ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, _ecore_evas_win32_event_window_destroy, NULL);
107    ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_SHOW, _ecore_evas_win32_event_window_show, NULL);
108    ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_HIDE, _ecore_evas_win32_event_window_hide, NULL);
109    ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, _ecore_evas_win32_event_window_configure, NULL);
110    ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_win32_event_window_delete_request, NULL);
111
112    ecore_event_evas_init();
113    return _ecore_evas_init_count;
114 }
115
116 int
117 _ecore_evas_win32_shutdown(void)
118 {
119    _ecore_evas_init_count--;
120    if (_ecore_evas_init_count == 0)
121      {
122         int i;
123
124         for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
125           ecore_event_handler_del(ecore_evas_event_handlers[i]);
126         ecore_event_evas_shutdown();
127      }
128
129    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
130
131    return _ecore_evas_init_count;
132 }
133
134 static Eina_Bool
135 _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
136 {
137    Ecore_Evas                 *ee;
138    Ecore_Win32_Event_Mouse_In *e;
139
140    INF("mouse in");
141
142    e = event;
143    ee = ecore_event_window_match((Ecore_Window)e->window);
144    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
145    if ((Ecore_Window)e->window != ee->prop.window) return 1;
146
147    if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
148    /* FIXME to do */
149 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
150    evas_event_feed_mouse_in(ee->evas, e->timestamp, NULL);
151    evas_focus_in(ee->evas);
152    _ecore_evas_mouse_move_process(ee, e->x, e->y, e->timestamp);
153
154    return 1;
155 }
156
157 static Eina_Bool
158 _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
159 {
160    Ecore_Evas                  *ee;
161    Ecore_Win32_Event_Mouse_Out *e;
162
163    INF("mouse out");
164
165    e = event;
166    ee = ecore_event_window_match((Ecore_Window)e->window);
167    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
168    if ((Ecore_Window)e->window != ee->prop.window) return 1;
169
170    /* FIXME to do */
171 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
172    _ecore_evas_mouse_move_process(ee, e->x, e->y, e->timestamp);
173
174    evas_event_feed_mouse_out(ee->evas, e->timestamp, NULL);
175    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
176    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
177
178    return 1;
179 }
180
181 static Eina_Bool
182 _ecore_evas_win32_event_window_focus_in(void *data __UNUSED__, int type __UNUSED__, void *event)
183 {
184    Ecore_Evas *ee;
185    Ecore_Win32_Event_Window_Focus_In *e;
186
187    e = event;
188    ee = ecore_event_window_match((Ecore_Window)e->window);
189    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
190    if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
191
192    ee->prop.focused = 1;
193    evas_focus_in(ee->evas);
194    if (ee->func.fn_focus_in) ee->func.fn_focus_in(ee);
195    return ECORE_CALLBACK_PASS_ON;
196 }
197
198 static Eina_Bool
199 _ecore_evas_win32_event_window_focus_out(void *data __UNUSED__, int type __UNUSED__, void *event)
200 {
201    Ecore_Evas *ee;
202    Ecore_Win32_Event_Window_Focus_Out *e;
203
204    e = event;
205    ee = ecore_event_window_match((Ecore_Window)e->window);
206    if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON;
207    if ((Ecore_Window)e->window != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
208
209    evas_focus_out(ee->evas);
210    ee->prop.focused = 0;
211    if (ee->func.fn_focus_out) ee->func.fn_focus_out(ee);
212    return ECORE_CALLBACK_PASS_ON;
213 }
214
215 static Eina_Bool
216 _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
217 {
218    Ecore_Evas                      *ee;
219    Ecore_Win32_Event_Window_Damage *e;
220
221    INF("window damage");
222
223    e = event;
224    ee = ecore_event_window_match((Ecore_Window)e->window);
225    if (!ee) return 1; /* pass on event */
226    if ((Ecore_Window)e->window != ee->prop.window) return 1;
227
228    if (ee->prop.avoid_damage)
229      {
230 #ifdef _MSC_VER
231 # pragma message ("[ECORE] [WIN32] No Region code")
232 #else
233 # warning [ECORE] [WIN32] No Region code
234 #endif /* ! _MSC_VER */
235      }
236    else
237      {
238         if (ee->rotation == 0)
239           evas_damage_rectangle_add(ee->evas,
240                                     e->x,
241                                     e->y,
242                                     e->width,
243                                     e->height);
244         else if (ee->rotation == 90)
245           evas_damage_rectangle_add(ee->evas,
246                                     ee->h - e->y - e->height,
247                                     e->x,
248                                     e->height,
249                                     e->width);
250         else if (ee->rotation == 180)
251           evas_damage_rectangle_add(ee->evas,
252                                     ee->w - e->x - e->width,
253                                     ee->h - e->y - e->height,
254                                     e->width,
255                                     e->height);
256         else if (ee->rotation == 270)
257           evas_damage_rectangle_add(ee->evas,
258                                     e->y,
259                                     ee->w - e->x - e->width,
260                                     e->height,
261                                     e->width);
262      }
263
264    return 1;
265 }
266
267 static Eina_Bool
268 _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
269 {
270    Ecore_Evas                       *ee;
271    Ecore_Win32_Event_Window_Destroy *e;
272
273    INF("window destroy");
274
275    e = event;
276    ee = ecore_event_window_match((Ecore_Window)e->window);
277    if (!ee) return 1; /* pass on event */
278    if ((Ecore_Window)e->window != ee->prop.window) return 1;
279    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
280    ecore_evas_free(ee);
281
282    return 1;
283 }
284
285 static Eina_Bool
286 _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
287 {
288    Ecore_Evas                    *ee;
289    Ecore_Win32_Event_Window_Show *e;
290
291    INF("window show");
292
293    e = event;
294    ee = ecore_event_window_match((Ecore_Window)e->window);
295    if (!ee) return 1; /* pass on event */
296    if ((Ecore_Window)e->window != ee->prop.window) return 1;
297    if (ee->visible) return 0; /* dont pass it on */
298    ee->visible = 1;
299    if (ee->func.fn_show) ee->func.fn_show(ee);
300
301    return 1;
302 }
303
304 static Eina_Bool
305 _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
306 {
307    Ecore_Evas                    *ee;
308    Ecore_Win32_Event_Window_Hide *e;
309
310    INF("window hide");
311
312    e = event;
313    ee = ecore_event_window_match((Ecore_Window)e->window);
314    if (!ee) return 1; /* pass on event */
315    if ((Ecore_Window)e->window != ee->prop.window) return 1;
316    if (!ee->visible) return 0; /* dont pass it on */
317    ee->visible = 0;
318    if (ee->func.fn_hide) ee->func.fn_hide(ee);
319
320    return 1;
321 }
322
323 static Eina_Bool
324 _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
325 {
326    Ecore_Evas                         *ee;
327    Ecore_Win32_Event_Window_Configure *e;
328
329    INF("window configure");
330
331    e = event;
332    ee = ecore_event_window_match((Ecore_Window)e->window);
333    if (!ee) return 1; /* pass on event */
334    if ((Ecore_Window)e->window != ee->prop.window) return 1;
335
336    if (ee->prop.override)
337      {
338         if ((ee->x != e->x) || (ee->y != e->y))
339           {
340              ee->x = e->x;
341              ee->y = e->y;
342              ee->req.x = ee->x;
343              ee->req.y = ee->y;
344
345              if (ee->func.fn_move) ee->func.fn_move(ee);
346           }
347      }
348
349    if ((ee->w != e->width) || (ee->h != e->height))
350      {
351         ee->w = e->width;
352         ee->h = e->height;
353         ee->req.w = ee->w;
354         ee->req.h = ee->h;
355
356         if ((ee->rotation == 90) || (ee->rotation == 270))
357           {
358              evas_output_size_set(ee->evas, ee->h, ee->w);
359              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
360           }
361         else
362           {
363              evas_output_size_set(ee->evas, ee->w, ee->h);
364              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
365           }
366         if (ee->prop.avoid_damage)
367           {
368              int pdam;
369
370              pdam = ecore_evas_avoid_damage_get(ee);
371              ecore_evas_avoid_damage_set(ee, 0);
372              ecore_evas_avoid_damage_set(ee, pdam);
373           }
374 /*         if (ee->shaped) */
375 /*           _ecore_evas_win32_region_border_resize(ee); */
376         if ((ee->expecting_resize.w > 0) &&
377             (ee->expecting_resize.h > 0))
378           {
379              if ((ee->expecting_resize.w == ee->w) &&
380                  (ee->expecting_resize.h == ee->h))
381                _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
382                                               ecore_win32_current_time_get());
383              ee->expecting_resize.w = 0;
384              ee->expecting_resize.h = 0;
385           }
386         if (ee->func.fn_resize) ee->func.fn_resize(ee);
387      }
388
389    return 1;
390 }
391
392 static Eina_Bool
393 _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
394 {
395    Ecore_Evas                              *ee;
396    Ecore_Win32_Event_Window_Delete_Request *e;
397
398    INF("window delete request");
399
400    e = event;
401    ee = ecore_event_window_match((Ecore_Window)e->window);
402    if (!ee) return 1; /* pass on event */
403    if ((Ecore_Window)e->window != ee->prop.window) return 1;
404    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
405
406    INF(" * ee event delete\n");
407    return 1;
408 }
409
410
411 /* Ecore_Evas interface */
412
413 static void
414 _ecore_evas_win32_free(Ecore_Evas *ee)
415 {
416    INF("ecore evas free");
417
418    ecore_win32_window_free((struct _Ecore_Win32_Window *)ee->prop.window);
419    ecore_event_window_unregister(ee->prop.window);
420    _ecore_evas_win32_shutdown();
421    ecore_win32_shutdown();
422 }
423
424 static void
425 _ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
426                                               Ecore_Evas_Event_Cb func)
427 {
428    ee->func.fn_delete_request = func;
429 }
430
431 static void
432 _ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
433 {
434   INF("ecore evas move (%dx%d)", x, y);
435    ee->req.x = x;
436    ee->req.y = y;
437
438    if ((x != ee->x) || (y != ee->y))
439      {
440         ee->x = x;
441         ee->y = y;
442         ecore_win32_window_move((struct _Ecore_Win32_Window *)ee->prop.window,
443                                 x, y);
444         if (ee->func.fn_move) ee->func.fn_move(ee);
445      }
446 }
447
448 static void
449 _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
450 {
451    INF("ecore evas resize (%dx%d)", width, height);
452    ee->req.w = width;
453    ee->req.h = height;
454
455    if ((ee->w != width) || (ee->h != height))
456      {
457         ee->w = width;
458         ee->h = height;
459         ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
460                                   width, height);
461         if ((ee->rotation == 90) || (ee->rotation == 270))
462           {
463              evas_output_size_set(ee->evas, ee->h, ee->w);
464              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
465           }
466         else
467           {
468              evas_output_size_set(ee->evas, ee->w, ee->h);
469              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
470           }
471         if (ee->prop.avoid_damage)
472           {
473              int pdam;
474
475              pdam = ecore_evas_avoid_damage_get(ee);
476              ecore_evas_avoid_damage_set(ee, 0);
477              ecore_evas_avoid_damage_set(ee, pdam);
478           }
479 /*         if ((ee->shaped) || (ee->alpha)) */
480 /*           _ecore_evas_win32_region_border_resize(ee); */
481         if (ee->func.fn_resize) ee->func.fn_resize(ee);
482      }
483 }
484
485 static void
486 _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
487 {
488    INF("ecore evas resize (%dx%d %dx%d)", x, y, width, height);
489    ee->req.x = x;
490    ee->req.y = y;
491    ee->req.w = width;
492    ee->req.h = height;
493
494    if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
495      {
496         int change_size = 0;
497         int change_pos = 0;
498
499         if ((ee->w != width) || (ee->h != height)) change_size = 1;
500         if ((x != ee->x) || (y != ee->y)) change_pos = 1;
501
502         ee->x = x;
503         ee->y = y;
504         ee->w = width;
505         ee->h = height;
506         ecore_win32_window_move_resize((struct _Ecore_Win32_Window *)ee->prop.window,
507                                        x, y, width, height);
508         if ((ee->rotation == 90) || (ee->rotation == 270))
509           {
510              evas_output_size_set(ee->evas, ee->h, ee->w);
511              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
512           }
513         else
514           {
515              evas_output_size_set(ee->evas, ee->w, ee->h);
516              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
517           }
518         if (ee->prop.avoid_damage)
519           {
520              int pdam;
521
522              pdam = ecore_evas_avoid_damage_get(ee);
523              ecore_evas_avoid_damage_set(ee, 0);
524              ecore_evas_avoid_damage_set(ee, pdam);
525           }
526 /*         if ((ee->shaped) || (ee->alpha)) */
527 /*           _ecore_evas_win32_region_border_resize(ee); */
528         if (change_pos)
529           {
530              if (ee->func.fn_move) ee->func.fn_move(ee);
531           }
532         if (change_size)
533           {
534              if (ee->func.fn_resize) ee->func.fn_resize(ee);
535           }
536      }
537 }
538
539 static void
540 _ecore_evas_win32_rotation_set_internal(Ecore_Evas *ee, int rotation)
541 {
542    int rot_dif;
543
544    rot_dif = ee->rotation - rotation;
545    if (rot_dif < 0) rot_dif = -rot_dif;
546
547    if (rot_dif != 180)
548      {
549         int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
550
551         if (!ee->prop.fullscreen)
552           {
553              ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
554                                        ee->h, ee->w);
555              ee->expecting_resize.w = ee->h;
556              ee->expecting_resize.h = ee->w;
557           }
558         else
559           {
560              int w, h;
561
562              ecore_win32_window_size_get((struct _Ecore_Win32_Window *)ee->prop.window,
563                                          &w, &h);
564              ecore_win32_window_resize((struct _Ecore_Win32_Window *)ee->prop.window,
565                                        h, w);
566              if ((rotation == 0) || (rotation == 180))
567                {
568                   evas_output_size_set(ee->evas, ee->w, ee->h);
569                   evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
570                }
571              else
572                {
573                   evas_output_size_set(ee->evas, ee->h, ee->w);
574                   evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
575                }
576              if (ee->func.fn_resize) ee->func.fn_resize(ee);
577           }
578         ecore_evas_size_min_get(ee, &minw, &minh);
579         ecore_evas_size_max_get(ee, &maxw, &maxh);
580         ecore_evas_size_base_get(ee, &basew, &baseh);
581         ecore_evas_size_step_get(ee, &stepw, &steph);
582         ee->rotation = rotation;
583         ecore_evas_size_min_set(ee, minh, minw);
584         ecore_evas_size_max_set(ee, maxh, maxw);
585         ecore_evas_size_base_set(ee, baseh, basew);
586         ecore_evas_size_step_set(ee, steph, stepw);
587         _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
588                                        ecore_win32_current_time_get());
589      }
590    else
591      {
592         ee->rotation = rotation;
593         _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
594                                        ecore_win32_current_time_get());
595         if (ee->func.fn_resize) ee->func.fn_resize(ee);
596      }
597
598    if ((ee->rotation == 90) || (ee->rotation == 270))
599      evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
600    else
601      evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
602 }
603
604 static void
605 _ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation, int resize)
606 {
607    INF("ecore evas rotation: %s", rotation ? "yes" : "no");
608
609    if (ee->rotation == rotation) return;
610
611 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
612    if (!strcmp(ee->driver, "software_gdi"))
613      {
614         Evas_Engine_Info_Software_Gdi *einfo;
615
616         einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
617         if (!einfo) return;
618         einfo->info.rotation = rotation;
619         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
620           {
621              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
622           }
623         _ecore_evas_win32_rotation_set_internal(ee, rotation);
624      }
625 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
626
627 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
628    if (!strcmp(ee->driver, "software_ddraw"))
629      {
630         Evas_Engine_Info_Software_DDraw *einfo;
631
632         einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
633         if (!einfo) return;
634         einfo->info.rotation = rotation;
635         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
636           {
637              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
638           }
639         _ecore_evas_win32_rotation_set_internal(ee, rotation);
640      }
641 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
642 }
643
644 static void
645 _ecore_evas_win32_shaped_set(Ecore_Evas *ee, int shaped)
646 {
647    if (((ee->shaped) && (shaped)) || ((!ee->shaped) && (!shaped)))
648      return;
649
650    if (!strcmp(ee->driver, "software_ddraw")) return;
651
652 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
653    if (!strcmp(ee->driver, "software_gdi"))
654      {
655         Evas_Engine_Info_Software_Gdi *einfo;
656
657         einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
658         ee->shaped = shaped;
659         if (einfo)
660           {
661              ee->engine.win32.state.region = ee->shaped;
662              einfo->info.region = ee->engine.win32.state.region;
663              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
664                {
665                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
666                }
667              if (ee->shaped)
668                evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
669           }
670 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
671      }
672 }
673
674 static void
675 _ecore_evas_win32_show(Ecore_Evas *ee)
676 {
677    INF("ecore evas show");
678
679    ee->should_be_visible = 1;
680    if (ee->prop.avoid_damage)
681      _ecore_evas_win32_render(ee);
682    ecore_win32_window_show((struct _Ecore_Win32_Window *)ee->prop.window);
683 /*    if (ee->prop.fullscreen) */
684 /*      ecore_win32_window_focus(ee->prop.window); */
685 }
686
687 static void
688 _ecore_evas_win32_hide(Ecore_Evas *ee)
689 {
690    INF("ecore evas hide");
691
692    ecore_win32_window_hide((struct _Ecore_Win32_Window *)ee->prop.window);
693    ee->should_be_visible = 0;
694 }
695
696 static void
697 _ecore_evas_win32_raise(Ecore_Evas *ee)
698 {
699    INF("ecore evas raise");
700
701    if (!ee->prop.fullscreen)
702      ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
703    else
704      ecore_win32_window_raise((struct _Ecore_Win32_Window *)ee->prop.window);
705 }
706
707 static void
708 _ecore_evas_win32_lower(Ecore_Evas *ee)
709 {
710    INF("ecore evas lower");
711
712    if (!ee->prop.fullscreen)
713      ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
714    else
715      ecore_win32_window_lower((struct _Ecore_Win32_Window *)ee->prop.window);
716 }
717
718 static void
719 _ecore_evas_win32_activate(Ecore_Evas *ee)
720 {
721    INF("ecore evas activate");
722
723    ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
724 }
725
726 static void
727 _ecore_evas_win32_title_set(Ecore_Evas *ee, const char *title)
728 {
729    INF("ecore evas title set");
730
731    if (ee->prop.title) free(ee->prop.title);
732    ee->prop.title = NULL;
733    if (title) ee->prop.title = strdup(title);
734    ecore_win32_window_title_set((struct _Ecore_Win32_Window *)ee->prop.window,
735                                 ee->prop.title);
736 }
737
738 static void
739 _ecore_evas_win32_size_min_set(Ecore_Evas *ee, int width, int height)
740 {
741    if (width < 0) width = 0;
742    if (height < 0) height = 0;
743    if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return;
744    ee->prop.min.w = width;
745    ee->prop.min.h = height;
746    ecore_win32_window_size_min_set((struct _Ecore_Win32_Window *)ee->prop.window,
747                                    width, height);
748 }
749
750 static void
751 _ecore_evas_win32_size_max_set(Ecore_Evas *ee, int width, int height)
752 {
753    if (width < 0) width = 0;
754    if (height < 0) height = 0;
755    if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return;
756    ee->prop.max.w = width;
757    ee->prop.max.h = height;
758    ecore_win32_window_size_max_set((struct _Ecore_Win32_Window *)ee->prop.window,
759                                    width, height);
760 }
761
762 static void
763 _ecore_evas_win32_size_base_set(Ecore_Evas *ee, int width, int height)
764 {
765    if (width < 0) width = 0;
766    if (height < 0) height = 0;
767    if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return;
768    ee->prop.base.w = width;
769    ee->prop.base.h = height;
770    ecore_win32_window_size_base_set((struct _Ecore_Win32_Window *)ee->prop.window,
771                                     width, height);
772 }
773
774 static void
775 _ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
776 {
777    if (width < 1) width = 1;
778    if (height < 1) height = 1;
779    if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return;
780    ee->prop.step.w = width;
781    ee->prop.step.h = height;
782    ecore_win32_window_size_step_set((struct _Ecore_Win32_Window *)ee->prop.window,
783                                     width, height);
784 }
785
786 static void
787 _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
788 {
789 #if 0
790    int x, y;
791
792    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
793
794    if (obj == NULL)
795      {
796         ee->prop.cursor.object = NULL;
797         ee->prop.cursor.layer = 0;
798         ee->prop.cursor.hot.x = 0;
799         ee->prop.cursor.hot.y = 0;
800         ecore_win32_window_cursor_show(ee->prop.window, 1);
801         return;
802      }
803
804    ee->prop.cursor.object = obj;
805    ee->prop.cursor.layer = layer;
806    ee->prop.cursor.hot.x = hot_x;
807    ee->prop.cursor.hot.y = hot_y;
808
809    ecore_win32_window_cursor_show(ee->prop.window, 0);
810
811    evas_pointer_output_xy_get(ee->evas, &x, &y);
812    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
813    evas_object_move(ee->prop.cursor.object,
814                     x - ee->prop.cursor.hot.x,
815                     y - ee->prop.cursor.hot.y);
816    evas_object_pass_events_set(ee->prop.cursor.object, 1);
817    if (evas_pointer_inside_get(ee->evas))
818      evas_object_show(ee->prop.cursor.object);
819 #endif
820 }
821
822 static void
823 _ecore_evas_win32_focus_set(Ecore_Evas *ee, int on __UNUSED__)
824 {
825    ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
826 }
827
828 static void
829 _ecore_evas_win32_iconified_set(Ecore_Evas *ee, int on)
830 {
831 /*    if (((ee->prop.borderless) && (on)) || */
832 /*        ((!ee->prop.borderless) && (!on))) return; */
833    ee->prop.iconified = on;
834    ecore_win32_window_iconified_set((struct _Ecore_Win32_Window *)ee->prop.window,
835                                     ee->prop.iconified);
836 }
837
838 static void
839 _ecore_evas_win32_borderless_set(Ecore_Evas *ee, int on)
840 {
841    if (((ee->prop.borderless) && (on)) ||
842        ((!ee->prop.borderless) && (!on))) return;
843    ee->prop.borderless = on;
844    ecore_win32_window_borderless_set((struct _Ecore_Win32_Window *)ee->prop.window,
845                                      ee->prop.borderless);
846
847 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
848    if (!strcmp(ee->driver, "software_gdi"))
849      {
850         Evas_Engine_Info_Software_Gdi *einfo;
851
852         einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
853         if (einfo)
854           {
855             einfo->info.borderless = ee->prop.borderless;
856              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
857                {
858                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
859                }
860              if (ee->prop.borderless)
861                evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
862           }
863      }
864 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
865 }
866
867 static void
868 _ecore_evas_win32_override_set(Ecore_Evas *ee, int on)
869 {
870    struct _Ecore_Win32_Window *window;
871
872    INF("ecore evas override set");
873
874    window = (struct _Ecore_Win32_Window *)ee->prop.window;
875
876    if (ee->prop.override == on) return;
877    if (ee->should_be_visible) ecore_win32_window_hide(window);
878    /* FIXME: use borderless_set for now */
879    ecore_win32_window_borderless_set(window, on);
880    if (ee->should_be_visible) ecore_win32_window_show(window);
881    if (ee->prop.focused) ecore_win32_window_focus(window);
882    ee->prop.override = on;
883 }
884
885 static void
886 _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
887 {
888    struct _Ecore_Win32_Window *window;
889
890    INF("ecore evas fullscreen set");
891
892    if ((ee->engine.win32.state.fullscreen && on) ||
893       (!ee->engine.win32.state.fullscreen && !on))
894      return;
895
896    ee->engine.win32.state.fullscreen = on;
897    ee->prop.fullscreen = on;
898
899    window = (struct _Ecore_Win32_Window *)ee->prop.window;
900
901    if (on != 0)
902    {
903       ecore_win32_window_fullscreen_set(window, on);
904    }
905    else
906    {
907       ecore_win32_window_fullscreen_set(window, on);
908    }
909
910    /* Nothing to be done for the GDI backend at the evas level */
911
912 #ifdef BUILD_ECORE_EVAS_SOFTWRE_DDRAW
913    if (strcmp(ee->driver, "software_ddraw") == 0)
914      {
915         Evas_Engine_Info_Software_DDraw *einfo;
916
917         einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ecore_evas_get(ee));
918         if (einfo)
919           {
920              einfo->info.fullscreen = !!on;
921 /*           einfo->info.layered = window->shape.layered; */
922              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
923                {
924                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
925                }
926           }
927      }
928 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
929
930 #ifdef BUILD_ECORE_EVAS_DIRECT3D
931    if (strcmp(ee->driver, "direct3d") == 0)
932      {
933         Evas_Engine_Info_Direct3D *einfo;
934
935         einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ecore_evas_get(ee));
936         if (einfo)
937           {
938              einfo->info.fullscreen = !!on;
939              einfo->info.layered = window->shape.layered;
940              if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
941                {
942                   ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
943                }
944           }
945      }
946 #endif /* BUILD_ECORE_EVAS_DIRECT3D */
947 }
948 static void
949 _ecore_evas_win32_alpha_set(Ecore_Evas *ee, int alpha)
950 {
951    alpha = !!alpha;
952    if ((ee->alpha == alpha)) return;
953
954    if (!strcmp(ee->driver, "software_gdi"))
955      {
956 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
957         Evas_Engine_Info_Software_Gdi *einfo;
958
959         einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
960         if (!einfo) return;
961
962         ee->shaped = 0;
963         ee->alpha = alpha;
964         /* ecore_win32_window_free(ee->prop.window); */
965         /* ecore_event_window_unregister(ee->prop.window); */
966         /* if (ee->alpha) */
967         /*   { */
968         /*      if (ee->prop.override) */
969         /*        ee->prop.window = ecore_x_window_override_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h); */
970         /*      else */
971         /*        ee->prop.window = ecore_x_window_argb_new(ee->engine.x.win_root, ee->req.x, ee->req.y, ee->req.w, ee->req.h); */
972         /*      if (!ee->engine.x.mask) */
973         /*        ee->engine.x.mask = ecore_x_pixmap_new(ee->prop.window, ee->req.w, ee->req.h, 1); */
974         /*   } */
975         /* else */
976         /*   { */
977         /*      if (ee->prop.override) */
978         /*        ee->prop.window = ecore_win32_window_override_new(ee->engine.win32.win_root, */
979         /*                                                          ee->req.x, */
980         /*                                                          ee->req.y, */
981         /*                                                          ee->req.w, */
982         /*                                                          ee->req.h); */
983         /*      else */
984         /*        ee->prop.window = ecore_win32_window_new(ee->engine.win32.win_root, */
985         /*                                                 ee->req.x, */
986         /*                                                 ee->req.y, */
987         /*                                                 ee->req.w, */
988         /*                                                 ee->req.h); */
989         /*      if (ee->engine.win32.mask) ecore_x_pixmap_free(ee->engine.x.mask); */
990         /*      ee->engine.win32.mask = 0; */
991         /*      ecore_win32_window_shape_input_mask_set(ee->prop.window, 0); */
992         /*   } */
993
994         /* einfo->info.destination_alpha = alpha; */
995         einfo->info.region = alpha;
996
997 //        if (ee->engine.x.mask) ecore_x_pixmap_free(ee->engine.x.mask);
998 //        ee->engine.x.mask = 0;
999         /* einfo->info.mask = ee->engine.win32.mask; */
1000         /* einfo->info.drawable = ee->prop.window; */
1001         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1002           {
1003              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1004           }
1005         evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h);
1006         /* ecore_win32_window_shape_mask_set(ee->prop.window, 0); */
1007         /* ecore_event_window_register(ee->prop.window, ee, ee->evas, */
1008         /*                             (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process, */
1009         /*                             (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process, */
1010         /*                             (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, */
1011         /*                             (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); */
1012         if (ee->prop.borderless)
1013           ecore_win32_window_borderless_set((struct _Ecore_Win32_Window *)ee->prop.window, ee->prop.borderless);
1014         if (ee->visible) ecore_win32_window_show((struct _Ecore_Win32_Window *)ee->prop.window);
1015         if (ee->prop.focused) ecore_win32_window_focus((struct _Ecore_Win32_Window *)ee->prop.window);
1016         if (ee->prop.title)
1017           {
1018              ecore_win32_window_title_set((struct _Ecore_Win32_Window *)ee->prop.window, ee->prop.title);
1019              /* ecore_win32_name_set(ee->prop.window, ee->prop.title); */
1020           }
1021         ecore_win32_window_type_set((struct _Ecore_Win32_Window *)ee->prop.window, ECORE_WIN32_WINDOW_TYPE_NORMAL);
1022 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
1023      }
1024 }
1025
1026
1027 static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
1028 {
1029    _ecore_evas_win32_free,
1030      NULL,
1031      NULL,
1032      NULL,
1033      NULL,
1034      _ecore_evas_win32_callback_delete_request_set,
1035      NULL,
1036      NULL,
1037      NULL,
1038      NULL,
1039      NULL,
1040      NULL,
1041      NULL,
1042      NULL,
1043      NULL,
1044      _ecore_evas_win32_move,
1045      NULL,
1046      _ecore_evas_win32_resize,
1047      _ecore_evas_win32_move_resize,
1048      _ecore_evas_win32_rotation_set,
1049      _ecore_evas_win32_shaped_set,
1050      _ecore_evas_win32_show,
1051      _ecore_evas_win32_hide,
1052      _ecore_evas_win32_raise,
1053      _ecore_evas_win32_lower,
1054      _ecore_evas_win32_activate,
1055      _ecore_evas_win32_title_set,
1056      NULL, /* _ecore_evas_x_name_class_set */
1057      _ecore_evas_win32_size_min_set,
1058      _ecore_evas_win32_size_max_set,
1059      _ecore_evas_win32_size_base_set,
1060      _ecore_evas_win32_size_step_set,
1061      _ecore_evas_win32_cursor_set,
1062      NULL, /* _ecore_evas_x_layer_set */
1063      _ecore_evas_win32_focus_set,
1064      _ecore_evas_win32_iconified_set,
1065      _ecore_evas_win32_borderless_set,
1066      _ecore_evas_win32_override_set,
1067      NULL,
1068      _ecore_evas_win32_fullscreen_set,
1069      NULL, /* _ecore_evas_x_avoid_damage_set */
1070      NULL, /* _ecore_evas_x_withdrawn_set */
1071      NULL, /* _ecore_evas_x_sticky_set */
1072      NULL, /* _ecore_evas_x_ignore_events_set */
1073      _ecore_evas_win32_alpha_set,
1074      NULL, //transparent
1075      NULL, // profiles_set
1076
1077      NULL,
1078      NULL,
1079      NULL,
1080      NULL,
1081      NULL,
1082      NULL,
1083
1084      NULL, // render
1085      NULL  //screen_geometry_get
1086 };
1087
1088 #endif /* BUILD_ECORE_EVAS_WIN32 */
1089
1090 /* API */
1091
1092 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
1093 static int
1094 _ecore_evas_engine_software_gdi_init(Ecore_Evas *ee)
1095 {
1096    Evas_Engine_Info_Software_Gdi *einfo;
1097    const char                    *driver;
1098    int                            rmethod;
1099
1100    driver = "software_gdi";
1101
1102    rmethod = evas_render_method_lookup(driver);
1103    if (!rmethod)
1104      return 0;
1105
1106    ee->driver = driver;
1107    evas_output_method_set(ee->evas, rmethod);
1108
1109    einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
1110    if (einfo)
1111      {
1112         /* FIXME: REDRAW_DEBUG missing for now */
1113         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1114         einfo->info.depth = ecore_win32_screen_depth_get();
1115         einfo->info.rotation = 0;
1116         einfo->info.borderless = 0;
1117         einfo->info.fullscreen = 0;
1118         einfo->info.region = 0;
1119         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1120           {
1121              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1122              return 0;
1123           }
1124      }
1125    else
1126      {
1127         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1128         return 0;
1129      }
1130
1131    return 1;
1132 }
1133 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
1134
1135 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1136 static int
1137 _ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
1138 {
1139    Evas_Engine_Info_Software_DDraw *einfo;
1140    const char                      *driver;
1141    int                              rmethod;
1142
1143    driver = "software_ddraw";
1144
1145    rmethod = evas_render_method_lookup(driver);
1146    if (!rmethod)
1147      return 0;
1148
1149    ee->driver = driver;
1150    evas_output_method_set(ee->evas, rmethod);
1151
1152    einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
1153    if (einfo)
1154      {
1155         /* FIXME: REDRAW_DEBUG missing for now */
1156         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1157         einfo->info.depth = ecore_win32_screen_depth_get();
1158         einfo->info.rotation = 0;
1159         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1160           {
1161              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1162              return 0;
1163           }
1164      }
1165    else
1166      {
1167         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1168         return 0;
1169      }
1170
1171    return 1;
1172 }
1173 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1174
1175 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1176 static int
1177 _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
1178 {
1179    Evas_Engine_Info_Direct3D *einfo;
1180    const char                *driver;
1181    int                        rmethod;
1182
1183    driver = "direct3d";
1184
1185    rmethod = evas_render_method_lookup(driver);
1186    if (!rmethod)
1187      return 0;
1188
1189    ee->driver = driver;
1190    evas_output_method_set(ee->evas, rmethod);
1191
1192    einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ee->evas);
1193    if (einfo)
1194      {
1195         /* FIXME: REDRAW_DEBUG missing for now */
1196         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1197         einfo->info.depth = ecore_win32_screen_depth_get();
1198         einfo->info.rotation = 0;
1199         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1200           {
1201              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1202              return 0;
1203           }
1204      }
1205    else
1206      {
1207         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1208         return 0;
1209      }
1210
1211    return 1;
1212 }
1213 #endif /* BUILD_ECORE_EVAS_DIRECT3D */
1214
1215 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1216 static int
1217 _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
1218 {
1219    Evas_Engine_Info_GL_Glew *einfo;
1220    const char               *driver;
1221    int                       rmethod;
1222
1223    driver = "gl_glew";
1224
1225    rmethod = evas_render_method_lookup(driver);
1226    if (!rmethod)
1227      return 0;
1228
1229    ee->driver = driver;
1230    evas_output_method_set(ee->evas, rmethod);
1231
1232    einfo = (Evas_Engine_Info_GL_Glew *)evas_engine_info_get(ee->evas);
1233    if (einfo)
1234      {
1235         /* FIXME: REDRAW_DEBUG missing for now */
1236         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1237         einfo->info.depth = ecore_win32_screen_depth_get();
1238         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1239           {
1240              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1241              return 0;
1242           }
1243      }
1244    else
1245      {
1246         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1247         return 0;
1248      }
1249
1250    return 1;
1251 }
1252 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1253
1254 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1255 static int
1256 _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
1257 {
1258    Evas_Engine_Info_Software_DDraw *einfo;
1259    const char                      *driver;
1260    int                              rmethod;
1261
1262    driver = "software_16_ddraw";
1263
1264    rmethod = evas_render_method_lookup(driver);
1265    if (!rmethod)
1266      return 0;
1267
1268    ee->driver = driver;
1269    evas_output_method_set(ee->evas, rmethod);
1270
1271    if (ecore_win32_screen_depth_get() != 16)
1272      return 0;
1273
1274    einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(ee->evas);
1275    if (einfo)
1276      {
1277         /* FIXME: REDRAW_DEBUG missing for now */
1278         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1279         einfo->info.depth = ecore_win32_screen_depth_get();
1280         einfo->info.rotation = 0;
1281         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1282           {
1283              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1284              return 0;
1285           }
1286      }
1287    else
1288      {
1289         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1290         return 0;
1291      }
1292
1293    return 1;
1294 }
1295 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1296
1297 #ifdef BUILD_ECORE_EVAS_WIN32
1298 static Ecore_Evas *
1299 _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
1300                                Ecore_Win32_Window *parent,
1301                                int                 x,
1302                                int                 y,
1303                                int                 width,
1304                                int                 height)
1305 {
1306    Ecore_Evas *ee;
1307
1308    if (!ecore_win32_init())
1309      return NULL;
1310
1311    ee = calloc(1, sizeof(Ecore_Evas));
1312    if (!ee)
1313      return NULL;
1314
1315    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1316
1317    _ecore_evas_win32_init();
1318
1319    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
1320
1321    if (width < 1) width = 1;
1322    if (height < 1) height = 1;
1323    ee->x = x;
1324    ee->y = y;
1325    ee->w = width;
1326    ee->h = height;
1327    ee->req.x = ee->x;
1328    ee->req.y = ee->y;
1329    ee->req.w = ee->w;
1330    ee->req.h = ee->h;
1331
1332    ee->prop.max.w = 32767;
1333    ee->prop.max.h = 32767;
1334    ee->prop.layer = 4;
1335    ee->prop.request_pos = 0;
1336    ee->prop.sticky = 0;
1337    /* FIXME: sticky to add */
1338    ee->prop.window = 0;
1339
1340    /* init evas here */
1341    ee->evas = evas_new();
1342    evas_data_attach_set(ee->evas, ee);
1343    evas_output_size_set(ee->evas, width, height);
1344    evas_output_viewport_set(ee->evas, 0, 0, width, height);
1345
1346    ee->engine.win32.parent = parent;
1347    ee->prop.window = (Ecore_Window)ecore_win32_window_new(parent, x, y, width, height);
1348    if (!ee->prop.window)
1349      {
1350         _ecore_evas_win32_shutdown();
1351         free(ee);
1352         return NULL;
1353      }
1354
1355    if (!_ecore_evas_engine_init(ee))
1356      {
1357         _ecore_evas_win32_shutdown();
1358         free(ee);
1359         return NULL;
1360      }
1361
1362    ee->engine.func->fn_render = _ecore_evas_win32_render;
1363    _ecore_evas_register(ee);
1364    ecore_event_window_register(ee->prop.window, ee, ee->evas,
1365                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
1366                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
1367                                (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
1368                                (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
1369
1370    return ee;
1371 }
1372
1373 #endif /* BUILD_ECORE_EVAS_WIN32 */
1374
1375 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
1376
1377 EAPI Ecore_Evas *
1378 ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
1379                             int                 x,
1380                             int                 y,
1381                             int                 width,
1382                             int                 height)
1383 {
1384    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_gdi_init,
1385                                          parent,
1386                                          x,
1387                                          y,
1388                                          width,
1389                                          height);
1390 }
1391
1392 #else
1393
1394 EAPI Ecore_Evas *
1395 ecore_evas_software_gdi_new(Ecore_Win32_Window *parent __UNUSED__,
1396                             int                 x __UNUSED__,
1397                             int                 y __UNUSED__,
1398                             int                 width __UNUSED__,
1399                             int                 height __UNUSED__)
1400 {
1401    return NULL;
1402 }
1403
1404 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_GDI */
1405
1406 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1407
1408 EAPI Ecore_Evas *
1409 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
1410                               int                 x,
1411                               int                 y,
1412                               int                 width,
1413                               int                 height)
1414 {
1415    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
1416                                          parent,
1417                                          x,
1418                                          y,
1419                                          width,
1420                                          height);
1421 }
1422
1423 #else
1424
1425 EAPI Ecore_Evas *
1426 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1427                               int                 x __UNUSED__,
1428                               int                 y __UNUSED__,
1429                               int                 width __UNUSED__,
1430                               int                 height __UNUSED__)
1431 {
1432    return NULL;
1433 }
1434
1435 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1436
1437
1438 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1439
1440 EAPI Ecore_Evas *
1441 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
1442                                  int                 x,
1443                                  int                 y,
1444                                  int                 width,
1445                                  int                 height)
1446 {
1447    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
1448                                          parent,
1449                                          x,
1450                                          y,
1451                                          width,
1452                                          height);
1453 }
1454
1455 #else
1456
1457 EAPI Ecore_Evas *
1458 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1459                                  int                 x __UNUSED__,
1460                                  int                 y __UNUSED__,
1461                                  int                 width __UNUSED__,
1462                                  int                 height __UNUSED__)
1463 {
1464    return NULL;
1465 }
1466
1467 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1468
1469
1470 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1471
1472 EAPI Ecore_Evas *
1473 ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
1474                         int                 x,
1475                         int                 y,
1476                         int                 width,
1477                         int                 height)
1478 {
1479    return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
1480                                          parent,
1481                                          x,
1482                                          y,
1483                                          width,
1484                                          height);
1485 }
1486
1487 #else
1488
1489 EAPI Ecore_Evas *
1490 ecore_evas_direct3d_new(Ecore_Win32_Window *parent __UNUSED__,
1491                         int                 x __UNUSED__,
1492                         int                 y __UNUSED__,
1493                         int                 width __UNUSED__,
1494                         int                 height __UNUSED__)
1495 {
1496    return NULL;
1497 }
1498
1499 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1500
1501
1502 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1503
1504 EAPI Ecore_Evas *
1505 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
1506                        int                 x,
1507                        int                 y,
1508                        int                 width,
1509                        int                 height)
1510 {
1511    return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
1512                                          parent,
1513                                          x,
1514                                          y,
1515                                          width,
1516                                          height);
1517 }
1518
1519 #else
1520
1521 EAPI Ecore_Evas *
1522 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent __UNUSED__,
1523                        int                 x __UNUSED__,
1524                        int                 y __UNUSED__,
1525                        int                 width __UNUSED__,
1526                        int                 height __UNUSED__)
1527 {
1528    return NULL;
1529 }
1530
1531 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1532
1533
1534 #ifdef BUILD_ECORE_EVAS_WIN32
1535
1536 EAPI Ecore_Win32_Window *
1537 ecore_evas_win32_window_get(const Ecore_Evas *ee)
1538 {
1539    return (Ecore_Win32_Window *) ecore_evas_window_get(ee);
1540 }
1541
1542 #else
1543
1544 EAPI Ecore_Win32_Window *
1545 ecore_evas_win32_window_get(const Ecore_Evas *ee __UNUSED__)
1546 {
1547    return NULL;
1548 }
1549
1550 #endif /* BUILD_ECORE_EVAS_WIN32 */