aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ecore/src/lib/ecore_evas/ecore_evas_sdl.c
diff options
context:
space:
mode:
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.c189
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
52static 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
48static Eina_Bool 59static 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)
219static void 272static 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 =
349static Ecore_Evas* 447static 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
501EAPI Ecore_Evas*
502ecore_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
515EAPI Ecore_Evas* 627EAPI Ecore_Evas*
516ecore_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__) 628ecore_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
524EAPI Ecore_Evas* 635EAPI Ecore_Evas*