X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fapp.cpp;h=c0e434d15b692de90912f06d7596a6fcb63f13e8;hb=00f18c4ebbfda2eb5a398cc3166c6ef1692c4f30;hp=7c2037f3a81273eb34e9ec6ddce8ac4cde59fc03;hpb=f30bf746981a99079e766b0d4e9de5391a4175ff;p=virtualjaguar diff --git a/src/gui/app.cpp b/src/gui/app.cpp index 7c2037f..c0e434d 100644 --- a/src/gui/app.cpp +++ b/src/gui/app.cpp @@ -11,63 +11,93 @@ // JLH 12/23/2009 Created this file // JLH 01/21/2011 Added SDL initialization // JLH 06/26/2011 Added fix to keep SDL from hijacking main() on win32 +// JLH 05/24/2012 Added option switches +// JLH 03/05/2013 Fixed console redireciton on win32 platform :-P // #include "app.h" #include #include +#include "gamepad.h" #include "log.h" #include "mainwin.h" +#include "profile.h" #include "settings.h" -#include "types.h" +#include "version.h" + -#ifdef __GCCWIN32__ // Apparently on win32, SDL is hijacking main from Qt. So let's do this: +#ifdef __GCCWIN32__ #undef main +#include // Ick, but needed for console redirection on win32 :-O #endif +// Function prototypes... +static bool ParseCommandLine(int argc, char * argv[]); +static void ParseOptions(int argc, char * argv[]); + + +//hm. :-/ +// This is stuff we pass into the mainWindow... +// Also, these are defaults. :-) +bool noUntunedTankPlease = false; +bool loadAndGo = false; +bool useLogfile = false; +QString filename; + // Here's the main application loop--short and simple... int main(int argc, char * argv[]) { + // Win32 console redirection, because MS and their band of super geniuses + // decided that nobody would ever launch an app from the command line. :-P + // [Unfortunately, this doesn't seem to work on Vista/7. :-(] +#ifdef __GCCWIN32__ + BOOL (WINAPI * AttachConsole)(DWORD dwProcessId); + + AttachConsole = (BOOL (WINAPI *)(DWORD)) + GetProcAddress(LoadLibraryA("kernel32.dll"), "AttachConsole"); + + if (AttachConsole != NULL && AttachConsole(((DWORD)-1))) + { + if (_fileno(stdout) == -1) + freopen("CONOUT$","wb",stdout); + if (_fileno(stderr) == -1) + freopen("CONOUT$","wb",stderr); + if (_fileno(stdin) == -1) + freopen("CONIN$","rb",stdin); + + // Fix C++ + std::ios::sync_with_stdio(); + } +#endif + // Normally, this would be read in from the settings module... :-P vjs.hardwareTypeAlpine = false; + // This is stuff we pass into the mainWindow... +// noUntunedTankPlease = false; - if (argc > 1) + // Check for options that must be in place be constructing the App object + if (!ParseCommandLine(argc, argv)) { - if ((strcmp(argv[1], "--help") == 0) || (strcmp(argv[1], "-h") == 0) - || (strcmp(argv[1], "-?") == 0)) - { - printf("Virtual Jaguar 2.0.0 help\n"); - printf("\n"); - printf("Command line interface is mostly non-functional ATM, but may return if\n" - "there is enough demand for it. :-)\n"); - return 0; - } - if (strcmp(argv[1], "--yarrr") == 0) - { - printf("\n"); - printf("Shiver me timbers!\n"); - printf("\n"); - return 0; - } - if ((strcmp(argv[1], "--alpine") == 0) || (strcmp(argv[1], "-a") == 0)) - { - printf("Alpine Mode enabled.\n"); - vjs.hardwareTypeAlpine = true; - } + return 0; } Q_INIT_RESOURCE(virtualjaguar); // This must the same name as the exe filename //or is it the .qrc filename??? // This is so we can pass this stuff using signal/slot mechanism... +//this is left here to remind me not to try doing this again :-P //ick int id = qRegisterMetaType(); - bool success = (bool)LogInit("virtualjaguar.log"); // Init logfile int retVal = -1; // Default is failure - if (!success) - printf("Failed to open virtualjaguar.log for writing!\n"); + if (useLogfile) + { + bool success = (bool)LogInit("./virtualjaguar.log"); // Init logfile + + if (!success) + printf("Failed to open virtualjaguar.log for writing!\n"); + } // Set up SDL library if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0) @@ -78,21 +108,232 @@ int main(int argc, char * argv[]) { WriteLog("VJ: SDL (joystick, audio) successfully initialized.\n"); App app(argc, argv); // Declare an instance of the application + Gamepad::AllocateJoysticks(); + AutoConnectProfiles(); retVal = app.exec(); // And run it! + Gamepad::DeallocateJoysticks(); // Free SDL components last...! SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_AUDIO); SDL_Quit(); } +#ifdef __GCCWIN32__ +#if 0 + fclose(ctt); +#endif +#endif LogDone(); // Close logfile return retVal; } -// Main app constructor--we stick globally accessible stuff here... - -App::App(int argc, char * argv[]): QApplication(argc, argv) +// +// Main app constructor--we stick globally accessible stuff here... (?) +// +App::App(int & argc, char * argv[]): QApplication(argc, argv) { - mainWindow = new MainWin(); + bool loadAndGo = !filename.isEmpty(); + + mainWindow = new MainWin(loadAndGo); + mainWindow->plzDontKillMyComputer = noUntunedTankPlease; + ParseOptions(argc, argv); // Override defaults with command line (if any) + mainWindow->SyncUI(); + + if (loadAndGo) + mainWindow->LoadFile(filename); + mainWindow->show(); } + + +// +// Here we parse out stuff that needs to be looked at *before* we construct the +// App object. +// +bool ParseCommandLine(int argc, char * argv[]) +{ + for(int i=1; i] [switches]\n" + "\n" + " Option Description\n" + " ---------------- -----------------------------------\n" + " Name of file to autoload\n" + " --alpine -a Put Virtual Jaguar into Alpine mode\n" + " --pal -p PAL mode\n" + " --ntsc -n NTSC mode\n" + " --bios -b Boot using Jagaur BIOS\n" + " --no-bios Do not use Jaguar BIOS\n" + " --gpu -g Enable GPU\n" + " --no-gpu Disable GPU\n" + " --dsp -d Enable DSP\n" + " --no-dsp Disable DSP\n" + " --fullscreen -f Start in full screen mode\n" + " --blur -B Enable GL bilinear filter\n" + " --no-blur Disable GL bilinear filtering\n" + " --log -l Create and use log file\n" + " --no-log Do not use log file\n" + " --help -h Show this message\n" + " --please-dont-kill-my-computer\n" + " -z Run Virtual Jaguar without \"snow\"\n" + "\n" + "Invoking Virtual Jagaur with no filename will cause it to boot up\n" + "with the VJ GUI. Using Alpine mode will enable log file.\n" + "\n"); + return false; + } + + if (strcmp(argv[i], "--yarrr") == 0) + { + printf("\n"); + printf("Shiver me timbers!\n"); + printf("\n"); + return false; + } + + if ((strcmp(argv[i], "--alpine") == 0) || (strcmp(argv[i], "-a") == 0)) + { + printf("Alpine Mode enabled.\n"); + vjs.hardwareTypeAlpine = true; + // We also enable logging as well :-) + useLogfile = true; + } + + if ((strcmp(argv[i], "--please-dont-kill-my-computer") == 0) || (strcmp(argv[i], "-z") == 0)) + { + noUntunedTankPlease = true; + } + + if ((strcmp(argv[i], "--log") == 0) || (strcmp(argv[i], "-l") == 0)) + { + useLogfile = true; + } + + if (strcmp(argv[i], "--no-log") == 0) + { + useLogfile = false; + } + + // Check for filename + if (argv[i][0] != '-') + { + loadAndGo = true; + filename = argv[i]; + } + } + + return true; +} + + +// +// This is to override settings loaded from the config file. +// Note that settings set here will become the new defaults! +// (Not any more: Settings are only saved if the config dialog was OKed, or +// the toolbar buttons were pressed.) +// +void ParseOptions(int argc, char * argv[]) +{ + for(int i=1; i