updated debian/changelog
[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
949
950 static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
951 {
952    _ecore_evas_win32_free,
953      NULL,
954      NULL,
955      NULL,
956      NULL,
957      _ecore_evas_win32_callback_delete_request_set,
958      NULL,
959      NULL,
960      NULL,
961      NULL,
962      NULL,
963      NULL,
964      NULL,
965      NULL,
966      NULL,
967      _ecore_evas_win32_move,
968      NULL,
969      _ecore_evas_win32_resize,
970      _ecore_evas_win32_move_resize,
971      _ecore_evas_win32_rotation_set,
972      _ecore_evas_win32_shaped_set,
973      _ecore_evas_win32_show,
974      _ecore_evas_win32_hide,
975      _ecore_evas_win32_raise,
976      _ecore_evas_win32_lower,
977      _ecore_evas_win32_activate,
978      _ecore_evas_win32_title_set,
979      NULL, /* _ecore_evas_x_name_class_set */
980      _ecore_evas_win32_size_min_set,
981      _ecore_evas_win32_size_max_set,
982      _ecore_evas_win32_size_base_set,
983      _ecore_evas_win32_size_step_set,
984      _ecore_evas_win32_cursor_set,
985      NULL, /* _ecore_evas_x_layer_set */
986      _ecore_evas_win32_focus_set,
987      _ecore_evas_win32_iconified_set,
988      _ecore_evas_win32_borderless_set,
989      _ecore_evas_win32_override_set,
990      NULL,
991      _ecore_evas_win32_fullscreen_set,
992      NULL, /* _ecore_evas_x_avoid_damage_set */
993      NULL, /* _ecore_evas_x_withdrawn_set */
994      NULL, /* _ecore_evas_x_sticky_set */
995      NULL, /* _ecore_evas_x_ignore_events_set */
996      NULL,  /* _ecore_evas_x_alpha_set */
997      NULL, //transparent
998      NULL, // profiles_set
999
1000      NULL,
1001      NULL,
1002      NULL,
1003      NULL,
1004      NULL,
1005      NULL,
1006
1007      NULL, // render
1008      NULL  //screen_geometry_get
1009 };
1010
1011 #endif /* BUILD_ECORE_EVAS_WIN32 */
1012
1013 /* API */
1014
1015 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
1016 static int
1017 _ecore_evas_engine_software_gdi_init(Ecore_Evas *ee)
1018 {
1019    Evas_Engine_Info_Software_Gdi *einfo;
1020    const char                    *driver;
1021    int                            rmethod;
1022
1023    driver = "software_gdi";
1024
1025    rmethod = evas_render_method_lookup(driver);
1026    if (!rmethod)
1027      return 0;
1028
1029    ee->driver = driver;
1030    evas_output_method_set(ee->evas, rmethod);
1031
1032    einfo = (Evas_Engine_Info_Software_Gdi *)evas_engine_info_get(ee->evas);
1033    if (einfo)
1034      {
1035         /* FIXME: REDRAW_DEBUG missing for now */
1036         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1037         einfo->info.depth = ecore_win32_screen_depth_get();
1038         einfo->info.rotation = 0;
1039         einfo->info.borderless = 0;
1040         einfo->info.fullscreen = 0;
1041         einfo->info.region = 0;
1042         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1043           {
1044              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1045              return 0;
1046           }
1047      }
1048    else
1049      {
1050         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1051         return 0;
1052      }
1053
1054    return 1;
1055 }
1056 #endif /* BUILD_ECORE_EVAS_SOFTWARE_GDI */
1057
1058 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1059 static int
1060 _ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
1061 {
1062    Evas_Engine_Info_Software_DDraw *einfo;
1063    const char                      *driver;
1064    int                              rmethod;
1065
1066    driver = "software_ddraw";
1067
1068    rmethod = evas_render_method_lookup(driver);
1069    if (!rmethod)
1070      return 0;
1071
1072    ee->driver = driver;
1073    evas_output_method_set(ee->evas, rmethod);
1074
1075    einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
1076    if (einfo)
1077      {
1078         /* FIXME: REDRAW_DEBUG missing for now */
1079         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1080         einfo->info.depth = ecore_win32_screen_depth_get();
1081         einfo->info.rotation = 0;
1082         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1083           {
1084              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1085              return 0;
1086           }
1087      }
1088    else
1089      {
1090         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1091         return 0;
1092      }
1093
1094    return 1;
1095 }
1096 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1097
1098 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1099 static int
1100 _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
1101 {
1102    Evas_Engine_Info_Direct3D *einfo;
1103    const char                *driver;
1104    int                        rmethod;
1105
1106    driver = "direct3d";
1107
1108    rmethod = evas_render_method_lookup(driver);
1109    if (!rmethod)
1110      return 0;
1111
1112    ee->driver = driver;
1113    evas_output_method_set(ee->evas, rmethod);
1114
1115    einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ee->evas);
1116    if (einfo)
1117      {
1118         /* FIXME: REDRAW_DEBUG missing for now */
1119         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1120         einfo->info.depth = ecore_win32_screen_depth_get();
1121         einfo->info.rotation = 0;
1122         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1123           {
1124              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1125              return 0;
1126           }
1127      }
1128    else
1129      {
1130         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1131         return 0;
1132      }
1133
1134    return 1;
1135 }
1136 #endif /* BUILD_ECORE_EVAS_DIRECT3D */
1137
1138 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1139 static int
1140 _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
1141 {
1142    Evas_Engine_Info_GL_Glew *einfo;
1143    const char               *driver;
1144    int                       rmethod;
1145
1146    driver = "gl_glew";
1147
1148    rmethod = evas_render_method_lookup(driver);
1149    if (!rmethod)
1150      return 0;
1151
1152    ee->driver = driver;
1153    evas_output_method_set(ee->evas, rmethod);
1154
1155    einfo = (Evas_Engine_Info_GL_Glew *)evas_engine_info_get(ee->evas);
1156    if (einfo)
1157      {
1158         /* FIXME: REDRAW_DEBUG missing for now */
1159         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1160         einfo->info.depth = ecore_win32_screen_depth_get();
1161         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1162           {
1163              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1164              return 0;
1165           }
1166      }
1167    else
1168      {
1169         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1170         return 0;
1171      }
1172
1173    return 1;
1174 }
1175 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1176
1177 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1178 static int
1179 _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
1180 {
1181    Evas_Engine_Info_Software_DDraw *einfo;
1182    const char                      *driver;
1183    int                              rmethod;
1184
1185    driver = "software_16_ddraw";
1186
1187    rmethod = evas_render_method_lookup(driver);
1188    if (!rmethod)
1189      return 0;
1190
1191    ee->driver = driver;
1192    evas_output_method_set(ee->evas, rmethod);
1193
1194    if (ecore_win32_screen_depth_get() != 16)
1195      return 0;
1196
1197    einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(ee->evas);
1198    if (einfo)
1199      {
1200         /* FIXME: REDRAW_DEBUG missing for now */
1201         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->prop.window)->window;
1202         einfo->info.depth = ecore_win32_screen_depth_get();
1203         einfo->info.rotation = 0;
1204         if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
1205           {
1206              ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver);
1207              return 0;
1208           }
1209      }
1210    else
1211      {
1212         ERR("evas_engine_info_set() init engine '%s' failed.", ee->driver);
1213         return 0;
1214      }
1215
1216    return 1;
1217 }
1218 #endif /* BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1219
1220 #ifdef BUILD_ECORE_EVAS_WIN32
1221 static Ecore_Evas *
1222 _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
1223                                Ecore_Win32_Window *parent,
1224                                int                 x,
1225                                int                 y,
1226                                int                 width,
1227                                int                 height)
1228 {
1229    Ecore_Evas *ee;
1230
1231    if (!ecore_win32_init())
1232      return NULL;
1233
1234    ee = calloc(1, sizeof(Ecore_Evas));
1235    if (!ee)
1236      return NULL;
1237
1238    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1239
1240    _ecore_evas_win32_init();
1241
1242    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
1243
1244    if (width < 1) width = 1;
1245    if (height < 1) height = 1;
1246    ee->x = x;
1247    ee->y = y;
1248    ee->w = width;
1249    ee->h = height;
1250    ee->req.x = ee->x;
1251    ee->req.y = ee->y;
1252    ee->req.w = ee->w;
1253    ee->req.h = ee->h;
1254
1255    ee->prop.max.w = 32767;
1256    ee->prop.max.h = 32767;
1257    ee->prop.layer = 4;
1258    ee->prop.request_pos = 0;
1259    ee->prop.sticky = 0;
1260    /* FIXME: sticky to add */
1261    ee->prop.window = 0;
1262
1263    /* init evas here */
1264    ee->evas = evas_new();
1265    evas_data_attach_set(ee->evas, ee);
1266    evas_output_size_set(ee->evas, width, height);
1267    evas_output_viewport_set(ee->evas, 0, 0, width, height);
1268
1269    ee->engine.win32.parent = parent;
1270    ee->prop.window = (Ecore_Window)ecore_win32_window_new(parent, x, y, width, height);
1271    if (!ee->prop.window)
1272      {
1273         _ecore_evas_win32_shutdown();
1274         free(ee);
1275         return NULL;
1276      }
1277
1278    if (!_ecore_evas_engine_init(ee))
1279      {
1280         _ecore_evas_win32_shutdown();
1281         free(ee);
1282         return NULL;
1283      }
1284
1285    ee->engine.func->fn_render = _ecore_evas_win32_render;
1286    _ecore_evas_register(ee);
1287    ecore_event_window_register(ee->prop.window, ee, ee->evas,
1288                                (Ecore_Event_Mouse_Move_Cb)_ecore_evas_mouse_move_process,
1289                                (Ecore_Event_Multi_Move_Cb)_ecore_evas_mouse_multi_move_process,
1290                                (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process,
1291                                (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process);
1292
1293    return ee;
1294 }
1295
1296 #endif /* BUILD_ECORE_EVAS_WIN32 */
1297
1298 #ifdef BUILD_ECORE_EVAS_SOFTWARE_GDI
1299
1300 EAPI Ecore_Evas *
1301 ecore_evas_software_gdi_new(Ecore_Win32_Window *parent,
1302                             int                 x,
1303                             int                 y,
1304                             int                 width,
1305                             int                 height)
1306 {
1307    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_gdi_init,
1308                                          parent,
1309                                          x,
1310                                          y,
1311                                          width,
1312                                          height);
1313 }
1314
1315 #else
1316
1317 EAPI Ecore_Evas *
1318 ecore_evas_software_gdi_new(Ecore_Win32_Window *parent __UNUSED__,
1319                             int                 x __UNUSED__,
1320                             int                 y __UNUSED__,
1321                             int                 width __UNUSED__,
1322                             int                 height __UNUSED__)
1323 {
1324    return NULL;
1325 }
1326
1327 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_GDI */
1328
1329 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1330
1331 EAPI Ecore_Evas *
1332 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
1333                               int                 x,
1334                               int                 y,
1335                               int                 width,
1336                               int                 height)
1337 {
1338    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
1339                                          parent,
1340                                          x,
1341                                          y,
1342                                          width,
1343                                          height);
1344 }
1345
1346 #else
1347
1348 EAPI Ecore_Evas *
1349 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1350                               int                 x __UNUSED__,
1351                               int                 y __UNUSED__,
1352                               int                 width __UNUSED__,
1353                               int                 height __UNUSED__)
1354 {
1355    return NULL;
1356 }
1357
1358 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1359
1360
1361 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW
1362
1363 EAPI Ecore_Evas *
1364 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
1365                                  int                 x,
1366                                  int                 y,
1367                                  int                 width,
1368                                  int                 height)
1369 {
1370    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
1371                                          parent,
1372                                          x,
1373                                          y,
1374                                          width,
1375                                          height);
1376 }
1377
1378 #else
1379
1380 EAPI Ecore_Evas *
1381 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent __UNUSED__,
1382                                  int                 x __UNUSED__,
1383                                  int                 y __UNUSED__,
1384                                  int                 width __UNUSED__,
1385                                  int                 height __UNUSED__)
1386 {
1387    return NULL;
1388 }
1389
1390 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DDRAW */
1391
1392
1393 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1394
1395 EAPI Ecore_Evas *
1396 ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
1397                         int                 x,
1398                         int                 y,
1399                         int                 width,
1400                         int                 height)
1401 {
1402    return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
1403                                          parent,
1404                                          x,
1405                                          y,
1406                                          width,
1407                                          height);
1408 }
1409
1410 #else
1411
1412 EAPI Ecore_Evas *
1413 ecore_evas_direct3d_new(Ecore_Win32_Window *parent __UNUSED__,
1414                         int                 x __UNUSED__,
1415                         int                 y __UNUSED__,
1416                         int                 width __UNUSED__,
1417                         int                 height __UNUSED__)
1418 {
1419    return NULL;
1420 }
1421
1422 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1423
1424
1425 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1426
1427 EAPI Ecore_Evas *
1428 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
1429                        int                 x,
1430                        int                 y,
1431                        int                 width,
1432                        int                 height)
1433 {
1434    return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
1435                                          parent,
1436                                          x,
1437                                          y,
1438                                          width,
1439                                          height);
1440 }
1441
1442 #else
1443
1444 EAPI Ecore_Evas *
1445 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent __UNUSED__,
1446                        int                 x __UNUSED__,
1447                        int                 y __UNUSED__,
1448                        int                 width __UNUSED__,
1449                        int                 height __UNUSED__)
1450 {
1451    return NULL;
1452 }
1453
1454 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1455
1456
1457 #ifdef BUILD_ECORE_EVAS_WIN32
1458
1459 EAPI Ecore_Win32_Window *
1460 ecore_evas_win32_window_get(const Ecore_Evas *ee)
1461 {
1462    return (Ecore_Win32_Window *) ecore_evas_window_get(ee);
1463 }
1464
1465 #else
1466
1467 EAPI Ecore_Win32_Window *
1468 ecore_evas_win32_window_get(const Ecore_Evas *ee __UNUSED__)
1469 {
1470    return NULL;
1471 }
1472
1473 #endif /* BUILD_ECORE_EVAS_WIN32 */