X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FOpenGL_Windows.cpp;h=18bb2b90382220146263b122d895ae84139f202b;hb=8fb50ec5e055324deda9c83f74eadfbe88338344;hp=0b9f46b360f391e26d062c6f9eeb20e479233810;hpb=f21957c66fdf4e71e0e08745394d64f6c46e9a5b;p=lugaru.git diff --git a/Source/OpenGL_Windows.cpp b/Source/OpenGL_Windows.cpp index 0b9f46b..18bb2b9 100644 --- a/Source/OpenGL_Windows.cpp +++ b/Source/OpenGL_Windows.cpp @@ -223,6 +223,25 @@ Boolean gDone = false, gfFrontProcess = true; Game * pgame = 0; + +static int _argc = 0; +static char **_argv = NULL; + +bool cmdline(const char *cmd) +{ + for (int i = 1; i < _argc; i++) + { + char *arg = _argv[i]; + while (*arg == '-') + arg++; + if (stricmp(arg, cmd) == 0) + return true; + } + + return false; +} + + // -------------------------------------------------------------------------- void ReportError (char * strError) @@ -438,6 +457,8 @@ static inline int clamp_sdl_mouse_button(Uint8 button) static void sdlEventProc(const SDL_Event &e, Game &game) { int val; + SDLMod mod; + switch(e.type) { case SDL_MOUSEMOTION: @@ -504,19 +525,20 @@ static void sdlEventProc(const SDL_Event &e, Game &game) SDL_WM_ToggleFullScreen(SDL_GetVideoSurface()); } - if (e.key.keysym.sym < SDLK_LAST) + else if (e.key.keysym.sym < SDLK_LAST) { if (KeyTable[e.key.keysym.sym] != 0xffff) SetKey(KeyTable[e.key.keysym.sym]); } - if (e.key.keysym.mod & KMOD_CTRL) + mod = SDL_GetModState(); + if (mod & KMOD_CTRL) SetKey(MAC_CONTROL_KEY); - if (e.key.keysym.mod & KMOD_ALT) + if (mod & KMOD_ALT) SetKey(MAC_OPTION_KEY); - if (e.key.keysym.mod & KMOD_SHIFT) + if (mod & KMOD_SHIFT) SetKey(MAC_SHIFT_KEY); - if (e.key.keysym.mod & KMOD_CAPS) + if (mod & KMOD_CAPS) SetKey(MAC_CAPS_LOCK_KEY); return; @@ -528,13 +550,14 @@ static void sdlEventProc(const SDL_Event &e, Game &game) ClearKey(KeyTable[e.key.keysym.sym]); } - if (e.key.keysym.mod & KMOD_CTRL) + mod = SDL_GetModState(); + if ((mod & KMOD_CTRL) == 0) ClearKey(MAC_CONTROL_KEY); - if (e.key.keysym.mod & KMOD_ALT) + if ((mod & KMOD_ALT) == 0) ClearKey(MAC_OPTION_KEY); - if (e.key.keysym.mod & KMOD_SHIFT) + if ((mod & KMOD_SHIFT) == 0) ClearKey(MAC_SHIFT_KEY); - if (e.key.keysym.mod & KMOD_CAPS) + if ((mod & KMOD_CAPS) == 0) ClearKey(MAC_CAPS_LOCK_KEY); return; } @@ -862,9 +885,17 @@ Boolean SetUp (Game & game) return false; } - Uint32 sdlflags = SDL_OPENGL; // !!! FIXME: SDL_FULLSCREEN? + Uint32 sdlflags = SDL_OPENGL; + if (!cmdline("windowed")) + sdlflags |= SDL_FULLSCREEN; + SDL_WM_SetCaption("Lugaru", "lugaru"); + + if (!cmdline("nomousegrab")) + SDL_WM_GrabInput(SDL_GRAB_ON); + SDL_ShowCursor(0); + if (SDL_SetVideoMode(kContextWidth, kContextHeight, 0, sdlflags) == NULL) { fprintf(stderr, "SDL_SetVideoMode() failed: %s\n", SDL_GetError()); @@ -872,7 +903,6 @@ Boolean SetUp (Game & game) } - #elif (defined WIN32) //------------------------------------------------------------------ // create window @@ -1402,8 +1432,104 @@ static void launch_web_browser(const char *url) #endif } -int main (void) + +#ifndef WIN32 +// (code lifted from physfs: http://icculus.org/physfs/ ... zlib license.) +static char *findBinaryInPath(const char *bin, char *envr) +{ + size_t alloc_size = 0; + char *exe = NULL; + char *start = envr; + char *ptr; + + do + { + size_t size; + ptr = strchr(start, ':'); /* find next $PATH separator. */ + if (ptr) + *ptr = '\0'; + + size = strlen(start) + strlen(bin) + 2; + if (size > alloc_size) + { + char *x = (char *) realloc(exe, size); + if (x == NULL) + { + if (exe != NULL) + free(exe); + return(NULL); + } /* if */ + + alloc_size = size; + exe = x; + } /* if */ + + /* build full binary path... */ + strcpy(exe, start); + if ((exe[0] == '\0') || (exe[strlen(exe) - 1] != '/')) + strcat(exe, "/"); + strcat(exe, bin); + + if (access(exe, X_OK) == 0) /* Exists as executable? We're done. */ + { + strcpy(exe, start); /* i'm lazy. piss off. */ + return(exe); + } /* if */ + + start = ptr + 1; /* start points to beginning of next element. */ + } while (ptr != NULL); + + if (exe != NULL) + free(exe); + + return(NULL); /* doesn't exist in path. */ +} /* findBinaryInPath */ + + +char *calcBaseDir(const char *argv0) +{ + /* If there isn't a path on argv0, then look through the $PATH for it. */ + char *retval; + char *envr; + + char *ptr = strrchr(argv0, '/'); + if (strchr(argv0, '/')) + { + retval = strdup(argv0); + if (retval) + *(strrchr(retval, '/')) = '\0'; + return(retval); + } + + envr = getenv("PATH"); + if (!envr) return NULL; + envr = strdup(envr); + if (!envr) return NULL; + retval = findBinaryInPath(argv0, envr); + free(envr); + return(retval); +} + +static inline void chdirToAppPath(const char *argv0) +{ + char *dir = calcBaseDir(argv0); + if (dir) + { + chdir(dir); + free(dir); + } +} +#endif + + +int main(int argc, char **argv) { + _argc = argc; + _argv = argv; +#ifndef WIN32 + chdirToAppPath(argv[0]); +#endif + LOGFUNC; #ifndef WIN32 // this is in WinMain, too. @@ -2071,6 +2197,7 @@ int main (void) if(width==840 && height==524)whichres=5; if(width==1024 && height==640)whichres=6; if(width==1344 && height==840)whichres=7; + if(width==1920 && height==1200)whichres=8; return whichres; } @@ -2087,6 +2214,7 @@ int main (void) if(width==840 && height==524)whichres=5; if(width==1024 && height==640)whichres=6; if(width==1344 && height==840)whichres=7; + if(width>=1920 && height>=1200)whichres=8; return whichres; } @@ -2098,7 +2226,7 @@ int main (void) while (true) { - if(whichres<=0 || whichres>7){ + if(whichres<=0 || whichres>8){ whichres = 0; width=640; height=480; @@ -2131,6 +2259,16 @@ int main (void) width=1344; height=840; } + if(whichres==8){ + width=1920; + height=1200; + } + + // currently with SDL, we just use whatever the native bitdepth + // of the display is and don't care. + #if USE_SDL + break; + #endif if ((detail != 0) && (resolutionDepths[whichres][1] != 0)) { @@ -2146,7 +2284,9 @@ int main (void) detail = 0; break; } - else if (0 == whichres) + else + + if (0 == whichres) { break; } @@ -2215,7 +2355,7 @@ int main (void) g_appInstance=hInstance; - main(); + main(0, NULL); UnregisterClass( g_wndClassName, hInstance);