From 6ac579b89565bdbab4fc627277970c9714e924eb Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 16 Jul 2007 07:27:43 +0000 Subject: [PATCH] sdl engine support in expedite SVN revision: 30846 --- configure.in | 31 +++++- src/bin/Makefile.am | 5 +- src/bin/engine_software_sdl.c | 174 ++++++++++++++++++++++++++++++++++ src/bin/engine_software_sdl.h | 7 ++ src/bin/main.c | 5 +- src/bin/main.h | 1 + 6 files changed, 218 insertions(+), 5 deletions(-) create mode 100644 src/bin/engine_software_sdl.c create mode 100644 src/bin/engine_software_sdl.h diff --git a/configure.in b/configure.in index 6d11ff0..2239f6b 100644 --- a/configure.in +++ b/configure.in @@ -89,7 +89,6 @@ AC_CHECK_HEADER(Evas_Engine_Software_DDraw.h, [ dummy=no ], [ #include ] ) -CFLAGS=$PCFLAGS if test "x$have_xlib" = "xyes" -o "x$have_xlib_16" = "xyes" -o "x$have_xlib_render" = "xyes" -o "x$have_xlib_opengl" = "xyes" ; then AC_PATH_XTRA @@ -102,6 +101,35 @@ AC_SUBST(x_cflags) AC_SUBST(x_libs) AC_SUBST(ddraw_libs) +####################################### +## SDL +AC_ARG_WITH(sdl-config, [ --with-sdl-config=SDL_CONFIG use sdl-config specified], +[ SDL_CONFIG=$withval; + echo "using "$SDL_CONFIG" for sdl-config"; ], +[ if test -z "$SDL_CONFIG"; then + AC_PATH_PROG(SDL_CONFIG, "sdl-config", "", $PATH) + fi +]) +if test -z "$SDL_CONFIG" ; then SDL_CONFIG="sdl-config"; fi + +sdl_cflags="" +sdl_libs="" + +have_sdl="no" +AC_CHECK_HEADER(Evas_Engine_SDL.h, + [ AC_DEFINE(HAVE_SOFTWARE_SDL, 1, [Evas Software SDL Support]) + have_sdl="yes" + sdl_cflags=`$SDL_CONFIG --cflags` + sdl_libs=`$SDL_CONFIG --libs` ], + [ dummy=no ], + [ #include ] +) + +AC_SUBST(sdl_cflags) +AC_SUBST(sdl_libs) + +CFLAGS=$PCFLAGS + AC_OUTPUT([ Makefile src/Makefile @@ -118,6 +146,7 @@ echo " Software Xlib 16 bits...: ${have_xlib_16}" echo " X Render Xlib...........: ${have_xlib_render}" echo " Open GL Xlib............: ${have_xlib_opengl}" echo " Software DirectDraw.....: ${have_ddraw}" +echo " Software SDL............: ${have_sdl}" echo echo " Installation:" echo " prefix..................: ${prefix}" diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index b66a791..7f27b44 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -2,7 +2,7 @@ MAINTAINERCLEANFILES = Makefile.in INCLUDES = -I$(includedir) \ -I$(top_srcdir) \ -I$(top_srcdir)/src/bin \ - @EVAS_CFLAGS@ @x_cflags@ \ + @EVAS_CFLAGS@ @x_cflags@ @sdl_cflags@ \ -DPACKAGE_BIN_DIR=\"@PACKAGE_BIN_DIR@\" \ -DPACKAGE_LIB_DIR=\"@PACKAGE_LIB_DIR@\" \ -DPACKAGE_DATA_DIR=\"@PACKAGE_DATA_DIR@\" @@ -16,6 +16,7 @@ engine_gl_x11.c engine_gl_x11.h \ engine_xrender_x11.c engine_xrender_x11.h \ engine_software_16_x11.c engine_software_16_x11.h \ engine_software_ddraw.c engine_software_ddraw.h \ +engine_software_sdl.c engine_software_sdl.h \ ui.c ui.h \ about.c about.h \ tests.h \ @@ -58,4 +59,4 @@ image_blend_occlude2_very_many.c \ image_blend_occlude3_very_many.c \ poly_blend.c -expedite_LDFLAGS = @EVAS_LIBS@ @x_libs@ @ddraw_libs@ -lm +expedite_LDFLAGS = @EVAS_LIBS@ @sdl_libs@ @x_libs@ @ddraw_libs@ -lm diff --git a/src/bin/engine_software_sdl.c b/src/bin/engine_software_sdl.c new file mode 100644 index 0000000..a9d509d --- /dev/null +++ b/src/bin/engine_software_sdl.c @@ -0,0 +1,174 @@ +#include "main.h" + +#ifndef HAVE_SOFTWARE_SDL + +int +engine_software_sdl_args(int argc, char **argv) +{ + fprintf(stderr, "ERROR: No Software SDL Engine built\n"); + return 0; +} + +void +engine_software_sdl_loop(void) +{ +} + +#else +#include +#include + +int +engine_software_sdl_args(int argc, char **argv) +{ + Evas_Engine_Info_SDL *einfo; + int i; + int ok = 0; + + for (i = 1; i < argc; ++i) + { + if ((!strcmp(argv[i], "-e") && (i < (argc - 1)))) + { + i++; + if (!strcmp(argv[i], "sdl")) ok = 1; + } + } + if (!ok) return 0; + + evas_output_method_set(evas, evas_render_method_lookup("software_sdl")); + + einfo = (Evas_Engine_Info_SDL *) evas_engine_info_get(evas); + + /* the following is specific to the engine */ + einfo->info.fullscreen = 0; + einfo->info.noframe = 0; + + evas_engine_info_set(evas, (Evas_Engine_Info *) einfo); +} + +void +engine_software_sdl_loop(void) +{ + SDL_Event event; + + while(SDL_PollEvent(&event)) + { + switch(event.type) + { + case SDL_MOUSEMOTION: + evas_event_feed_mouse_move(evas, event.motion.x, event.motion.y, 0, NULL); + break; + case SDL_MOUSEBUTTONDOWN: + evas_event_feed_mouse_move(evas, event.button.x, event.button.y, 0, NULL); + evas_event_feed_mouse_down(evas, event.button.state, EVAS_BUTTON_NONE, 0, NULL); + break; + case SDL_MOUSEBUTTONUP: + evas_event_feed_mouse_move(evas, event.button.x, event.button.y, 0, NULL); + evas_event_feed_mouse_up(evas, event.button.state, EVAS_BUTTON_NONE, 0, NULL); + break; + case SDL_VIDEORESIZE: + evas_output_size_set(evas, event.resize.w, event.resize.w); + evas_output_size_get(evas, &win_w, &win_h); + break; + case SDL_VIDEOEXPOSE: + evas_output_size_get(evas, &win_w, &win_h); + evas_damage_rectangle_add(evas, 0, 0, win_w, win_h); + break; + case SDL_KEYDOWN: + switch (event.key.keysym.sym) + { + case SDLK_LSHIFT: + case SDLK_RSHIFT: + evas_key_modifier_on(evas, "Shift"); + break; + case SDLK_RCTRL: + case SDLK_LCTRL: + evas_key_modifier_on(evas, "Control"); + break; + case SDLK_MENU: + case SDLK_RALT: + case SDLK_LALT: + evas_key_modifier_on(evas, "Alt"); + break; + case SDLK_LSUPER: + case SDLK_RSUPER: + evas_key_modifier_on(evas, "Super"); + break; + case SDLK_CAPSLOCK: + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_key_lock_off(evas, "Caps_Lock"); + else + evas_key_lock_on(evas, "Caps_Lock"); + break; + case SDLK_NUMLOCK: + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Num_Lock")) + evas_key_lock_off(evas, "Num_Lock"); + else + evas_key_lock_on(evas, "Num_Lock"); + break; + case SDLK_SCROLLOCK: + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Scroll_Lock")) + evas_key_lock_off(evas, "Scroll_Lock"); + else + evas_key_lock_on(evas, "Scroll_Lock"); + break; + case SDLK_ESCAPE: evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL); break; + case SDLK_RETURN: evas_event_feed_key_down(evas, "Return", "Return", NULL, NULL, 0, NULL); break; + case SDLK_LEFT: evas_event_feed_key_down(evas, "Left", "Left", NULL, NULL, 0, NULL); break; + case SDLK_RIGHT: evas_event_feed_key_down(evas, "Right", "Right", NULL, NULL, 0, NULL); break; + case SDLK_q: + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_event_feed_key_down(evas, "Q", "Q", NULL, NULL, 0, NULL); + else + evas_event_feed_key_down(evas, "q", "q", NULL, NULL, 0, NULL); + break; + } + break; + case SDL_KEYUP: + switch (event.key.keysym.sym) + { + case SDLK_LSHIFT: + case SDLK_RSHIFT: + evas_key_modifier_off(evas, "Shift"); + break; + case SDLK_RCTRL: + case SDLK_LCTRL: + evas_key_modifier_off(evas, "Control"); + break; + case SDLK_MENU: + case SDLK_RALT: + case SDLK_LALT: + evas_key_modifier_off(evas, "Alt"); + break; + case SDLK_LSUPER: + case SDLK_RSUPER: + evas_key_modifier_off(evas, "Super"); + break; + case SDLK_ESCAPE: evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL); break; + case SDLK_RETURN: evas_event_feed_key_up(evas, "Return", "Return", NULL, NULL, 0, NULL); break; + case SDLK_LEFT: evas_event_feed_key_up(evas, "Left", "Left", NULL, NULL, 0, NULL); break; + case SDLK_RIGHT: evas_event_feed_key_up(evas, "Right", "Right", NULL, NULL, 0, NULL); break; + case SDLK_q: + if (evas_key_lock_is_set(evas_key_lock_get(evas), "Caps_Lock")) + evas_event_feed_key_up(evas, "Q", "Q", NULL, NULL, 0, NULL); + else + evas_event_feed_key_up(evas, "q", "q", NULL, NULL, 0, NULL); + break; + } + break; + case SDL_QUIT: + case SDL_SYSWMEVENT: + case SDL_USEREVENT: + case SDL_ACTIVEEVENT: + case SDL_JOYAXISMOTION: + case SDL_JOYBALLMOTION: + case SDL_JOYHATMOTION: + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + default: + break; + } + } +} + +#endif diff --git a/src/bin/engine_software_sdl.h b/src/bin/engine_software_sdl.h new file mode 100644 index 0000000..6bacf71 --- /dev/null +++ b/src/bin/engine_software_sdl.h @@ -0,0 +1,7 @@ +#ifndef ENGINE_SOFTWARE_SDL_H +#define ENGINE_SOFTWARE_SDL_H + +int engine_software_sdl_args(int argc, char **argv); +void engine_software_sdl_loop(void); + +#endif diff --git a/src/bin/main.c b/src/bin/main.c index 33d4ba7..c68b5c2 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -1090,7 +1090,6 @@ static void _engine_args(int argc, char **argv) { /* FIXME: parse args for geometry, engine etc. */ - if (engine_software_x11_args(argc, argv)) loop_func = engine_software_x11_loop; if (engine_gl_x11_args(argc, argv)) @@ -1101,6 +1100,8 @@ _engine_args(int argc, char **argv) loop_func = engine_software_16_x11_loop; if (engine_software_ddraw_args(argc, argv)) loop_func = engine_software_ddraw_loop; + if (engine_software_sdl_args(argc, argv)) + loop_func = engine_software_sdl_loop; if (!loop_func) { fprintf(stderr, @@ -1110,7 +1111,7 @@ _engine_args(int argc, char **argv) " -e ENGINE\n" "\n" "Where ENGINE can be one of:\n" - " x11 xr gl x11-16 ddraw\n" + " x11 xr gl x11-16 ddraw sdl\n" ); exit(-1); } diff --git a/src/bin/main.h b/src/bin/main.h index 5ddf2fe..59bf377 100644 --- a/src/bin/main.h +++ b/src/bin/main.h @@ -15,6 +15,7 @@ #include "engine_xrender_x11.h" #include "engine_software_16_x11.h" #include "engine_software_ddraw.h" +#include "engine_software_sdl.h" #include "ui.h" #include "about.h"