Skip to content
Snippets Groups Projects
Commit 2b85382e authored by deuce's avatar deuce
Browse files

Move these files into here from ciolib.

parent 277b0035
No related branches found
No related tags found
No related merge requests found
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
Non-NIB-Code & other changes: Max Horn <max@quendi.de>
Feel free to customize this file to suit your needs
*/
#import <Cocoa/Cocoa.h>
@interface SDLMain : NSObject
@end
/*
SDL_main.c, placed in the public domain by Sam Lantinga 4/13/98
The WinMain function -- calls your program's main() function
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <windows.h>
#include <malloc.h> /* For _alloca() */
#ifdef _WIN32_WCE
# define DIR_SEPERATOR TEXT("\\")
# undef _getcwd
# define _getcwd(str,len) wcscpy(str,TEXT(""))
# define setbuf(f,b)
# define setvbuf(w,x,y,z)
# define fopen _wfopen
# define freopen _wfreopen
# define remove(x) DeleteFile(x)
# define strcat wcscat
#else
# define DIR_SEPERATOR TEXT("/")
# include <direct.h>
#endif
/* Include the SDL main definition header */
#include "SDL.h"
#include "SDL_main.h"
extern C_LINKAGE int SDL_main_env(int argc, char *argv[], char **env);
#ifdef main
# ifndef _WIN32_WCE_EMULATION
# undef main
# endif /* _WIN32_WCE_EMULATION */
#endif /* main */
#define NO_STDIO_REDIRECT
/* The standard output files */
#define STDOUT_FILE TEXT("stdout.txt")
#define STDERR_FILE TEXT("stderr.txt")
#ifndef NO_STDIO_REDIRECT
# ifdef _WIN32_WCE
static wchar_t stdoutPath[MAX_PATH];
static wchar_t stderrPath[MAX_PATH];
# else
static char stdoutPath[MAX_PATH];
static char stderrPath[MAX_PATH];
# endif
#endif
/* Special Dynamic/Static hackery */
#include "sdlfuncs.h"
struct sdlfuncs sdl;
#if defined(_WIN32_WCE) && _WIN32_WCE < 300
/* seems to be undefined in Win CE although in online help */
#define isspace(a) (((CHAR)a == ' ') || ((CHAR)a == '\t'))
/* seems to be undefined in Win CE although in online help */
char *strrchr(char *str, int c)
{
char *p;
/* Skip to the end of the string */
p=str;
while (*p)
p++;
/* Look for the given character */
while ( (p >= str) && (*p != (CHAR)c) )
p--;
/* Return NULL if character not found */
if ( p < str ) {
p = NULL;
}
return p;
}
#endif /* _WIN32_WCE < 300 */
/* Parse a command line buffer into arguments */
static int ParseCommandLine(char *cmdline, char **argv)
{
char *bufp;
int argc;
argc = 0;
for ( bufp = cmdline; *bufp; ) {
/* Skip leading whitespace */
while ( isspace(*bufp) ) {
++bufp;
}
/* Skip over argument */
if ( *bufp == '"' ) {
++bufp;
if ( *bufp ) {
if ( argv ) {
argv[argc] = bufp;
}
++argc;
}
/* Skip over word */
while ( *bufp && (*bufp != '"') ) {
++bufp;
}
} else {
if ( *bufp ) {
if ( argv ) {
argv[argc] = bufp;
}
++argc;
}
/* Skip over word */
while ( *bufp && ! isspace(*bufp) ) {
++bufp;
}
}
if ( *bufp ) {
if ( argv ) {
*bufp = '\0';
}
++bufp;
}
}
if ( argv ) {
argv[argc] = NULL;
}
return(argc);
}
/* Show an error message */
static void ShowError(const char *title, const char *message)
{
/* If USE_MESSAGEBOX is defined, you need to link with user32.lib */
#ifdef USE_MESSAGEBOX
MessageBox(NULL, message, title, MB_ICONEXCLAMATION|MB_OK);
#else
fprintf(stderr, "%s: %s\n", title, message);
#endif
}
/* Pop up an out of memory message, returns to Windows */
static BOOL OutOfMemory(void)
{
ShowError("Fatal Error", "Out of memory - aborting");
return FALSE;
}
/* Remove the output files if there was no output written */
static void __cdecl cleanup_output(void)
{
#ifndef NO_STDIO_REDIRECT
FILE *file;
int empty;
#endif
/* Flush the output in case anything is queued */
fclose(stdout);
fclose(stderr);
#ifndef NO_STDIO_REDIRECT
/* See if the files have any output in them */
if ( stdoutPath[0] ) {
file = fopen(stdoutPath, TEXT("rb"));
if ( file ) {
empty = (fgetc(file) == EOF) ? 1 : 0;
fclose(file);
if ( empty ) {
remove(stdoutPath);
}
}
}
if ( stderrPath[0] ) {
file = fopen(stderrPath, TEXT("rb"));
if ( file ) {
empty = (fgetc(file) == EOF) ? 1 : 0;
fclose(file);
if ( empty ) {
remove(stderrPath);
}
}
}
#endif
}
#if (defined(__BORLANDC__) || defined(_MSC_VER)) && !defined(_WIN32_WCE)
/* The VC++ compiler needs main defined */
#define console_main main
#endif
/* This is where execution begins [console apps] */
int console_main(int argc, char *argv[], char **env)
{
int n;
char *bufp, *appname;
/* Get the class name from argv[0] */
appname = argv[0];
if ( (bufp=strrchr(argv[0], '\\')) != NULL ) {
appname = bufp+1;
} else
if ( (bufp=strrchr(argv[0], '/')) != NULL ) {
appname = bufp+1;
}
if ( (bufp=strrchr(appname, '.')) == NULL )
n = strlen(appname);
else
n = (bufp-appname);
bufp = (char *)alloca(n+1);
if ( bufp == NULL ) {
return OutOfMemory();
}
strncpy(bufp, appname, n);
bufp[n] = '\0';
appname = bufp;
/* Load SDL dynamic link library */
if(!load_sdl_funcs(&sdl)) {
if ( sdl.Init(SDL_INIT_NOPARACHUTE) < 0 ) {
return(FALSE);
}
atexit(cleanup_output);
atexit(sdl.Quit);
#ifndef DISABLE_VIDEO
/* Sam:
We still need to pass in the application handle so that
DirectInput will initialize properly when SDL_RegisterApp()
is called later in the video initialization.
*/
sdl.SetModuleHandle(GetModuleHandle(NULL));
#endif /* !DISABLE_VIDEO */
}
/* Run the application main() code */
n=SDL_main_env(argc, argv, env);
/* Exit cleanly, calling atexit() functions */
exit(n);
/* Hush little compiler, don't you cry... */
return(n);
}
/* This is where execution begins [windowed apps] */
#ifdef _WIN32_WCE
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPWSTR szCmdLine, int sw)
#else
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
#endif
{
HINSTANCE handle;
char **argv;
int argc;
char *cmdline;
#ifdef _WIN32_WCE
wchar_t *bufp;
int nLen;
#else
char *bufp;
#endif
#ifndef NO_STDIO_REDIRECT
FILE *newfp;
#endif
/* Start up DDHELP.EXE before opening any files, so DDHELP doesn't
keep them open. This is a hack.. hopefully it will be fixed
someday. DDHELP.EXE starts up the first time DDRAW.DLL is loaded.
*/
handle = LoadLibrary(TEXT("DDRAW.DLL"));
if ( handle != NULL ) {
FreeLibrary(handle);
}
#ifndef NO_STDIO_REDIRECT
_getcwd( stdoutPath, sizeof( stdoutPath ) );
strcat( stdoutPath, DIR_SEPERATOR STDOUT_FILE );
/* Redirect standard input and standard output */
newfp = freopen(stdoutPath, TEXT("w"), stdout);
#ifndef _WIN32_WCE
if ( newfp == NULL ) { /* This happens on NT */
#if !defined(stdout)
stdout = fopen(stdoutPath, TEXT("w"));
#else
newfp = fopen(stdoutPath, TEXT("w"));
if ( newfp ) {
*stdout = *newfp;
}
#endif
}
#endif /* _WIN32_WCE */
_getcwd( stderrPath, sizeof( stderrPath ) );
strcat( stderrPath, DIR_SEPERATOR STDERR_FILE );
newfp = freopen(stderrPath, TEXT("w"), stderr);
#ifndef _WIN32_WCE
if ( newfp == NULL ) { /* This happens on NT */
#if !defined(stderr)
stderr = fopen(stderrPath, TEXT("w"));
#else
newfp = fopen(stderrPath, TEXT("w"));
if ( newfp ) {
*stderr = *newfp;
}
#endif
}
#endif /* _WIN32_WCE */
setvbuf(stdout, NULL, _IOLBF, BUFSIZ); /* Line buffered */
setbuf(stderr, NULL); /* No buffering */
#endif /* !NO_STDIO_REDIRECT */
#ifdef _WIN32_WCE
nLen = wcslen(szCmdLine)+128+1;
bufp = (wchar_t *)alloca(nLen*2);
wcscpy (bufp, TEXT("\""));
GetModuleFileName(NULL, bufp+1, 128-3);
wcscpy (bufp+wcslen(bufp), TEXT("\" "));
wcsncpy(bufp+wcslen(bufp), szCmdLine,nLen-wcslen(bufp));
nLen = wcslen(bufp)+1;
cmdline = (char *)alloca(nLen);
if ( cmdline == NULL ) {
return OutOfMemory();
}
WideCharToMultiByte(CP_ACP, 0, bufp, -1, cmdline, nLen, NULL, NULL);
#else
/* Grab the command line (use alloca() on Windows) */
bufp = GetCommandLine();
cmdline = (char *)alloca(strlen(bufp)+1);
if ( cmdline == NULL ) {
return OutOfMemory();
}
strcpy(cmdline, bufp);
#endif
/* Parse it into argv and argc */
argc = ParseCommandLine(cmdline, NULL);
argv = (char **)alloca((argc+1)*(sizeof *argv));
if ( argv == NULL ) {
return OutOfMemory();
}
ParseCommandLine(cmdline, argv);
/* Run the main program (after a little SDL initialization) */
return(console_main(argc, argv, _environ));
}
#include <stdio.h> /* NULL */
#include "gen_defs.h"
#include "sdlfuncs.h"
#ifndef _WIN32
struct sdlfuncs sdl;
#endif
static int sdl_funcs_loaded=0;
static int sdl_initialized=0;
static int sdl_audio_initialized=0;
static int sdl_video_initialized=0;
#ifdef STATIC_SDL
int load_sdl_funcs(struct sdlfuncs *sdlf)
{
sdlf->gotfuncs=0;
sdlf->Init=SDL_Init;
sdlf->Quit=SDL_Quit;
#ifdef _WIN32
sdlf->SetModuleHandle=SDL_SetModuleHandle;
#endif
sdlf->mutexP=SDL_mutexP;
sdlf->mutexV=SDL_mutexV;
sdlf->PeepEvents=SDL_PeepEvents;
sdlf->VideoDriverName=SDL_VideoDriverName;
sdlf->SemWait=SDL_SemWait;
sdlf->SemPost=SDL_SemPost;
sdlf->EventState=SDL_EventState;
sdlf->CreateRGBSurface=SDL_CreateRGBSurface;
sdlf->FillRect=SDL_FillRect;
sdlf->SetColors=SDL_SetColors;
sdlf->BlitSurface=SDL_UpperBlit;
sdlf->UpdateRects=SDL_UpdateRects;
sdlf->SDL_CreateSemaphore=SDL_CreateSemaphore;
sdlf->SDL_CreateMutex=SDL_CreateMutex;
sdlf->CreateThread=SDL_CreateThread;
sdlf->WaitEvent=SDL_WaitEvent;
sdlf->SetVideoMode=SDL_SetVideoMode;
sdlf->FreeSurface=SDL_FreeSurface;
sdlf->WM_SetCaption=SDL_WM_SetCaption;
sdlf->ShowCursor=SDL_ShowCursor;
sdlf->WasInit=SDL_WasInit;
sdlf->EnableUNICODE=SDL_EnableUNICODE;
sdlf->EnableKeyRepeat=SDL_EnableKeyRepeat;
sdlf->GetWMInfo=SDL_GetWMInfo;
sdlf->GetError=SDL_GetError;
sdlf->InitSubSystem=SDL_InitSubSystem;
sdlf->QuitSubSystem=SDL_QuitSubSystem;
sdlf->gotfuncs=1;
sdl_funcs_loaded=1;
return(0);
}
#else
#if defined(_WIN32)
#include <Windows.h>
int load_sdl_funcs(struct sdlfuncs *sdlf)
{
HMODULE sdl_dll;
sdlf->gotfuncs=0;
if((sdl_dll=LoadLibrary("SDL.dll"))==NULL)
if((sdl_dll=LoadLibrary("SDL-1.2.dll"))==NULL)
if((sdl_dll=LoadLibrary("SDL-1.1.dll"))==NULL)
return(-1);
if((sdlf->Init=GetProcAddress(sdl_dll, "SDL_Init"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->Quit=GetProcAddress(sdl_dll, "SDL_Quit"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SetModuleHandle=GetProcAddress(sdl_dll, "SDL_SetModuleHandle"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->mutexP=GetProcAddress(sdl_dll, "SDL_mutexP"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->mutexV=GetProcAddress(sdl_dll, "SDL_mutexV"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->PeepEvents=GetProcAddress(sdl_dll, "SDL_PeepEvents"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->VideoDriverName=GetProcAddress(sdl_dll, "SDL_VideoDriverName"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SemWait=GetProcAddress(sdl_dll, "SDL_SemWait"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SemPost=GetProcAddress(sdl_dll, "SDL_SemPost"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->EventState=GetProcAddress(sdl_dll, "SDL_EventState"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->CreateRGBSurface=GetProcAddress(sdl_dll, "SDL_CreateRGBSurface"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->FillRect=GetProcAddress(sdl_dll, "SDL_FillRect"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SetColors=GetProcAddress(sdl_dll, "SDL_SetColors"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->BlitSurface=GetProcAddress(sdl_dll, "SDL_UpperBlit"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->UpdateRects=GetProcAddress(sdl_dll, "SDL_UpdateRects"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SDL_CreateSemaphore=GetProcAddress(sdl_dll, "SDL_CreateSemaphore"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SDL_CreateMutex=GetProcAddress(sdl_dll, "SDL_CreateMutex"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->CreateThread=GetProcAddress(sdl_dll, "SDL_CreateThread"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->WaitEvent=GetProcAddress(sdl_dll, "SDL_WaitEvent"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->SetVideoMode=GetProcAddress(sdl_dll, "SDL_SetVideoMode"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->FreeSurface=GetProcAddress(sdl_dll, "SDL_FreeSurface"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->WM_SetCaption=GetProcAddress(sdl_dll, "SDL_WM_SetCaption"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->ShowCursor=GetProcAddress(sdl_dll, "SDL_ShowCursor"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->WasInit=GetProcAddress(sdl_dll, "SDL_WasInit"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->EnableUNICODE=GetProcAddress(sdl_dll, "SDL_EnableUNICODE"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->EnableKeyRepeat=GetProcAddress(sdl_dll, "SDL_EnableKeyRepeat"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->GetWMInfo=GetProcAddress(sdl_dll, "SDL_GetWMInfo"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->GetError=GetProcAddress(sdl_dll, "SDL_GetError"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->InitSubSystem=GetProcAddress(sdl_dll, "SDL_InitSubSystem"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
if((sdlf->QuitSubSystem=GetProcAddress(sdl_dll, "SDL_QuitSubSystem"))==NULL) {
FreeLibrary(sdl_dll);
return(-1);
}
sdlf->gotfuncs=1;
sdl_funcs_loaded=1;
return(0);
}
#elif defined(__unix__)
#include <dlfcn.h>
int load_sdl_funcs(struct sdlfuncs *sdlf)
{
void *sdl_dll;
sdlf->gotfuncs=0;
if((sdl_dll=dlopen("libSDL.so",RTLD_LAZY|RTLD_GLOBAL))==NULL)
if((sdl_dll=dlopen("libSDL-1.2.so",RTLD_LAZY|RTLD_GLOBAL))==NULL)
if((sdl_dll=dlopen("libSDL-1.1.so",RTLD_LAZY|RTLD_GLOBAL))==NULL)
return(-1);
if((sdlf->Init=dlsym(sdl_dll, "SDL_Init"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->Quit=dlsym(sdl_dll, "SDL_Quit"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->mutexP=dlsym(sdl_dll, "SDL_mutexP"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->mutexV=dlsym(sdl_dll, "SDL_mutexV"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->PeepEvents=dlsym(sdl_dll, "SDL_PeepEvents"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->VideoDriverName=dlsym(sdl_dll, "SDL_VideoDriverName"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SemWait=dlsym(sdl_dll, "SDL_SemWait"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SemPost=dlsym(sdl_dll, "SDL_SemPost"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->EventState=dlsym(sdl_dll, "SDL_EventState"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->CreateRGBSurface=dlsym(sdl_dll, "SDL_CreateRGBSurface"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->FillRect=dlsym(sdl_dll, "SDL_FillRect"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SetColors=dlsym(sdl_dll, "SDL_SetColors"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->BlitSurface=dlsym(sdl_dll, "SDL_UpperBlit"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->UpdateRects=dlsym(sdl_dll, "SDL_UpdateRects"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SDL_CreateSemaphore=dlsym(sdl_dll, "SDL_CreateSemaphore"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SDL_CreateMutex=dlsym(sdl_dll, "SDL_CreateMutex"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->CreateThread=dlsym(sdl_dll, "SDL_CreateThread"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->WaitEvent=dlsym(sdl_dll, "SDL_WaitEvent"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->SetVideoMode=dlsym(sdl_dll, "SDL_SetVideoMode"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->FreeSurface=dlsym(sdl_dll, "SDL_FreeSurface"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->WM_SetCaption=dlsym(sdl_dll, "SDL_WM_SetCaption"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->ShowCursor=dlsym(sdl_dll, "SDL_ShowCursor"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->WasInit=dlsym(sdl_dll, "SDL_WasInit"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->EnableUNICODE=dlsym(sdl_dll, "SDL_EnableUNICODE"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->EnableKeyRepeat=dlsym(sdl_dll, "SDL_EnableKeyRepeat"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->GetWMInfo=dlsym(sdl_dll, "SDL_GetWMInfo"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
if((sdlf->GetError=dlsym(sdl_dll, "SDL_GetError"))==NULL) {
dlclose(sdl_dll);
return(-1);
}
sdlf->gotfuncs=1;
sdl_funcs_loaded=1;
return(0);
}
#endif
#endif
int init_sdl_video(void)
{
/* This is all handled in SDL_main_env() */
if(sdl_video_initialized)
return(0);
else
return(-1);
}
int init_sdl_audio(void)
{
if(!sdl_initialized)
return(-1);
if(sdl_audio_initialized)
return(0);
if(sdl.InitSubSystem(SDL_INIT_AUDIO)==0) {
sdl_audio_initialized=TRUE;
return(0);
}
return(-1);
}
/* atexit() function */
static void sdl_exit(void)
{
sdl.Quit();
}
#ifndef main
int main(int argc, char **argv, char **env)
#else
int SDL_main_env(int argc, char **argv, char **env)
#endif
{
unsigned int i;
SDL_Event ev;
char drivername[64];
#ifndef _WIN32
load_sdl_funcs(&sdl);
#endif
if(sdl.gotfuncs) {
#ifdef _WIN32
/* Fail to windib (ie: No mouse attached) */
if(sdl.Init(SDL_INIT_VIDEO)) {
if(getenv("SDL_VIDEODRIVER")==NULL) {
putenv("SDL_VIDEODRIVER=windib");
WinExec(GetCommandLine(), SW_SHOWDEFAULT);
exit(0);
}
sdl.gotfuncs=FALSE;
}
else {
sdl_video_initialized=TRUE;
}
#else
/*
* On Linux, SDL doesn't properly detect availability of the
* framebuffer apparently. This results in remote connections
* displaying on the local framebuffer... a definate no-no.
* This ugly hack attempts to prevent this... of course, remote X11
* connections must still be allowed.
*/
if(getenv("REMOTEHOST")!=NULL && getenv("DISPLAY")==NULL) {
/* Sure ,we can't use video, but audio is still valid! */
if(sdl.Init(0)==0)
sdl_initialized=TRUE;
sdl.gotfuncs=FALSE;
}
else {
if(sdl.Init(SDL_INIT_VIDEO))
sdl.gotfuncs=FALSE;
else {
sdl_initialized=TRUE;
sdl_video_initialized=TRUE;
}
}
#endif
if(sdl_video_initialized && sdl.VideoDriverName(drivername, sizeof(drivername))!=NULL) {
/* Unacceptable drivers */
if((!strcmp(drivername, "caca")) || (!strcmp(drivername,"aalib")) || (!strcmp(drivername,"dummy"))) {
sdl.gotfuncs=FALSE;
sdl.QuitSubSystem(SDL_INIT_VIDEO);
sdl_video_initialized=FALSE;
}
else {
sdl_video_initialized=TRUE;
}
}
}
if(sdl_initialized)
atexit(sdl_exit);
return(CIOLIB_main(argc, argv, env));
}
#ifndef _SDLFUNCS_H_
#define _SDLFUNCS_H_
#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_syswm.h"
struct sdlfuncs {
int (*Init) (Uint32 flags);
void (*Quit) (void);
void (*SetModuleHandle) (void *hInst);
int (*mutexP) (SDL_mutex *mutex);
int (*mutexV) (SDL_mutex *mutex);
int (*PeepEvents) (SDL_Event *events, int numevents,
SDL_eventaction action, Uint32 mask);
char *(*VideoDriverName) (char *namebuf, int maxlen);
int (*SemWait) (SDL_sem *sem);
int (*SemPost) (SDL_sem *sem);
Uint8 (*EventState) (Uint8 type, int state);
SDL_Surface *(*CreateRGBSurface) (Uint32 flags, int width, int height, int depth,
Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
int (*FillRect) (SDL_Surface *dst, SDL_Rect *dstrect, Uint32 color);
int (*SetColors) (SDL_Surface *surface, SDL_Color *colors, int firstcolor, int ncolors);
int (*BlitSurface) (SDL_Surface *src, SDL_Rect *srcrect,
SDL_Surface *dst, SDL_Rect *dstrect);
void (*UpdateRects) (SDL_Surface *screen, int numrects, SDL_Rect *rects);
SDL_sem *(*SDL_CreateSemaphore) (Uint32 initial_value);
SDL_mutex *(*SDL_CreateMutex) (void);
struct SDL_Thread *(*CreateThread) (int (*fn)(void *), void *data);
int (*WaitEvent) (SDL_Event *event);
SDL_Surface *(*SetVideoMode) (int width, int height, int bpp, Uint32 flags);
void (*FreeSurface) (SDL_Surface *surface);
void (*WM_SetCaption) (const char *title, const char *icon);
int (*ShowCursor) (int toggle);
Uint32 (*WasInit) (Uint32 flags);
int (*EnableUNICODE) (int enable);
int (*EnableKeyRepeat) (int delay, int interval);
int (*GetWMInfo) (struct SDL_SysWMinfo *info);
char *(*GetError) (void);
int (*InitSubSystem)(Uint32 flags);
void (*QuitSubSystem)(Uint32 flags);
int gotfuncs;
};
/* Defined in SDL_win32_main.c for Win32 */
extern struct sdlfuncs sdl;
#ifdef __cplusplus
extern "C" {
#endif
int load_sdl_funcs(struct sdlfuncs *sdlf);
int init_sdl_audio(void);
int init_sdl_video(void);
#ifdef __cplusplus
}
#endif
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment