diff options
Diffstat (limited to 'libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c')
-rw-r--r-- | libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c | 189 |
1 files changed, 150 insertions, 39 deletions
diff --git a/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c b/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c index a3be2c7..b246a26 100644 --- a/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c +++ b/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c | |||
@@ -7,9 +7,6 @@ | |||
7 | #include <Ecore_Input_Evas.h> | 7 | #include <Ecore_Input_Evas.h> |
8 | #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) | 8 | #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) |
9 | # include <Ecore_Sdl.h> | 9 | # include <Ecore_Sdl.h> |
10 | # ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL | ||
11 | # include <Evas_Engine_SDL.h> | ||
12 | # endif | ||
13 | # ifdef BUILD_ECORE_EVAS_OPENGL_SDL | 10 | # ifdef BUILD_ECORE_EVAS_OPENGL_SDL |
14 | # include <Evas_Engine_GL_SDL.h> | 11 | # include <Evas_Engine_GL_SDL.h> |
15 | # endif | 12 | # endif |
@@ -18,10 +15,17 @@ | |||
18 | #include <stdlib.h> | 15 | #include <stdlib.h> |
19 | #include <string.h> | 16 | #include <string.h> |
20 | 17 | ||
18 | #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) | ||
19 | #include <SDL/SDL.h> | ||
20 | #endif | ||
21 | |||
21 | #include "ecore_evas_private.h" | 22 | #include "ecore_evas_private.h" |
22 | #include "Ecore_Evas.h" | 23 | #include "Ecore_Evas.h" |
23 | 24 | ||
24 | // fixme: 1 sdl window only at a time? seems wrong | 25 | /** |
26 | ** SDL only handle one window at a time. That's by definition, there is nothing wrong here. | ||
27 | ** | ||
28 | **/ | ||
25 | 29 | ||
26 | #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) | 30 | #if defined(BUILD_ECORE_EVAS_SOFTWARE_SDL) || defined(BUILD_ECORE_EVAS_OPENGL_SDL) |
27 | 31 | ||
@@ -45,6 +49,13 @@ _ecore_evas_sdl_match(void) | |||
45 | return sdl_ee; | 49 | return sdl_ee; |
46 | } | 50 | } |
47 | 51 | ||
52 | static void * | ||
53 | _ecore_evas_sdl_switch_buffer(void *data, void *dest __UNUSED__) | ||
54 | { | ||
55 | SDL_Flip(data); | ||
56 | return ((SDL_Surface*)data)->pixels; | ||
57 | } | ||
58 | |||
48 | static Eina_Bool | 59 | static Eina_Bool |
49 | _ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__) | 60 | _ecore_evas_sdl_event_got_focus(void *data __UNUSED__, int type __UNUSED__, void *event __UNUSED__) |
50 | { | 61 | { |
@@ -80,12 +91,54 @@ _ecore_evas_sdl_event_video_resize(void *data __UNUSED__, int type __UNUSED__, v | |||
80 | { | 91 | { |
81 | Ecore_Sdl_Event_Video_Resize *e; | 92 | Ecore_Sdl_Event_Video_Resize *e; |
82 | Ecore_Evas *ee; | 93 | Ecore_Evas *ee; |
94 | int rmethod; | ||
83 | 95 | ||
84 | e = event; | 96 | e = event; |
85 | ee = _ecore_evas_sdl_match(); | 97 | ee = _ecore_evas_sdl_match(); |
86 | 98 | ||
87 | if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ | 99 | if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ |
100 | |||
101 | rmethod = evas_output_method_get(ee->evas); | ||
102 | if (rmethod == evas_render_method_lookup("buffer")) | ||
103 | { | ||
104 | Evas_Engine_Info_Buffer *einfo; | ||
105 | |||
106 | einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); | ||
107 | if (einfo) | ||
108 | { | ||
109 | einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; | ||
110 | einfo->info.switch_data = SDL_SetVideoMode(e->w, e->h, 32, | ||
111 | (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) | ||
112 | | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0) | ||
113 | | (ee->alpha ? SDL_SRCALPHA : 0) | ||
114 | | SDL_DOUBLEBUF); | ||
115 | if (!einfo->info.switch_data) | ||
116 | { | ||
117 | return EINA_FALSE; | ||
118 | } | ||
119 | |||
120 | SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); | ||
121 | SDL_FillRect(einfo->info.switch_data, NULL, 0); | ||
122 | |||
123 | einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; | ||
124 | einfo->info.dest_buffer_row_bytes = e->w * sizeof (int); | ||
125 | einfo->info.use_color_key = 0; | ||
126 | einfo->info.alpha_threshold = 0; | ||
127 | einfo->info.func.new_update_region = NULL; | ||
128 | einfo->info.func.free_update_region = NULL; | ||
129 | einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; | ||
130 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) | ||
131 | { | ||
132 | return EINA_FALSE; | ||
133 | } | ||
134 | } | ||
135 | } | ||
136 | |||
137 | ee->w = e->w; | ||
138 | ee->h = e->h; | ||
139 | |||
88 | evas_output_size_set(ee->evas, e->w, e->h); | 140 | evas_output_size_set(ee->evas, e->w, e->h); |
141 | evas_output_viewport_set(ee->evas, 0, 0, e->w, e->h); | ||
89 | 142 | ||
90 | return ECORE_CALLBACK_PASS_ON; | 143 | return ECORE_CALLBACK_PASS_ON; |
91 | } | 144 | } |
@@ -191,7 +244,7 @@ _ecore_evas_sdl_shutdown(void) | |||
191 | _ecore_evas_init_count--; | 244 | _ecore_evas_init_count--; |
192 | if (_ecore_evas_init_count == 0) | 245 | if (_ecore_evas_init_count == 0) |
193 | { | 246 | { |
194 | int i; | 247 | unsigned int i; |
195 | 248 | ||
196 | for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++) | 249 | for (i = 0; i < sizeof (ecore_evas_event_handlers) / sizeof (Ecore_Event_Handler*); i++) |
197 | ecore_event_handler_del(ecore_evas_event_handlers[i]); | 250 | ecore_event_handler_del(ecore_evas_event_handlers[i]); |
@@ -219,10 +272,48 @@ _ecore_evas_sdl_free(Ecore_Evas *ee) | |||
219 | static void | 272 | static void |
220 | _ecore_evas_resize(Ecore_Evas *ee, int w, int h) | 273 | _ecore_evas_resize(Ecore_Evas *ee, int w, int h) |
221 | { | 274 | { |
275 | int rmethod; | ||
276 | |||
222 | if ((w == ee->w) && (h == ee->h)) return; | 277 | if ((w == ee->w) && (h == ee->h)) return; |
223 | ee->w = w; | 278 | ee->w = w; |
224 | ee->h = h; | 279 | ee->h = h; |
225 | 280 | ||
281 | rmethod = evas_output_method_get(ee->evas); | ||
282 | if (rmethod == evas_render_method_lookup("buffer")) | ||
283 | { | ||
284 | Evas_Engine_Info_Buffer *einfo; | ||
285 | |||
286 | einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); | ||
287 | if (einfo) | ||
288 | { | ||
289 | einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; | ||
290 | einfo->info.switch_data = SDL_SetVideoMode(w, h, 32, | ||
291 | (ee->prop.hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) | ||
292 | | (ee->prop.fullscreen ? SDL_FULLSCREEN : 0) | ||
293 | | (ee->alpha ? SDL_SRCALPHA : 0) | ||
294 | | SDL_DOUBLEBUF); | ||
295 | if (!einfo->info.switch_data) | ||
296 | { | ||
297 | return ; | ||
298 | } | ||
299 | |||
300 | SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); | ||
301 | SDL_FillRect(einfo->info.switch_data, NULL, 0); | ||
302 | |||
303 | einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; | ||
304 | einfo->info.dest_buffer_row_bytes = w * sizeof (int); | ||
305 | einfo->info.use_color_key = 0; | ||
306 | einfo->info.alpha_threshold = 0; | ||
307 | einfo->info.func.new_update_region = NULL; | ||
308 | einfo->info.func.free_update_region = NULL; | ||
309 | einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; | ||
310 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) | ||
311 | { | ||
312 | return ; | ||
313 | } | ||
314 | } | ||
315 | } | ||
316 | |||
226 | evas_output_size_set(ee->evas, ee->w, ee->h); | 317 | evas_output_size_set(ee->evas, ee->w, ee->h); |
227 | evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); | 318 | evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); |
228 | evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); | 319 | evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); |
@@ -342,6 +433,13 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = | |||
342 | NULL, | 433 | NULL, |
343 | NULL, //transparent | 434 | NULL, //transparent |
344 | 435 | ||
436 | NULL, | ||
437 | NULL, | ||
438 | NULL, | ||
439 | NULL, | ||
440 | NULL, | ||
441 | NULL, | ||
442 | |||
345 | NULL, // render | 443 | NULL, // render |
346 | NULL // screen_geometry_get | 444 | NULL // screen_geometry_get |
347 | }; | 445 | }; |
@@ -349,7 +447,6 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func = | |||
349 | static Ecore_Evas* | 447 | static Ecore_Evas* |
350 | _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha) | 448 | _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha) |
351 | { | 449 | { |
352 | void *einfo; | ||
353 | Ecore_Evas *ee; | 450 | Ecore_Evas *ee; |
354 | 451 | ||
355 | if (!name) | 452 | if (!name) |
@@ -382,6 +479,8 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu | |||
382 | ee->prop.withdrawn = 0; | 479 | ee->prop.withdrawn = 0; |
383 | ee->prop.sticky = 0; | 480 | ee->prop.sticky = 0; |
384 | ee->prop.window = 0; | 481 | ee->prop.window = 0; |
482 | ee->alpha = alpha; | ||
483 | ee->prop.hwsurface = hwsurface; | ||
385 | 484 | ||
386 | /* init evas here */ | 485 | /* init evas here */ |
387 | ee->evas = evas_new(); | 486 | ee->evas = evas_new(); |
@@ -391,19 +490,47 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu | |||
391 | evas_output_size_set(ee->evas, w, h); | 490 | evas_output_size_set(ee->evas, w, h); |
392 | evas_output_viewport_set(ee->evas, 0, 0, w, h); | 491 | evas_output_viewport_set(ee->evas, 0, 0, w, h); |
393 | 492 | ||
394 | if (rmethod == evas_render_method_lookup("software_sdl") || | 493 | if (rmethod == evas_render_method_lookup("buffer")) |
395 | rmethod == evas_render_method_lookup("software_16_sdl") ) | ||
396 | { | 494 | { |
397 | #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL | 495 | Evas_Engine_Info_Buffer *einfo; |
398 | einfo = evas_engine_info_get(ee->evas); | 496 | |
497 | einfo = (Evas_Engine_Info_Buffer *) evas_engine_info_get(ee->evas); | ||
399 | if (einfo) | 498 | if (einfo) |
400 | { | 499 | { |
401 | ((Evas_Engine_Info_SDL *)einfo)->info.rotation = 0; | 500 | SDL_Init(SDL_INIT_NOPARACHUTE); |
402 | ((Evas_Engine_Info_SDL *)einfo)->info.fullscreen = fullscreen; | 501 | |
403 | ((Evas_Engine_Info_SDL *)einfo)->info.hwsurface = hwsurface; | 502 | if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) |
404 | ((Evas_Engine_Info_SDL *)einfo)->info.noframe = noframe; | 503 | { |
405 | ((Evas_Engine_Info_SDL *)einfo)->info.alpha = alpha; | 504 | ERR("SDL_Init failed with %s", SDL_GetError()); |
406 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) | 505 | SDL_Quit(); |
506 | return NULL; | ||
507 | } | ||
508 | |||
509 | einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_RGB32; | ||
510 | einfo->info.switch_data = SDL_SetVideoMode(w, h, 32, | ||
511 | (hwsurface ? SDL_HWSURFACE : SDL_SWSURFACE) | ||
512 | | (fullscreen ? SDL_FULLSCREEN : 0) | ||
513 | | (noframe ? SDL_NOFRAME : 0) | ||
514 | | (alpha ? SDL_SRCALPHA : 0) | ||
515 | | SDL_DOUBLEBUF); | ||
516 | if (!einfo->info.switch_data) | ||
517 | { | ||
518 | ERR("SDL_SetVideoMode failed !"); | ||
519 | ecore_evas_free(ee); | ||
520 | return NULL; | ||
521 | } | ||
522 | |||
523 | SDL_SetAlpha(einfo->info.switch_data, SDL_SRCALPHA, 0); | ||
524 | SDL_FillRect(einfo->info.switch_data, NULL, 0); | ||
525 | |||
526 | einfo->info.dest_buffer = ((SDL_Surface*)einfo->info.switch_data)->pixels; | ||
527 | einfo->info.dest_buffer_row_bytes = w * sizeof (int); | ||
528 | einfo->info.use_color_key = 0; | ||
529 | einfo->info.alpha_threshold = 0; | ||
530 | einfo->info.func.new_update_region = NULL; | ||
531 | einfo->info.func.free_update_region = NULL; | ||
532 | einfo->info.func.switch_buffer = _ecore_evas_sdl_switch_buffer; | ||
533 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *) einfo)) | ||
407 | { | 534 | { |
408 | ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); | 535 | ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); |
409 | ecore_evas_free(ee); | 536 | ecore_evas_free(ee); |
@@ -416,16 +543,17 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu | |||
416 | ecore_evas_free(ee); | 543 | ecore_evas_free(ee); |
417 | return NULL; | 544 | return NULL; |
418 | } | 545 | } |
419 | #endif | ||
420 | } | 546 | } |
421 | else if (rmethod == evas_render_method_lookup("gl_sdl")) | 547 | else if (rmethod == evas_render_method_lookup("gl_sdl")) |
422 | { | 548 | { |
423 | #ifdef BUILD_ECORE_EVAS_OPENGL_SDL | 549 | #ifdef BUILD_ECORE_EVAS_OPENGL_SDL |
424 | einfo = evas_engine_info_get(ee->evas); | 550 | Evas_Engine_Info_GL_SDL *einfo; |
551 | |||
552 | einfo = (Evas_Engine_Info_GL_SDL *) evas_engine_info_get(ee->evas); | ||
425 | if (einfo) | 553 | if (einfo) |
426 | { | 554 | { |
427 | ((Evas_Engine_Info_GL_SDL *)einfo)->flags.fullscreen = fullscreen; | 555 | einfo->flags.fullscreen = fullscreen; |
428 | ((Evas_Engine_Info_GL_SDL *)einfo)->flags.noframe = noframe; | 556 | einfo->flags.noframe = noframe; |
429 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) | 557 | if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) |
430 | { | 558 | { |
431 | ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); | 559 | ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); |
@@ -464,7 +592,7 @@ _ecore_evas_internal_sdl_new(int rmethod, const char* name, int w, int h, int fu | |||
464 | (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, | 592 | (Ecore_Event_Multi_Down_Cb)_ecore_evas_mouse_multi_down_process, |
465 | (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); | 593 | (Ecore_Event_Multi_Up_Cb)_ecore_evas_mouse_multi_up_process); |
466 | 594 | ||
467 | SDL_ShowCursor(SDL_DISABLE); | 595 | SDL_ShowCursor(SDL_ENABLE); |
468 | 596 | ||
469 | ee->engine.func->fn_render = _ecore_evas_sdl_render; | 597 | ee->engine.func->fn_render = _ecore_evas_sdl_render; |
470 | _ecore_evas_register(ee); | 598 | _ecore_evas_register(ee); |
@@ -481,11 +609,10 @@ ecore_evas_sdl_new(const char* name, int w, int h, int fullscreen, int hwsurface | |||
481 | Ecore_Evas *ee; | 609 | Ecore_Evas *ee; |
482 | int rmethod; | 610 | int rmethod; |
483 | 611 | ||
484 | rmethod = evas_render_method_lookup("software_sdl"); | 612 | rmethod = evas_render_method_lookup("buffer"); |
485 | if (!rmethod) return NULL; | 613 | if (!rmethod) return NULL; |
486 | 614 | ||
487 | ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha); | 615 | ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha); |
488 | ee->driver = "sdl"; | ||
489 | return ee; | 616 | return ee; |
490 | } | 617 | } |
491 | #else | 618 | #else |
@@ -497,28 +624,12 @@ ecore_evas_sdl_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED | |||
497 | } | 624 | } |
498 | #endif | 625 | #endif |
499 | 626 | ||
500 | #ifdef BUILD_ECORE_EVAS_SOFTWARE_SDL | ||
501 | EAPI Ecore_Evas* | ||
502 | ecore_evas_sdl16_new(const char* name, int w, int h, int fullscreen, int hwsurface, int noframe, int alpha) | ||
503 | { | ||
504 | Ecore_Evas *ee; | ||
505 | int rmethod; | ||
506 | |||
507 | rmethod = evas_render_method_lookup("software_16_sdl"); | ||
508 | if (!rmethod) return NULL; | ||
509 | |||
510 | ee = _ecore_evas_internal_sdl_new(rmethod, name, w, h, fullscreen, hwsurface, noframe, alpha); | ||
511 | ee->driver = "software_16_sdl"; | ||
512 | return ee; | ||
513 | } | ||
514 | #else | ||
515 | EAPI Ecore_Evas* | 627 | EAPI Ecore_Evas* |
516 | ecore_evas_sdl16_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__) | 628 | ecore_evas_sdl16_new(const char* name __UNUSED__, int w __UNUSED__, int h __UNUSED__, int fullscreen __UNUSED__, int hwsurface __UNUSED__, int noframe __UNUSED__, int alpha __UNUSED__) |
517 | { | 629 | { |
518 | ERR("OUTCH !"); | 630 | ERR("OUTCH !"); |
519 | return NULL; | 631 | return NULL; |
520 | } | 632 | } |
521 | #endif | ||
522 | 633 | ||
523 | #ifdef BUILD_ECORE_EVAS_OPENGL_SDL | 634 | #ifdef BUILD_ECORE_EVAS_OPENGL_SDL |
524 | EAPI Ecore_Evas* | 635 | EAPI Ecore_Evas* |