2 * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
9 #include <stdlib.h> /* for NULL */
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 */
18 #include "ecore_evas_private.h"
19 #include "Ecore_Evas.h"
22 #ifdef BUILD_ECORE_EVAS_WIN32
24 #define ECORE_EVAS_EVENT_COUNT 14
26 static int _ecore_evas_init_count = 0;
27 static int _ecore_evas_fps_debug = 0;
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;
34 static int _ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event);
36 static int _ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event);
38 static int _ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event);
40 static int _ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event);
42 static int _ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event);
44 static int _ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event);
46 static int _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event);
48 static int _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event);
50 static int _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event);
52 static int _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event);
54 static int _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event);
56 static int _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event);
58 static int _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event);
60 static int _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event);
62 /* Private functions */
65 _ecore_evas_win32_render(Ecore_Evas *ee)
67 #ifdef BUILD_ECORE_EVAS_BUFFER
71 #ifdef BUILD_ECORE_EVAS_BUFFER
72 for (ll = ee->sub_ecore_evas; ll; ll = ll->next)
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);
82 if (ee->func.fn_pre_render) ee->func.fn_pre_render(ee);
83 if (ee->prop.avoid_damage)
87 updates = evas_render_updates(ee->evas);
88 if (updates) evas_render_updates_free(updates);
90 else if ((ee->visible) ||
91 ((ee->should_be_visible) && (ee->prop.fullscreen)) ||
92 ((ee->should_be_visible) && (ee->prop.override)))
98 updates = evas_render_updates(ee->evas);
99 if (updates) evas_render_updates_free(updates);
105 updates = evas_render_updates(ee->evas);
106 if (updates) evas_render_updates_free(updates);
110 evas_norender(ee->evas);
111 if (ee->func.fn_post_render) ee->func.fn_post_render(ee);
115 _ecore_evas_win32_idle_enter(void *data __UNUSED__)
121 if (_ecore_evas_fps_debug)
123 t1 = ecore_time_get();
125 for (l = (Ecore_List2 *)ecore_evases; l; l = l->next)
129 ee = (Ecore_Evas *)l;
130 _ecore_evas_win32_render(ee);
132 /* ecore_x_flush(); */
133 if (_ecore_evas_fps_debug)
135 t2 = ecore_time_get();
136 /* _ecore_evas_fps_debug_rendertime_add(t2 - t1); */
142 _ecore_evas_win32_init(void)
144 _ecore_evas_init_count++;
145 if (_ecore_evas_init_count > 1)
146 return _ecore_evas_init_count;
148 if (getenv("ECORE_EVAS_FPS_DEBUG"))
149 _ecore_evas_fps_debug = 1;
151 ecore_evas_idle_enterer = ecore_idle_enterer_add(_ecore_evas_win32_idle_enter, NULL);
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);
168 return _ecore_evas_init_count;
172 _ecore_evas_win32_shutdown(void)
174 _ecore_evas_init_count--;
175 if (_ecore_evas_init_count == 0)
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;
186 if (_ecore_evas_init_count < 0) _ecore_evas_init_count = 0;
188 return _ecore_evas_init_count;
192 _ecore_evas_win32_winid_str_get(Ecore_Win32_Window *window)
195 const char *vals = "qWeRtYuIoP5-$&<~";
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];
213 _ecore_evas_win32_match(Ecore_Win32_Window *window)
217 ee = evas_hash_find(ecore_evases_hash, _ecore_evas_win32_winid_str_get(window));
223 _ecore_evas_win32_event_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
226 Ecore_Win32_Event_Key_Down *e;
229 ee = _ecore_evas_win32_match(e->window);
230 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
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);
239 _ecore_evas_win32_event_key_up(void *data __UNUSED__, int type __UNUSED__, void *event)
242 Ecore_Win32_Event_Key_Up *e;
245 ee = _ecore_evas_win32_match(e->window);
246 if ((!ee) || (ee->ignore_events)) return 1; /* pass on event */
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);
255 _ecore_evas_win32_event_mouse_button_down(void *data __UNUSED__, int type __UNUSED__, void *event)
258 Ecore_Win32_Event_Mouse_Button_Down *e;
259 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
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;
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);
271 printf (" * ee event button down %f %d %d\n", e->time, e->x, e->y);
277 _ecore_evas_win32_event_mouse_button_up(void *data __UNUSED__, int type __UNUSED__, void *event)
280 Ecore_Win32_Event_Mouse_Button_Up *e;
281 Evas_Button_Flags flags = EVAS_BUTTON_NONE;
283 printf (" * ee event button up 0 \n");
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;
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);
294 printf (" * ee event button up\n");
300 _ecore_evas_win32_event_mouse_wheel(void *data __UNUSED__, int type __UNUSED__, void *event)
303 Ecore_Win32_Event_Mouse_Wheel *e;
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;
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);
317 _ecore_evas_win32_mouse_move_process(Ecore_Evas *ee, int x, int y, unsigned int timestamp)
321 if (ee->prop.cursor.object)
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);
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);
352 _ecore_evas_win32_event_mouse_move(void *data __UNUSED__, int type __UNUSED__, void *event)
355 Ecore_Win32_Event_Mouse_Move *e;
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;
362 /* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
363 _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
369 _ecore_evas_win32_event_mouse_in(void *data __UNUSED__, int type __UNUSED__, void *event)
372 Ecore_Win32_Event_Mouse_In *e;
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;
379 if (ee->func.fn_mouse_in) ee->func.fn_mouse_in(ee);
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);
389 _ecore_evas_win32_event_mouse_out(void *data __UNUSED__, int type __UNUSED__, void *event)
392 Ecore_Win32_Event_Mouse_Out *e;
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;
400 /* _ecore_evas_x_modifier_locks_update(ee, e->modifiers); */
401 _ecore_evas_win32_mouse_move_process(ee, e->x, e->y, e->time);
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);
411 _ecore_evas_win32_event_window_damage(void *data __UNUSED__, int type __UNUSED__, void *event)
414 Ecore_Win32_Event_Window_Damage *e;
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;
421 if (ee->prop.avoid_damage)
424 # pragma message ("[ECORE] [WIN32] No Region code")
426 # warning [ECORE] [WIN32] No Region code
427 #endif /* ! _MSC_VER */
431 printf (" * ee window event damage\n");
432 if (ee->rotation == 0)
433 evas_damage_rectangle_add(ee->evas,
438 else if (ee->rotation == 90)
439 evas_damage_rectangle_add(ee->evas,
440 ee->h - e->y - e->height,
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,
450 else if (ee->rotation == 270)
451 evas_damage_rectangle_add(ee->evas,
453 ee->w - e->x - e->width,
462 _ecore_evas_win32_event_window_destroy(void *data __UNUSED__, int type __UNUSED__, void *event)
465 Ecore_Win32_Event_Window_Destroy *e;
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);
474 printf (" * ee event destroy\n");
479 _ecore_evas_win32_event_window_show(void *data __UNUSED__, int type __UNUSED__, void *event)
482 Ecore_Win32_Event_Window_Show *e;
484 printf (" * ee window event show\n");
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 */
491 if (ee->func.fn_show) ee->func.fn_show(ee);
497 _ecore_evas_win32_event_window_hide(void *data __UNUSED__, int type __UNUSED__, void *event)
500 Ecore_Win32_Event_Window_Hide *e;
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 */
508 if (ee->func.fn_hide) ee->func.fn_hide(ee);
514 _ecore_evas_win32_event_window_configure(void *data __UNUSED__, int type __UNUSED__, void *event)
517 Ecore_Win32_Event_Window_Configure *e;
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;
524 if ((ee->x != e->x) || (ee->y != e->y))
528 if (ee->func.fn_move) ee->func.fn_move(ee);
531 if ((ee->w != e->width) || (ee->h != e->height))
533 printf (" * ee resize : 1\n");
536 if ((ee->rotation == 90) || (ee->rotation == 270))
538 evas_output_size_set(ee->evas, ee->h, ee->w);
539 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
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);
547 if (ee->prop.avoid_damage)
549 ecore_evas_avoid_damage_set(ee, 0);
550 ecore_evas_avoid_damage_set(ee, 1);
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))
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;
566 printf (" * ee resize : 4\n");
567 if (ee->func.fn_resize) ee->func.fn_resize(ee);
574 _ecore_evas_win32_event_window_delete_request(void *data __UNUSED__, int type __UNUSED__, void *event)
577 Ecore_Win32_Event_Window_Delete_Request *e;
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);
585 printf (" * ee event delete\n");
590 /* Ecore_Evas interface */
593 _ecore_evas_win32_free(Ecore_Evas *ee)
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();
603 _ecore_evas_win32_callback_delete_request_set(Ecore_Evas *ee,
604 void (*func) (Ecore_Evas *ee))
606 ee->func.fn_delete_request = func;
610 _ecore_evas_win32_move(Ecore_Evas *ee, int x, int y)
612 if ((x != ee->x) || (y != ee->y))
616 ecore_win32_window_move(ee->engine.win32.window, x, y);
617 if (ee->func.fn_move) ee->func.fn_move(ee);
622 _ecore_evas_win32_resize(Ecore_Evas *ee, int width, int height)
624 printf (" * _ecore_evas_win32_resize %d %d\n", width, height);
625 if ((ee->w != width) || (ee->h != height))
629 ecore_win32_window_resize(ee->engine.win32.window, width, height);
630 if ((ee->rotation == 90) || (ee->rotation == 270))
632 evas_output_size_set(ee->evas, ee->h, ee->w);
633 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
637 evas_output_size_set(ee->evas, ee->w, ee->h);
638 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
640 /* FIXME: damage and shape */
642 if (ee->func.fn_resize) ee->func.fn_resize(ee);
647 _ecore_evas_win32_move_resize(Ecore_Evas *ee, int x, int y, int width, int height)
649 printf (" * _ecore_evas_win32_resize\n");
650 if ((ee->w != width) || (ee->h != height) || (x != ee->x) || (y != ee->y))
655 if ((ee->w != width) || (ee->h != height)) change_size = 1;
656 if ((x != ee->x) || (y != ee->y)) change_pos = 1;
662 ecore_win32_window_move_resize(ee->engine.win32.window, x, y, width, height);
663 if ((ee->rotation == 90) || (ee->rotation == 270))
665 evas_output_size_set(ee->evas, ee->h, ee->w);
666 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
670 evas_output_size_set(ee->evas, ee->w, ee->h);
671 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
673 /* FIXME: damage and shape */
676 if (ee->func.fn_move) ee->func.fn_move(ee);
680 if (ee->func.fn_resize) ee->func.fn_resize(ee);
686 _ecore_evas_win32_rotation_set(Ecore_Evas *ee, int rotation)
690 if (ee->rotation == rotation) return;
691 rot_dif = ee->rotation - rotation;
692 if (rot_dif < 0) rot_dif = -rot_dif;
694 if (!strcmp(ee->driver, "software_ddraw"))
696 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
697 Evas_Engine_Info_Software_DDraw *einfo;
699 einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
703 int minw, minh, maxw, maxh, basew, baseh, stepw, steph;
705 einfo->info.rotation = rotation;
706 evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo);
707 if (!ee->prop.fullscreen)
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;
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))
721 evas_output_size_set(ee->evas, ee->w, ee->h);
722 evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h);
726 evas_output_size_set(ee->evas, ee->h, ee->w);
727 evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w);
729 if (ee->func.fn_resize) ee->func.fn_resize(ee);
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());
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);
752 if ((ee->rotation == 90) || (ee->rotation == 270))
753 evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w);
755 evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h);
756 #endif /* BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
761 _ecore_evas_win32_show(Ecore_Evas *ee)
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); */
773 _ecore_evas_win32_hide(Ecore_Evas *ee)
775 ecore_win32_window_hide(ee->engine.win32.window);
776 ee->should_be_visible = 0;
780 _ecore_evas_win32_raise(Ecore_Evas *ee)
782 if (!ee->prop.fullscreen)
783 ecore_win32_window_raise(ee->engine.win32.window);
785 ecore_win32_window_raise(ee->engine.win32.window);
789 _ecore_evas_win32_lower(Ecore_Evas *ee)
791 if (!ee->prop.fullscreen)
792 ecore_win32_window_lower(ee->engine.win32.window);
794 ecore_win32_window_lower(ee->engine.win32.window);
798 _ecore_evas_win32_activate(Ecore_Evas *ee)
800 ecore_win32_window_focus_set(ee->engine.win32.window);
804 _ecore_evas_win32_title_set(Ecore_Evas *ee, const char *title)
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);
813 _ecore_evas_win32_size_min_set(Ecore_Evas *ee, int width, int height)
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);
824 _ecore_evas_win32_size_max_set(Ecore_Evas *ee, int width, int height)
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);
835 _ecore_evas_win32_size_base_set(Ecore_Evas *ee, int width, int height)
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);
846 _ecore_evas_win32_size_step_set(Ecore_Evas *ee, int width, int height)
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);
857 _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y)
862 if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object);
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);
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;
879 ecore_win32_window_cursor_show(ee->engine.win32.window, 0);
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);
893 _ecore_evas_win32_focus_set(Ecore_Evas *ee, int on __UNUSED__)
895 ecore_win32_window_focus_set(ee->engine.win32.window);
899 _ecore_evas_win32_iconified_set(Ecore_Evas *ee, int on)
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);
908 _ecore_evas_win32_borderless_set(Ecore_Evas *ee, int on)
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);
917 _ecore_evas_win32_fullscreen_set(Ecore_Evas *ee, int on)
919 if ((ee->prop.fullscreen && on) ||
920 (!ee->prop.fullscreen && !on)) return;
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); */
929 /* _ecore_evas_win32_state_update(ee); */
932 #endif /* BUILD_ECORE_EVAS_WIN32 */
935 _ecore_evas_win32_window_get(Ecore_Evas *ee)
937 #ifdef BUILD_ECORE_EVAS_WIN32
938 return ee->engine.win32.window;
941 #endif /* BUILD_ECORE_EVAS_WIN32 */
944 #ifdef BUILD_ECORE_EVAS_WIN32
945 static const Ecore_Evas_Engine_Func _ecore_win32_engine_func =
947 _ecore_evas_win32_free,
952 _ecore_evas_win32_callback_delete_request_set,
962 _ecore_evas_win32_move,
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 */
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
995 #endif /* BUILD_ECORE_EVAS_WIN32 */
1000 _ecore_evas_engine_software_ddraw_init(Ecore_Evas *ee)
1002 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1003 Evas_Engine_Info_Software_DDraw *einfo;
1007 driver = "software_ddraw";
1009 rmethod = evas_render_method_lookup(driver);
1013 ee->driver = driver;
1014 evas_output_method_set(ee->evas, rmethod);
1016 einfo = (Evas_Engine_Info_Software_DDraw *)evas_engine_info_get(ee->evas);
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);
1029 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1033 _ecore_evas_engine_direct3d_init(Ecore_Evas *ee)
1035 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1036 Evas_Engine_Info_Direct3D *einfo;
1040 driver = "direct3d";
1042 rmethod = evas_render_method_lookup(driver);
1046 ee->driver = driver;
1047 evas_output_method_set(ee->evas, rmethod);
1049 einfo = (Evas_Engine_Info_Direct3D *)evas_engine_info_get(ee->evas);
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);
1062 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1066 _ecore_evas_engine_opengl_glew_init(Ecore_Evas *ee)
1068 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1069 Evas_Engine_Info_GL_Glew *einfo;
1075 rmethod = evas_render_method_lookup(driver);
1079 ee->driver = driver;
1080 evas_output_method_set(ee->evas, rmethod);
1082 einfo = (Evas_Engine_Info_GL_Glew *)evas_engine_info_get(ee->evas);
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);
1094 #endif /* ! BUILD_ECORE_EVAS_OPENGL_GLEW */
1098 _ecore_evas_engine_software_16_ddraw_init(Ecore_Evas *ee)
1100 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
1101 Evas_Engine_Info_Software_DDraw *einfo;
1105 driver = "software_16_ddraw";
1107 rmethod = evas_render_method_lookup(driver);
1111 ee->driver = driver;
1112 evas_output_method_set(ee->evas, rmethod);
1114 if (ecore_win32_screen_depth_get() != 16)
1117 einfo = (Evas_Engine_Info_Software_16_DDraw *)evas_engine_info_get(ee->evas);
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);
1128 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
1132 _ecore_evas_win32_new_internal(int (*_ecore_evas_engine_init)(Ecore_Evas *ee),
1133 Ecore_Win32_Window *parent,
1139 #ifdef BUILD_ECORE_EVAS_WIN32
1142 if (!ecore_win32_init())
1145 ee = calloc(1, sizeof(Ecore_Evas));
1149 ECORE_MAGIC_SET(ee, ECORE_MAGIC_EVAS);
1151 _ecore_evas_win32_init();
1153 ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_win32_engine_func;
1155 if (width < 1) width = 1;
1156 if (height < 1) height = 1;
1162 ee->prop.max.w = 32767;
1163 ee->prop.max.h = 32767;
1165 ee->prop.request_pos = 0;
1166 ee->prop.sticky = 0;
1167 /* FIXME: sticky to add */
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);
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)
1179 _ecore_evas_win32_shutdown();
1184 if (!_ecore_evas_engine_init(ee))
1186 _ecore_evas_win32_shutdown();
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");
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);
1212 #endif /* ! BUILD_ECORE_EVAS_WIN32 */
1216 ecore_evas_software_ddraw_new(Ecore_Win32_Window *parent,
1222 #ifdef BUILD_ECORE_EVAS_SOFTWARE_DDRAW
1223 return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_ddraw_init,
1236 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_DDRAW */
1240 ecore_evas_software_16_ddraw_new(Ecore_Win32_Window *parent,
1246 #ifdef BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW
1247 return _ecore_evas_win32_new_internal(_ecore_evas_engine_software_16_ddraw_init,
1260 #endif /* ! BUILD_ECORE_EVAS_SOFTWARE_16_DIRECTDRAW */
1264 ecore_evas_direct3d_new(Ecore_Win32_Window *parent,
1270 #ifdef BUILD_ECORE_EVAS_DIRECT3D
1271 return _ecore_evas_win32_new_internal(_ecore_evas_engine_direct3d_init,
1284 #endif /* ! BUILD_ECORE_EVAS_DIRECT3D */
1288 ecore_evas_gl_glew_new(Ecore_Win32_Window *parent,
1294 #ifdef BUILD_ECORE_EVAS_OPENGL_GLEW
1295 return _ecore_evas_win32_new_internal(_ecore_evas_engine_opengl_glew_init,
1308 #endif /* BUILD_ECORE_EVAS_OPENGL_GLEW */
1311 EAPI Ecore_Win32_Window *
1312 ecore_evas_win32_window_get(Ecore_Evas *ee)
1314 #ifdef BUILD_ECORE_EVAS_WIN32
1315 return (Ecore_Win32_Window *) _ecore_evas_win32_window_get(ee);
1319 #endif /* BUILD_ECORE_EVAS_WIN32 */