From 013df98f79866a75f367853c9e436f3c5c79f645 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 2 Jan 2007 19:19:48 +0000 Subject: (svn r7759) -Merge: makefile rewrite. This merge features: - A proper ./configure, so everything needs to be configured only once, not for every make. - Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies. - A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC. - Proper support for OSX universal binaries. - Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files. - Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files. Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy. --- src/sdl.c | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/sdl.c (limited to 'src/sdl.c') diff --git a/src/sdl.c b/src/sdl.c new file mode 100644 index 000000000..f6474b6e1 --- /dev/null +++ b/src/sdl.c @@ -0,0 +1,139 @@ +/* $Id$ */ + +#include "stdafx.h" + +#ifdef WITH_SDL + +#include "openttd.h" +#include "sdl.h" +#include + +#ifdef UNIX +#include + +#ifdef __MORPHOS__ + // The system supplied definition of SIG_DFL is wrong on MorphOS + #undef SIG_DFL + #define SIG_DFL (void (*)(int))0 +#endif +#endif + +static int _sdl_usage; + +#ifdef DYNAMICALLY_LOADED_SDL + +#include "win32.h" + +#define M(x) x "\0" +static const char sdl_files[] = + M("sdl.dll") + M("SDL_Init") + M("SDL_InitSubSystem") + M("SDL_GetError") + M("SDL_QuitSubSystem") + M("SDL_UpdateRect") + M("SDL_UpdateRects") + M("SDL_SetColors") + M("SDL_WM_SetCaption") + M("SDL_ShowCursor") + M("SDL_FreeSurface") + M("SDL_PollEvent") + M("SDL_WarpMouse") + M("SDL_GetTicks") + M("SDL_OpenAudio") + M("SDL_PauseAudio") + M("SDL_CloseAudio") + M("SDL_LockSurface") + M("SDL_UnlockSurface") + M("SDL_GetModState") + M("SDL_Delay") + M("SDL_Quit") + M("SDL_SetVideoMode") + M("SDL_EnableKeyRepeat") + M("SDL_EnableUNICODE") + M("SDL_VideoDriverName") + M("SDL_ListModes") + M("SDL_GetKeyState") + M("SDL_LoadBMP_RW") + M("SDL_RWFromFile") + M("SDL_SetColorKey") + M("SDL_WM_SetIcon") + M("SDL_MapRGB") + M("") +; +#undef M + +SDLProcs sdl_proc; + +static const char *LoadSdlDLL(void) +{ + if (sdl_proc.SDL_Init != NULL) + return NULL; + if (!LoadLibraryList((Function *)(void *)&sdl_proc, sdl_files)) + return "Unable to load sdl.dll"; + return NULL; +} + +#endif // DYNAMICALLY_LOADED_SDL + + +#ifdef UNIX +static void SdlAbort(int sig) +{ + /* Own hand-made parachute for the cases of failed assertions. */ + SDL_CALL SDL_Quit(); + + switch (sig) { + case SIGSEGV: + case SIGFPE: + signal(sig, SIG_DFL); + raise(sig); + break; + + default: + break; + } +} +#endif + + +const char* SdlOpen(uint32 x) +{ +#ifdef DYNAMICALLY_LOADED_SDL + { + const char *s = LoadSdlDLL(); + if (s != NULL) return s; + } +#endif + if (_sdl_usage++ == 0) { + if (SDL_CALL SDL_Init(x) == -1) + return SDL_CALL SDL_GetError(); + } else if (x != 0) { + if (SDL_CALL SDL_InitSubSystem(x) == -1) + return SDL_CALL SDL_GetError(); + } + +#ifdef UNIX + signal(SIGABRT, SdlAbort); + signal(SIGSEGV, SdlAbort); + signal(SIGFPE, SdlAbort); +#endif + + return NULL; +} + +void SdlClose(uint32 x) +{ + if (x != 0) + SDL_CALL SDL_QuitSubSystem(x); + if (--_sdl_usage == 0) { + SDL_CALL SDL_Quit(); + #ifdef UNIX + signal(SIGABRT, SIG_DFL); + signal(SIGSEGV, SIG_DFL); + signal(SIGFPE, SIG_DFL); + #endif + } +} + +#endif -- cgit v1.2.3-70-g09d2