X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fapp.cpp;h=8cf3f1ea36159d02ac15ea9cf61dfd763b0249f5;hb=1249f1ad7191432e9fb8b3162ebb1d66a94fdcb9;hp=b313f66c6eba21bc35b76fd25b5af6151668a565;hpb=22df98479e3be04169e6c70f5d08dc56d4ccb4ed;p=virtualjaguar diff --git a/src/gui/app.cpp b/src/gui/app.cpp index b313f66..8cf3f1e 100644 --- a/src/gui/app.cpp +++ b/src/gui/app.cpp @@ -1,53 +1,104 @@ // // app.cpp - Qt-based GUI for Virtual Jaguar // -// by James L. Hammons +// by James Hammons // (C) 2010 Underground Software // -// JLH = James L. Hammons +// JLH = James Hammons // // Who When What // --- ---------- ------------------------------------------------------------- // 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 "types.h" +#include "profile.h" +#include "settings.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[]) { - if (argc > 1) + // 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 (strcmp(argv[1], "--help") == 0) - { - printf("Virtual Jaguar 2.0.0 help\n"); - printf("\n"); - printf("This is an experimental branch of Virtual Jaguar, how did you get it?\n"); - return 0; - } + 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; + + // Check for options that must be in place be constructing the App object + if (!ParseCommandLine(argc, argv)) + { + 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(); - LogInit("virtualjaguar.log"); // Init logfile int retVal = -1; // Default is failure + 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) { @@ -57,17 +108,240 @@ 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(); } - LogDone(); // Close logfile +#ifdef __GCCWIN32__ +#if 0 + fclose(ctt); +#endif +#endif + // Close logfile + LogDone(); 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; + // Override defaults with command line (if any) + ParseOptions(argc, argv); + mainWindow->SyncUI(); + + if (loadAndGo) + { + mainWindow->LoadFile(filename); + + if (!mainWindow->cartridgeLoaded) + printf("Could not load file \"%s\"!\n", filename.toAscii().data()); + } + 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