b68c524d2a43f7b138107359757c0b6c91a460af
[framework/uifw/ecore.git] / src / lib / ecore_evas / ecore_evas_win32.c
1 /*
2  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
3  */
4
5 #ifdef HAVE_CONFIG_H
6 # include "config.h"
7 #endif
8
9 #include <stdlib.h> /* for NULL */
10
11 #include "Ecore.h"
12 #include "ecore_private.h"
13 #ifdef BUILD_ECORE_EVAS_WIN32
14 # include "Ecore_Win32.h"
15 # include "ecore_win32_private.h"
16 #endif /* BUILD_ECORE_EVAS_WIN32 */
17
18 #include "ecore_evas_private.h"
19 #include "Ecore_Evas.h"
20
21
22 #ifdef BUILD_ECORE_EVAS_WIN32
23
24 #define ECORE_EVAS_EVENT_COUNT 14
25
26 static int _ecore_evas_init_count = 0;
27 static int _ecore_evas_fps_debug  = 0;
28
29 static Ecore_Event_Handler *ecore_evas_event_handlers[ECORE_EVAS_EVENT_COUNT];
30 static Ecore_Idle_Enterer  *ecore_evas_idle_enterer = NULL;
31 static Ecore_Evas          *ecore_evases = NULL;
32 static Evas_Hash           *ecore_evases_hash = NULL;
33
34 static int _ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event);
35
36 static int _ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event);
37
38 static int _ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event);
39
40 static int _ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event);
41
42 static int _ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event);
43
44 static int _ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event);
45
46 static int _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
47
48 static int _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
49
50 static int _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
51
52 static int _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
53
54 static int _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
55
56 static int _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
57
58 static int _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
59
60 static int _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
61
62 /* Private functions */
63
64 static void
65 _ecore_evas_win32_render(Ecore_Evas *ee)
66 {
67 #ifdef BUILD_ECORE_EVAS_BUFFER
68    Evas_List *ll;
69 #endif
70
71 #ifdef BUILD_ECORE_EVAS_BUFFER
72    for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
73      {
74         Ecore_Evas *ee2;
75
76         ee2 = ll->data;
77         if (ee2->func.fn_pre_render) ee2->func.fn_pre_render(ee2);
78         _ecore_evas_buffer_render(ee2);
79         if (ee2->func.fn_post_render) ee2->func.fn_post_render(ee2);
80      }
81 #endif
82    if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
83    if (ee->prop.avoid_damage)
84      {
85         Evas_List *updates;
86
87         updates = evas_render_updates(ee->evas);
88         if (updates) evas_render_updates_free(updates);
89      }
90    else if ((ee->visible) ||
91             ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
92             ((ee->should_be_visible) && (ee->prop.override)))
93      {
94         if (ee->shaped)
95           {
96              Evas_List *updates;
97
98              updates = evas_render_updates(ee->evas);
99              if (updates) evas_render_updates_free(updates);
100           }
101         else
102           {
103              Evas_List *updates;
104
105              updates = evas_render_updates(ee->evas);
106              if (updates) evas_render_updates_free(updates);
107           }
108      }
109    else
110      evas_norender(ee->evas);
111    if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
112 }
113
114 static int
115 _ecore_evas_win32_idle_enter(void *data __UNUSED__)
116 {
117    Ecore_List2 *l;
118    double       t1 = 0.0;
119    double       t2 = 0.0;
120
121    if (_ecore_evas_fps_debug)
122      {
123         t1 = ecore_time_get();
124      }
125    for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
126      {
127         Ecore_Evas *ee;
128
129         ee = (Ecore_Evas *)l;
130         _ecore_evas_win32_render(ee);
131      }
132 /*    ecore_x_flush(); */
133    if (_ecore_evas_fps_debug)
134      {
135         t2 = ecore_time_get();
136 /*      _ecore_evas_fps_debug_rendertime_add(t2 - t1); */
137      }
138    return 1;
139 }
140
141 static int
142 _ecore_evas_win32_init(void)
143 {
144    _ecore_evas_init_count++;
145    if (_ecore_evas_init_count > 1)
146      return _ecore_evas_init_count;
147
148    if (getenv("ECORE_EVAS_FPS_DEBUG"))
149      _ecore_evas_fps_debug = 1;
150
151    ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_win32_idle_enter, NULL);
152
153    ecore_evas_event_handlers[0]  = ecore_event_handler_add(ECORE_WIN32_EVENT_KEY_DOWN, _ecore_evas_win32_event_key_down, NULL);
154    ecore_evas_event_handlers[1]  = ecore_event_handler_add(ECORE_WIN32_EVENT_KEY_UP, _ecore_evas_win32_event_key_up, NULL);
155    ecore_evas_event_handlers[2]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_DOWN, _ecore_evas_win32_event_mouse_button_down, NULL);
156    ecore_evas_event_handlers[3]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_BUTTON_UP, _ecore_evas_win32_event_mouse_button_up, NULL);
157    ecore_evas_event_handlers[4]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_WHEEL, _ecore_evas_win32_event_mouse_wheel, NULL);
158    ecore_evas_event_handlers[5]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_MOVE, _ecore_evas_win32_event_mouse_move, NULL);
159    ecore_evas_event_handlers[6]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_IN, _ecore_evas_win32_event_mouse_in, NULL);
160    ecore_evas_event_handlers[7]  = ecore_event_handler_add(ECORE_WIN32_EVENT_MOUSE_OUT, _ecore_evas_win32_event_mouse_out, NULL);
161    ecore_evas_event_handlers[8]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DAMAGE, _ecore_evas_win32_event_window_damage, NULL);
162    ecore_evas_event_handlers[9]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DESTROY, _ecore_evas_win32_event_window_destroy, NULL);
163    ecore_evas_event_handlers[10]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_SHOW, _ecore_evas_win32_event_window_show, NULL);
164    ecore_evas_event_handlers[11]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_HIDE, _ecore_evas_win32_event_window_hide, NULL);
165    ecore_evas_event_handlers[12]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_CONFIGURE, _ecore_evas_win32_event_window_configure, NULL);
166    ecore_evas_event_handlers[13]  = ecore_event_handler_add(ECORE_WIN32_EVENT_WINDOW_DELETE_REQUEST, _ecore_evas_win32_event_window_delete_request, NULL);
167
168    return _ecore_evas_init_count;
169 }
170
171 int
172 _ecore_evas_win32_shutdown(void)
173 {
174    _ecore_evas_init_count--;
175    if (_ecore_evas_init_count == 0)
176      {
177         int i;
178
179         while (ecore_evases) _ecore_evas_free(ecore_evases);
180         for (i = 0; i < ECORE_EVAS_EVENT_COUNT; i++)
181           ecore_event_handler_del(ecore_evas_event_handlers[i]);
182         ecore_idle_enterer_del(ecore_evas_idle_enterer);
183         ecore_evas_idle_enterer = NULL;
184      }
185
186    if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
187
188    return _ecore_evas_init_count;
189 }
190
191 static char *
192 _ecore_evas_win32_winid_str_get(Ecore_Win32_Window *window)
193 {
194    static char  id[9];
195    const char  *vals = "qWeRtYuIoP5-$&<~";
196    unsigned int val;
197
198    val = (unsigned int)window;
199    id[0] = vals[(val >> 28) & 0xf];
200    id[1] = vals[(val >> 24) & 0xf];
201    id[2] = vals[(val >> 20) & 0xf];
202    id[3] = vals[(val >> 16) & 0xf];
203    id[4] = vals[(val >> 12) & 0xf];
204    id[5] = vals[(val >>  8) & 0xf];
205    id[6] = vals[(val >>  4) & 0xf];
206    id[7] = vals[(val      ) & 0xf];
207    id[8] = 0;
208
209    return id;
210 }
211
212 static Ecore_Evas *
213 _ecore_evas_win32_match(Ecore_Win32_Window *window)
214 {
215    Ecore_Evas *ee;
216
217    ee = evas_hash_find(ecore_evases_hash, _ecore_evas_win32_winid_str_get(window));
218
219    return ee;
220 }
221
222 static int
223 _ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
224 {
225    Ecore_Evas                 *ee;
226    Ecore_Win32_Event_Key_Down *e;
227
228    e = event;
229    ee = _ecore_evas_win32_match(e->window);
230    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
231    /* FIXME to do */
232 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
233    evas_event_feed_key_down(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
234
235    return 1;
236 }
237
238 static int
239 _ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
240 {
241    Ecore_Evas               *ee;
242    Ecore_Win32_Event_Key_Up *e;
243
244    e = event;
245    ee = _ecore_evas_win32_match(e->window);
246    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
247    /* FIXME to do */
248 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
249    evas_event_feed_key_up(ee->evas, e->keyname, e->keysymbol, e->keycompose, NULL, e->time, NULL);
250
251    return 1;
252 }
253
254 static int
255 _ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
256 {
257    Ecore_Evas                          *ee;
258    Ecore_Win32_Event_Mouse_Button_Down *e;
259    Evas_Button_Flags                    flags = EVAS_BUTTON_NONE;
260
261    e = event;
262    ee = _ecore_evas_win32_match(e->window);
263    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
264    if (e->window != ee->engine.win32.window) return 1;
265    /* FIXME to do */
266 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
267    if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
268    if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
269    evas_event_feed_mouse_down(ee->evas, e->button, flags, e->time, NULL);
270
271    printf (" * ee event button down %f %d %d\n", e->time, e->x, e->y);
272
273    return 1;
274 }
275
276 static int
277 _ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
278 {
279    Ecore_Evas                        *ee;
280    Ecore_Win32_Event_Mouse_Button_Up *e;
281    Evas_Button_Flags                  flags = EVAS_BUTTON_NONE;
282
283    printf (" * ee event button up 0 \n");
284    e = event;
285    ee = _ecore_evas_win32_match(e->window);
286    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
287    if (e->window != ee->engine.win32.window) return 1;
288    /* FIXME to do */
289 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
290    if (e->double_click) flags |= EVAS_BUTTON_DOUBLE_CLICK;
291    if (e->triple_click) flags |= EVAS_BUTTON_TRIPLE_CLICK;
292    evas_event_feed_mouse_up(ee->evas, e->button, flags, e->time, NULL);
293
294    printf (" * ee event button up\n");
295
296    return 1;
297 }
298
299 static int
300 _ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
301 {
302    Ecore_Evas                    *ee;
303    Ecore_Win32_Event_Mouse_Wheel *e;
304
305    e = event;
306    ee = _ecore_evas_win32_match(e->window);
307    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
308    if (e->window != ee->engine.win32.window) return 1;
309    /* FIXME to do */
310 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
311    evas_event_feed_mouse_wheel(ee->evas, e->direction, e->z, e->time, NULL);
312
313    return 1;
314 }
315
316 static void
317 _ecore_evas_win32_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
318 {
319    ee->mouse.x = x;
320    ee->mouse.y = y;
321    if (ee->prop.cursor.object)
322      {
323         evas_object_show(ee->prop.cursor.object);
324         if (ee->rotation == 0)
325           evas_object_move(ee->prop.cursor.object,
326                            x - ee->prop.cursor.hot.x,
327                            y - ee->prop.cursor.hot.y);
328         else if (ee->rotation == 90)
329           evas_object_move(ee->prop.cursor.object,
330                            ee->h - y - 1 - ee->prop.cursor.hot.x,
331                            x - ee->prop.cursor.hot.y);
332         else if (ee->rotation == 180)
333           evas_object_move(ee->prop.cursor.object,
334                            ee->w - x - 1 - ee->prop.cursor.hot.x,
335                            ee->h - y - 1 - ee->prop.cursor.hot.y);
336         else if (ee->rotation == 270)
337           evas_object_move(ee->prop.cursor.object,
338                            y - ee->prop.cursor.hot.x,
339                            ee->w - x - 1 - ee->prop.cursor.hot.y);
340      }
341    if (ee->rotation == 0)
342      evas_event_feed_mouse_move(ee->evas, x, y, timestamp, NULL);
343    else if (ee->rotation == 90)
344      evas_event_feed_mouse_move(ee->evas, ee->h - y - 1, x, timestamp, NULL);
345    else if (ee->rotation == 180)
346      evas_event_feed_mouse_move(ee->evas, ee->w - x - 1, ee->h - y - 1, timestamp, NULL);
347    else if (ee->rotation == 270)
348      evas_event_feed_mouse_move(ee->evas, y, ee->w - x - 1, timestamp, NULL);
349 }
350
351 static int
352 _ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
353 {
354    Ecore_Evas                   *ee;
355    Ecore_Win32_Event_Mouse_Move *e;
356
357    e = event;
358    ee = _ecore_evas_win32_match(e->window);
359    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
360    if (e->window != ee->engine.win32.window) return 1;
361    /* FIXME to do */
362 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
363    _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
364
365    return 1;
366 }
367
368 static int
369 _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
370 {
371    Ecore_Evas                 *ee;
372    Ecore_Win32_Event_Mouse_In *e;
373
374    e = event;
375    ee = _ecore_evas_win32_match(e->window);
376    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
377    if (e->window != ee->engine.win32.window) return 1;
378
379    if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
380    /* FIXME to do */
381 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
382    evas_event_feed_mouse_in(ee->evas, e->time, NULL);
383    _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
384
385    return 1;
386 }
387
388 static int
389 _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
390 {
391    Ecore_Evas                  *ee;
392    Ecore_Win32_Event_Mouse_Out *e;
393
394    e = event;
395    ee = _ecore_evas_win32_match(e->window);
396    if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
397    if (e->window != ee->engine.win32.window) return 1;
398
399    /* FIXME to do */
400 /*    _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
401    _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
402
403    evas_event_feed_mouse_out(ee->evas, e->time, NULL);
404    if (ee->func.fn_mouse_out) ee->func.fn_mouse_out(ee);
405    if (ee->prop.cursor.object) evas_object_hide(ee->prop.cursor.object);
406
407    return 1;
408 }
409
410 static int
411 _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
412 {
413    Ecore_Evas                      *ee;
414    Ecore_Win32_Event_Window_Damage *e;
415
416    e = event;
417    ee = _ecore_evas_win32_match(e->window);
418    if (!ee) return 1; /* pass on event */
419    if (e->window != ee->engine.win32.window) return 1;
420
421    if (ee->prop.avoid_damage)
422      {
423 #ifdef _MSC_VER
424 # pragma message ("[ECORE] [WIN32] No Region code")
425 #else
426 # warning [ECORE] [WIN32] No Region code
427 #endif /* ! _MSC_VER */
428      }
429    else
430      {
431        printf (" * ee window event damage\n");
432         if (ee->rotation == 0)
433           evas_damage_rectangle_add(ee->evas,
434                                     e->x,
435                                     e->y,
436                                     e->width,
437                                     e->height);
438         else if (ee->rotation == 90)
439           evas_damage_rectangle_add(ee->evas,
440                                     ee->h - e->y - e->height,
441                                     e->x,
442                                     e->height,
443                                     e->width);
444         else if (ee->rotation == 180)
445           evas_damage_rectangle_add(ee->evas,
446                                     ee->w - e->x - e->width,
447                                     ee->h - e->y - e->height,
448                                     e->width,
449                                     e->height);
450         else if (ee->rotation == 270)
451           evas_damage_rectangle_add(ee->evas,
452                                     e->y,
453                                     ee->w - e->x - e->width,
454                                     e->height,
455                                     e->width);
456      }
457
458    return 1;
459 }
460
461 static int
462 _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
463 {
464    Ecore_Evas                       *ee;
465    Ecore_Win32_Event_Window_Destroy *e;
466
467    e = event;
468    ee = _ecore_evas_win32_match(e->window);
469    if (!ee) return 1; /* pass on event */
470    if (e->window != ee->engine.win32.window) return 1;
471    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
472    ecore_evas_free(ee);
473
474    printf (" * ee event destroy\n");
475    return 1;
476 }
477
478 static int
479 _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
480 {
481    Ecore_Evas                    *ee;
482    Ecore_Win32_Event_Window_Show *e;
483
484    printf (" * ee window event show\n");
485    e = event;
486    ee = _ecore_evas_win32_match(e->window);
487    if (!ee) return 1; /* pass on event */
488    if (e->window != ee->engine.win32.window) return 1;
489    if (ee->visible) return 0; /* dont pass it on */
490    ee->visible = 1;
491    if (ee->func.fn_show) ee->func.fn_show(ee);
492
493    return 1;
494 }
495
496 static int
497 _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
498 {
499    Ecore_Evas                    *ee;
500    Ecore_Win32_Event_Window_Hide *e;
501
502    e = event;
503    ee = _ecore_evas_win32_match(e->window);
504    if (!ee) return 1; /* pass on event */
505    if (e->window != ee->engine.win32.window) return 1;
506    if (!ee->visible) return 0; /* dont pass it on */
507    ee->visible = 0;
508    if (ee->func.fn_hide) ee->func.fn_hide(ee);
509
510    return 1;
511 }
512
513 static int
514 _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
515 {
516    Ecore_Evas                         *ee;
517    Ecore_Win32_Event_Window_Configure *e;
518
519    e = event;
520    ee = _ecore_evas_win32_match(e->window);
521    if (!ee) return 1; /* pass on event */
522    if (e->window != ee->engine.win32.window) return 1;
523
524    if ((ee->x != e->x) || (ee->y != e->y))
525      {
526         ee->x = e->x;
527         ee->y = e->y;
528         if (ee->func.fn_move) ee->func.fn_move(ee);
529      }
530
531    if ((ee->w != e->width) || (ee->h != e->height))
532      {
533        printf (" * ee resize : 1\n");
534         ee->w = e->width;
535         ee->h = e->height;
536         if ((ee->rotation == 90) || (ee->rotation == 270))
537           {
538              evas_output_size_set(ee->evas, ee->h, ee->w);
539              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
540           }
541         else
542           {
543             printf (" * ee resize : 2\n");
544              evas_output_size_set(ee->evas, ee->w, ee->h);
545              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
546           }
547         if (ee->prop.avoid_damage)
548           {
549              ecore_evas_avoid_damage_set(ee, 0);
550              ecore_evas_avoid_damage_set(ee, 1);
551           }
552         /* FIXME: to do... */
553 /*      if (ee->shaped) */
554 /*        _ecore_evas_x_resize_shape(ee); */
555         if ((ee->expecting_resize.w > 0) &&
556             (ee->expecting_resize.h > 0))
557           {
558             printf (" * ee resize : 3\n");
559              if ((ee->expecting_resize.w == ee->w) &&
560                  (ee->expecting_resize.h == ee->h))
561                _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
562                                                     ecore_win32_current_time_get());
563              ee->expecting_resize.w = 0;
564              ee->expecting_resize.h = 0;
565           }
566         printf (" * ee resize : 4\n");
567         if (ee->func.fn_resize) ee->func.fn_resize(ee);
568      }
569
570    return 1;
571 }
572
573 static int
574 _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
575 {
576    Ecore_Evas                              *ee;
577    Ecore_Win32_Event_Window_Delete_Request *e;
578
579    e = event;
580    ee = _ecore_evas_win32_match(e->window);
581    if (!ee) return 1; /* pass on event */
582    if (e->window != ee->engine.win32.window) return 1;
583    if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee);
584
585    printf (" * ee event delete\n");
586    return 1;
587 }
588
589
590 /* Ecore_Evas interface */
591
592 static void
593 _ecore_evas_win32_free(Ecore_Evas *ee)
594 {
595    ecore_win32_window_del(ee->engine.win32.window);
596    ecore_evases_hash = evas_hash_del(ecore_evases_hash, _ecore_evas_win32_winid_str_get(ee->engine.win32.window), ee);
597    ecore_evases = _ecore_list2_remove(ecore_evases, ee);
598    _ecore_evas_win32_shutdown();
599    ecore_win32_shutdown();
600 }
601
602 static void
603 _ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
604                                               void (*func) (Ecore_Evas *ee))
605 {
606    ee->func.fn_delete_request = func;
607 }
608
609 static void
610 _ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
611 {
612    if ((x != ee->x) || (y != ee->y))
613      {
614         ee->x = x;
615         ee->y = y;
616         ecore_win32_window_move(ee->engine.win32.window, x, y);
617         if (ee->func.fn_move) ee->func.fn_move(ee);
618      }
619 }
620
621 static void
622 _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
623 {
624   printf (" * _ecore_evas_win32_resize %d %d\n", width, height);
625    if ((ee->w != width) || (ee->h != height))
626      {
627         ee->w = width;
628         ee->h = height;
629         ecore_win32_window_resize(ee->engine.win32.window, width, height);
630         if ((ee->rotation == 90) || (ee->rotation == 270))
631           {
632              evas_output_size_set(ee->evas, ee->h, ee->w);
633              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
634           }
635         else
636           {
637              evas_output_size_set(ee->evas, ee->w, ee->h);
638              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
639           }
640         /* FIXME: damage and shape */
641
642         if (ee->func.fn_resize) ee->func.fn_resize(ee);
643      }
644 }
645
646 static void
647 _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
648 {
649   printf (" * _ecore_evas_win32_resize\n");
650    if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
651      {
652         int change_size = 0;
653         int change_pos = 0;
654
655         if ((ee->w != width) || (ee->h != height)) change_size = 1;
656         if ((x != ee->x) || (y != ee->y)) change_pos = 1;
657
658         ee->x = x;
659         ee->y = y;
660         ee->w = width;
661         ee->h = height;
662         ecore_win32_window_move_resize(ee->engine.win32.window, x, y, width, height);
663         if ((ee->rotation == 90) || (ee->rotation == 270))
664           {
665              evas_output_size_set(ee->evas, ee->h, ee->w);
666              evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
667           }
668         else
669           {
670              evas_output_size_set(ee->evas, ee->w, ee->h);
671              evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
672           }
673         /* FIXME: damage and shape */
674         if (change_pos)
675           {
676              if (ee->func.fn_move) ee->func.fn_move(ee);
677           }
678         if (change_size)
679           {
680              if (ee->func.fn_resize) ee->func.fn_resize(ee);
681           }
682      }
683 }
684
685 static void
686 _ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation)
687 {
688    int rot_dif;
689
690    if (ee->rotation == rotation) return;
691    rot_dif = ee->rotation - rotation;
692    if (rot_dif < 0) rot_dif = -rot_dif;
693
694    if (!strcmp(ee->driver, "software_ddraw"))
695      {
696 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
697         Evas_Engine_Info_Software_DDraw *einfo;
698
699         einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
700         if (!einfo) return;
701         if (rot_dif != 180)
702           {
703              int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
704
705              einfo->info.rotation = rotation;
706              evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
707              if (!ee->prop.fullscreen)
708                {
709                   ecore_win32_window_resize(ee->engine.win32.window, ee->h, ee->w);
710                   ee->expecting_resize.w = ee->h;
711                   ee->expecting_resize.h = ee->w;
712                }
713              else
714                {
715                   int w, h;
716
717                   ecore_win32_window_size_get(ee->engine.win32.window, &w, &h);
718                   ecore_win32_window_resize(ee->engine.win32.window, h, w);
719                   if ((rotation == 0) || (rotation == 180))
720                     {
721                        evas_output_size_set(ee->evas, ee->w, ee->h);
722                        evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
723                     }
724                   else
725                     {
726                        evas_output_size_set(ee->evas, ee->h, ee->w);
727                        evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
728                     }
729                   if (ee->func.fn_resize) ee->func.fn_resize(ee);
730                }
731              ecore_evas_size_min_get(ee, &minw, &minh);
732              ecore_evas_size_max_get(ee, &maxw, &maxh);
733              ecore_evas_size_base_get(ee, &basew, &baseh);
734              ecore_evas_size_step_get(ee, &stepw, &steph);
735              ee->rotation = rotation;
736              ecore_evas_size_min_set(ee, minh, minw);
737              ecore_evas_size_max_set(ee, maxh, maxw);
738              ecore_evas_size_base_set(ee, baseh, basew);
739              ecore_evas_size_step_set(ee, steph, stepw);
740              _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
741                                                   ecore_win32_current_time_get());
742           }
743         else
744           {
745              einfo->info.rotation = rotation;
746              evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
747              ee->rotation = rotation;
748              _ecore_evas_win32_mouse_move_process(ee, ee->mouse.x, ee->mouse.y,
749                                                   ecore_win32_current_time_get());
750              if (ee->func.fn_resize) ee->func.fn_resize(ee);
751           }
752         if ((ee->rotation == 90) || (ee->rotation == 270))
753           evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
754         else
755           evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
756 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
757      }
758 }
759
760 static void
761 _ecore_evas_win32_show(Ecore_Evas *ee)
762 {
763   printf (" * ee window show\n");
764    ee->should_be_visible = 1;
765    if (ee->prop.avoid_damage)
766      _ecore_evas_win32_render(ee);
767    ecore_win32_window_show(ee->engine.win32.window);
768 /*    if (ee->prop.fullscreen) */
769 /*      ecore_win32_window_focus(ee->engine.win32.window); */
770 }
771
772 static void
773 _ecore_evas_win32_hide(Ecore_Evas *ee)
774 {
775    ecore_win32_window_hide(ee->engine.win32.window);
776    ee->should_be_visible = 0;
777 }
778
779 static void
780 _ecore_evas_win32_raise(Ecore_Evas *ee)
781 {
782    if (!ee->prop.fullscreen)
783      ecore_win32_window_raise(ee->engine.win32.window);
784    else
785      ecore_win32_window_raise(ee->engine.win32.window);
786 }
787
788 static void
789 _ecore_evas_win32_lower(Ecore_Evas *ee)
790 {
791    if (!ee->prop.fullscreen)
792      ecore_win32_window_lower(ee->engine.win32.window);
793    else
794      ecore_win32_window_lower(ee->engine.win32.window);
795 }
796
797 static void
798 _ecore_evas_win32_activate(Ecore_Evas *ee)
799 {
800    ecore_win32_window_focus_set(ee->engine.win32.window);
801 }
802
803 static void
804 _ecore_evas_win32_title_set(Ecore_Evas *ee, const char *title)
805 {
806    if (ee->prop.title) free(ee->prop.title);
807    ee->prop.title = NULL;
808    if (title) ee->prop.title = strdup(title);
809    ecore_win32_window_title_set(ee->engine.win32.window, ee->prop.title);
810 }
811
812 static void
813 _ecore_evas_win32_size_min_set(Ecore_Evas *ee, int width, int height)
814 {
815    if (width < 0) width = 0;
816    if (height < 0) height = 0;
817    if ((ee->prop.min.w == width) && (ee->prop.min.h == height)) return;
818    ee->prop.min.w = width;
819    ee->prop.min.h = height;
820    ecore_win32_window_size_min_set(ee->engine.win32.window, width, height);
821 }
822
823 static void
824 _ecore_evas_win32_size_max_set(Ecore_Evas *ee, int width, int height)
825 {
826    if (width < 0) width = 0;
827    if (height < 0) height = 0;
828    if ((ee->prop.max.w == width) && (ee->prop.max.h == height)) return;
829    ee->prop.max.w = width;
830    ee->prop.max.h = height;
831    ecore_win32_window_size_max_set(ee->engine.win32.window, width, height);
832 }
833
834 static void
835 _ecore_evas_win32_size_base_set(Ecore_Evas *ee, int width, int height)
836 {
837    if (width < 0) width = 0;
838    if (height < 0) height = 0;
839    if ((ee->prop.base.w == width) && (ee->prop.base.h == height)) return;
840    ee->prop.base.w = width;
841    ee->prop.base.h = height;
842    ecore_win32_window_size_base_set(ee->engine.win32.window, width, height);
843 }
844
845 static void
846 _ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
847 {
848    if (width < 1) width = 1;
849    if (height < 1) height = 1;
850    if ((ee->prop.step.w == width) && (ee->prop.step.h == height)) return;
851    ee->prop.step.w = width;
852    ee->prop.step.h = height;
853    ecore_win32_window_size_step_set(ee->engine.win32.window, width, height);
854 }
855
856 static void
857 _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
858 {
859 #if 0
860    int x, y;
861
862    if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
863
864    if (obj == NULL)
865      {
866         ee->prop.cursor.object = NULL;
867         ee->prop.cursor.layer = 0;
868         ee->prop.cursor.hot.x = 0;
869         ee->prop.cursor.hot.y = 0;
870         ecore_win32_window_cursor_show(ee->engine.win32.window, 1);
871         return;
872      }
873
874    ee->prop.cursor.object = obj;
875    ee->prop.cursor.layer = layer;
876    ee->prop.cursor.hot.x = hot_x;
877    ee->prop.cursor.hot.y = hot_y;
878
879    ecore_win32_window_cursor_show(ee->engine.win32.window, 0);
880
881    evas_pointer_output_xy_get(ee->evas, &x, &y);
882    evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer);
883    evas_object_move(ee->prop.cursor.object,
884                     x - ee->prop.cursor.hot.x,
885                     y - ee->prop.cursor.hot.y);
886    evas_object_pass_events_set(ee->prop.cursor.object, 1);
887    if (evas_pointer_inside_get(ee->evas))
888      evas_object_show(ee->prop.cursor.object);
889 #endif
890 }
891
892 static void
893 _ecore_evas_win32_focus_set(Ecore_Evas *ee, int on __UNUSED__)
894 {
895    ecore_win32_window_focus_set(ee->engine.win32.window);
896 }
897
898 static void
899 _ecore_evas_win32_iconified_set(Ecore_Evas *ee, int on)
900 {
901 /*    if (((ee->prop.borderless) && (on)) || */
902 /*        ((!ee->prop.borderless) && (!on))) return; */
903    ee->prop.iconified = on;
904    ecore_win32_window_iconified_set(ee->engine.win32.window, ee->prop.iconified);
905 }
906
907 static void
908 _ecore_evas_win32_borderless_set(Ecore_Evas *ee, int on)
909 {
910    if (((ee->prop.borderless) && (on)) ||
911        ((!ee->prop.borderless) && (!on))) return;
912    ee->prop.borderless = on;
913    ecore_win32_window_borderless_set(ee->engine.win32.window, ee->prop.borderless);
914 }
915
916 static void
917 _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
918 {
919    if ((ee->prop.fullscreen && on) ||
920       (!ee->prop.fullscreen && !on)) return;
921
922    ee->engine.win32.state.fullscreen = on;
923    ecore_win32_window_fullscreen_set(ee->engine.win32.window, ee->prop.borderless);
924    /* FIXME: what to do with that code ?? */
925 /*    if (ee->should_be_visible) */
926 /*      ecore_x_netwm_state_request_send(ee->engine.x.win, ee->engine.x.win_root, */
927 /*                                    ECORE_X_WINDOW_STATE_FULLSCREEN, -1, on); */
928 /*    else */
929 /*      _ecore_evas_win32_state_update(ee); */
930 }
931
932 #endif /* BUILD_ECORE_EVAS_WIN32 */
933
934 static void *
935 _ecore_evas_win32_window_get(Ecore_Evas *ee)
936 {
937 #ifdef BUILD_ECORE_EVAS_WIN32
938    return ee->engine.win32.window;
939 #else
940    return NULL;
941 #endif /* BUILD_ECORE_EVAS_WIN32 */
942 }
943
944 #ifdef BUILD_ECORE_EVAS_WIN32
945 static const Ecore_Evas_Engine_Func _ecore_win32_engine_func =
946 {
947    _ecore_evas_win32_free,
948      NULL,
949      NULL,
950      NULL,
951      NULL,
952      _ecore_evas_win32_callback_delete_request_set,
953      NULL,
954      NULL,
955      NULL,
956      NULL,
957      NULL,
958      NULL,
959      NULL,
960      NULL,
961      NULL,
962      _ecore_evas_win32_move,
963      NULL,
964      _ecore_evas_win32_resize,
965      _ecore_evas_win32_move_resize,
966      _ecore_evas_win32_rotation_set,
967      NULL, /* _ecore_evas_x_shaped_set */
968      _ecore_evas_win32_show,
969      _ecore_evas_win32_hide,
970      _ecore_evas_win32_raise,
971      _ecore_evas_win32_lower,
972      _ecore_evas_win32_activate,
973      _ecore_evas_win32_title_set,
974      NULL, /* _ecore_evas_x_name_class_set */
975      _ecore_evas_win32_size_min_set,
976      _ecore_evas_win32_size_max_set,
977      _ecore_evas_win32_size_base_set,
978      _ecore_evas_win32_size_step_set,
979      _ecore_evas_win32_cursor_set,
980      NULL, /* _ecore_evas_x_layer_set */
981      _ecore_evas_win32_focus_set,
982      _ecore_evas_win32_iconified_set,
983      _ecore_evas_win32_borderless_set,
984      NULL, /* _ecore_evas_x_override_set */
985      NULL,
986      _ecore_evas_win32_fullscreen_set,
987      NULL, /* _ecore_evas_x_avoid_damage_set */
988      NULL, /* _ecore_evas_x_withdrawn_set */
989      NULL, /* _ecore_evas_x_sticky_set */
990      NULL, /* _ecore_evas_x_ignore_events_set */
991      NULL, /* _ecore_evas_x_alpha_set */
992      _ecore_evas_win32_window_get
993 };
994
995 #endif /* BUILD_ECORE_EVAS_WIN32 */
996
997 /* API */
998
999 static int
1000 _ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
1001 {
1002 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1003    Evas_Engine_Info_Software_DDraw *einfo;
1004    const char                      *driver;
1005    int                              rmethod;
1006
1007    driver = "software_ddraw";
1008
1009    rmethod = evas_render_method_lookup(driver);
1010    if (!rmethod)
1011      return 0;
1012
1013    ee->driver = driver;
1014    evas_output_method_set(ee->evas, rmethod);
1015
1016    einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
1017    if (einfo)
1018      {
1019         /* FIXME: REDRAW_DEBUG missing for now */
1020         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
1021         einfo->info.depth = ecore_win32_screen_depth_get();
1022         einfo->info.rotation = 0;
1023         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1024      }
1025
1026    return 1;
1027 #else
1028    return 0;
1029 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1030 }
1031
1032 static int
1033 _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
1034 {
1035 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1036    Evas_Engine_Info_Direct3D *einfo;
1037    const char                *driver;
1038    int                        rmethod;
1039
1040    driver = "direct3d";
1041
1042    rmethod = evas_render_method_lookup(driver);
1043    if (!rmethod)
1044      return 0;
1045
1046    ee->driver = driver;
1047    evas_output_method_set(ee->evas, rmethod);
1048
1049    einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ee->evas);
1050    if (einfo)
1051      {
1052         /* FIXME: REDRAW_DEBUG missing for now */
1053         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
1054         einfo->info.depth = ecore_win32_screen_depth_get();
1055         einfo->info.rotation = 0;
1056         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1057      }
1058
1059    return 1;
1060 #else
1061    return 0;
1062 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1063 }
1064
1065 static int
1066 _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
1067 {
1068 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1069    Evas_Engine_Info_GL_Glew *einfo;
1070    const char               *driver;
1071    int                       rmethod;
1072
1073    driver = "gl_glew";
1074
1075    rmethod = evas_render_method_lookup(driver);
1076    if (!rmethod)
1077      return 0;
1078
1079    ee->driver = driver;
1080    evas_output_method_set(ee->evas, rmethod);
1081
1082    einfo = (Evas_Engine_Info_GL_Glew *)evas_engine_info_get(ee->evas);
1083    if (einfo)
1084      {
1085         /* FIXME: REDRAW_DEBUG missing for now */
1086         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
1087         einfo->info.depth = ecore_win32_screen_depth_get();
1088         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1089      }
1090
1091    return 1;
1092 #else
1093    return 0;
1094 #endif /* ! BUILD_ECORE_EVAS_OPENGL_GLEW */
1095 }
1096
1097 static int
1098 _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
1099 {
1100 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
1101    Evas_Engine_Info_Software_DDraw *einfo;
1102    const char                      *driver;
1103    int                              rmethod;
1104
1105    driver = "software_16_ddraw";
1106
1107    rmethod = evas_render_method_lookup(driver);
1108    if (!rmethod)
1109      return 0;
1110
1111    ee->driver = driver;
1112    evas_output_method_set(ee->evas, rmethod);
1113
1114    if (ecore_win32_screen_depth_get() != 16)
1115      return 0;
1116
1117    einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(ee->evas);
1118    if (einfo)
1119      {
1120         /* FIXME: REDRAW_DEBUG missing for now */
1121         einfo->info.window = ((struct _Ecore_Win32_Window *)ee->engine.win32.window)->window;
1122         einfo->info.depth = ecore_win32_screen_depth_get();
1123         einfo->info.rotation = 0;
1124         evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
1125      }
1126 #else
1127    return 0;
1128 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
1129 }
1130
1131 static Ecore_Evas *
1132 _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
1133                                Ecore_Win32_Window *parent,
1134                                int                 x,
1135                                int                 y,
1136                                int                 width,
1137                                int                 height)
1138 {
1139 #ifdef BUILD_ECORE_EVAS_WIN32
1140    Ecore_Evas *ee;
1141
1142    if (!ecore_win32_init())
1143      return NULL;
1144
1145    ee = calloc(1, sizeof(Ecore_Evas));
1146    if (!ee)
1147      return NULL;
1148
1149    ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1150
1151    _ecore_evas_win32_init();
1152
1153    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
1154
1155    if (width < 1) width = 1;
1156    if (height < 1) height = 1;
1157    ee->x = x;
1158    ee->y = y;
1159    ee->w = width;
1160    ee->h = height;
1161
1162    ee->prop.max.w = 32767;
1163    ee->prop.max.h = 32767;
1164    ee->prop.layer = 4;
1165    ee->prop.request_pos = 0;
1166    ee->prop.sticky = 0;
1167    /* FIXME: sticky to add */
1168
1169    /* init evas here */
1170    ee->evas = evas_new();
1171    evas_data_attach_set(ee->evas, ee);
1172    evas_output_size_set(ee->evas, width, height);
1173    evas_output_viewport_set(ee->evas, 0, 0, width, height);
1174
1175    ee->engine.win32.parent = parent;
1176    ee->engine.win32.window = ecore_win32_window_new(parent, x, y, width, height);
1177    if (!ee->engine.win32.window)
1178      {
1179         _ecore_evas_win32_shutdown();
1180         free(ee);
1181         return NULL;
1182      }
1183
1184    if (!_ecore_evas_engine_init(ee))
1185      {
1186         _ecore_evas_win32_shutdown();
1187         free(ee);
1188         return NULL;
1189      }
1190
1191    evas_key_modifier_add(ee->evas, "Shift");
1192    evas_key_modifier_add(ee->evas, "Control");
1193    evas_key_modifier_add(ee->evas, "Alt");
1194    evas_key_modifier_add(ee->evas, "Meta");
1195    evas_key_modifier_add(ee->evas, "Hyper");
1196    evas_key_modifier_add(ee->evas, "Super");
1197    evas_key_lock_add(ee->evas, "Caps_Lock");
1198    evas_key_lock_add(ee->evas, "Num_Lock");
1199    evas_key_lock_add(ee->evas, "Scroll_Lock");
1200
1201    ecore_evases = _ecore_list2_prepend(ecore_evases, ee);
1202    ecore_evases_hash = evas_hash_add(ecore_evases_hash, _ecore_evas_win32_winid_str_get(ee->engine.win32.window), ee);
1203
1204    return ee;
1205 #else
1206    return NULL;
1207    parent = NULL;
1208    x = 0;
1209    y = 0;
1210    width = 0;
1211    height = 0;
1212 #endif /* ! BUILD_ECORE_EVAS_WIN32 */
1213 }
1214
1215 EAPI Ecore_Evas *
1216 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
1217                               int                 x,
1218                               int                 y,
1219                               int                 width,
1220                               int                 height)
1221 {
1222 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1223    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
1224                                          parent,
1225                                          x,
1226                                          y,
1227                                          width,
1228                                          height);
1229 #else
1230    return NULL;
1231    parent = NULL;
1232    x = 0;
1233    y = 0;
1234    width = 0;
1235    height = 0;
1236 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1237 }
1238
1239 EAPI Ecore_Evas *
1240 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
1241                                  int                 x,
1242                                  int                 y,
1243                                  int                 width,
1244                                  int                 height)
1245 {
1246 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
1247    return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
1248                                          parent,
1249                                          x,
1250                                          y,
1251                                          width,
1252                                          height);
1253 #else
1254    return NULL;
1255    parent = NULL;
1256    x = 0;
1257    y = 0;
1258    width = 0;
1259    height = 0;
1260 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
1261 }
1262
1263 EAPI Ecore_Evas *
1264 ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
1265                         int                 x,
1266                         int                 y,
1267                         int                 width,
1268                         int                 height)
1269 {
1270 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1271    return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
1272                                          parent,
1273                                          x,
1274                                          y,
1275                                          width,
1276                                          height);
1277 #else
1278    return NULL;
1279    parent = NULL;
1280    x = 0;
1281    y = 0;
1282    width = 0;
1283    height = 0;
1284 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1285 }
1286
1287 EAPI Ecore_Evas *
1288 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
1289                        int                 x,
1290                        int                 y,
1291                        int                 width,
1292                        int                 height)
1293 {
1294 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1295    return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
1296                                          parent,
1297                                          x,
1298                                          y,
1299                                          width,
1300                                          height);
1301 #else
1302    return NULL;
1303    parent = NULL;
1304    x = 0;
1305    y = 0;
1306    width = 0;
1307    height = 0;
1308 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1309 }
1310
1311 EAPI Ecore_Win32_Window *
1312 ecore_evas_win32_window_get(Ecore_Evas *ee)
1313 {
1314 #ifdef BUILD_ECORE_EVAS_WIN32
1315    return (Ecore_Win32_Window *) _ecore_evas_win32_window_get(ee);
1316 #else
1317    return NULL;
1318    ee = NULL;
1319 #endif /* BUILD_ECORE_EVAS_WIN32 */
1320 }