X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fmainwin.cpp;h=713ec11abe9ec101dfe151d4abd71b1c6ed7741b;hb=3b0e8e7d6be25106bcfa0ee0c78faed597e9a2c6;hp=ba2c0dd2c4682025b5ac549581724e8f87d9939d;hpb=19e894a3a9d9aeb0fbb3bf10ead34bed35f15a05;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index ba2c0dd..713ec11 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -6,7 +6,7 @@ // JLH = James Hammons // // Who When What -// --- ---------- ------------------------------------------------------------- +// --- ---------- ------------------------------------------------------------ // JLH 12/23/2009 Created this file // JLH 12/20/2010 Added settings, menus & toolbars // JLH 07/05/2011 Added CD BIOS functionality to GUI @@ -16,14 +16,16 @@ // // - Add dbl click/enter to select in cart list, ESC to dimiss [DONE] // - Autoscan/autoload all available BIOS from 'software' folder [DONE] -// - Add 1 key jumping in cartridge list (press 'R', jumps to carts starting with 'R', etc) [DONE] +// - Add 1 key jumping in cartridge list (press 'R', jumps to carts starting +// with 'R', etc) [DONE] // - Controller configuration [DONE] // // STILL TO BE DONE: // // - Fix bug in switching between PAL & NTSC in fullscreen mode. // - Remove SDL dependencies (sound, mainly) from Jaguar core lib -// - Fix inconsistency with trailing slashes in paths (eeproms needs one, software doesn't) +// - Fix inconsistency with trailing slashes in paths (eeproms needs one, +// software doesn't) // // SFDX CODE: S1E9T8H5M23YS @@ -38,11 +40,13 @@ #include "app.h" #include "about.h" #include "configdialog.h" +#include "controllertab.h" #include "filepicker.h" #include "gamepad.h" #include "generaltab.h" #include "glwidget.h" #include "help.h" +#include "profile.h" #include "settings.h" #include "version.h" #include "debug/cpubrowser.h" @@ -82,7 +86,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), showUntunedTankCircuit(true), cartridgeLoaded(false), CDActive(false), - pauseForFileSelector(false), loadAndGo(autoRun), plzDontKillMyComputer(false) + pauseForFileSelector(false), loadAndGo(autoRun), scannedSoftwareFolder(false), plzDontKillMyComputer(false) { debugbar = NULL; @@ -391,6 +395,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), // Run the scanner if nothing passed in and *not* Alpine mode... // NB: Really need to look into caching the info scanned in here... filePickWin->ScanSoftwareFolder(allowUnknownSoftware); + scannedSoftwareFolder = true; } @@ -437,6 +442,11 @@ void MainWin::keyPressEvent(QKeyEvent * e) { // From jaguar.cpp extern bool startM68KTracing; + // From joystick.cpp + extern int blit_start_log; + // From blitter.cpp + extern bool startConciseBlitLogging; + // We ignore the Alt key for now, since it causes problems with the GUI if (e->key() == Qt::Key_Alt) @@ -450,8 +460,37 @@ void MainWin::keyPressEvent(QKeyEvent * e) e->accept(); return; } + else if (e->key() == Qt::Key_F12) + { + blit_start_log = true; + e->accept(); + return; + } + else if (e->key() == Qt::Key_F10) + { + startConciseBlitLogging = true; + e->accept(); + return; + } + else if (e->key() == Qt::Key_F8) + { + // ggn: For extra NYAN pleasure... + // ggn: There you go James :P + // Shamus: Thanks for the patch! :-D + WriteLog(" o + + +\n"); + WriteLog("+ o o + o\n"); + WriteLog("-_-_-_-_-_-_-_,------, o \n"); + WriteLog("_-_-_-_-_-_-_-| /\\_/\\ \n"); + WriteLog("-_-_-_-_-_-_-~|__( ^ .^) + + \n"); + WriteLog("_-_-_-_-_-_-_-\"\" \"\" \n"); + WriteLog("+ o o + o\n"); + WriteLog(" + +\n"); + e->accept(); + return; + } /* +This is done now by a QAction... if (e->key() == Qt::Key_F9) { ToggleFullScreen(); @@ -479,40 +518,9 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) { enum { P1LEFT = 0, P1RIGHT, P1UP, P1DOWN, P2LEFT, P2RIGHT, P2UP, P2DOWN }; // We kill bad key combos here, before they can get to the emulator... - // This also kills the illegal instruction problem that cropped up in Rayman! - // May want to do this by killing the old one instead of ignoring the new one... - // Seems to work better that way... + // This also kills the illegal instruction problem that cropped up in + // Rayman! -// The problem with this approach is that it causes bad results because it doesn't do -// any checking of previous states. Need to come up with something better because this -// causes problems where the keyboard acts as if it were unresponsive. :-P -#if 0 - if ((e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R]) - || (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L]) - || (e->key() == vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D]) - || (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])) - return; -#else -#if 0 - if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R]) - joypad_0_buttons[BUTTON_R] = 0; - if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L]) - joypad_0_buttons[BUTTON_L] = 0; - if (e->key() == (int)vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D]) - joypad_0_buttons[BUTTON_D] = 0; - if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U]) - joypad_0_buttons[BUTTON_U] = 0; - - if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L] && joypad_1_buttons[BUTTON_R]) - joypad_1_buttons[BUTTON_R] = 0; - if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R] && joypad_1_buttons[BUTTON_L]) - joypad_1_buttons[BUTTON_L] = 0; - if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U] && joypad_1_buttons[BUTTON_D]) - joypad_1_buttons[BUTTON_D] = 0; - if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D] && joypad_1_buttons[BUTTON_U]) - joypad_1_buttons[BUTTON_U] = 0; -#else -//hrm, this still has sticky state problems... Ugh! // First, settle key states... if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L]) keyHeld[P1LEFT] = state; @@ -531,31 +539,34 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D]) keyHeld[P2DOWN] = state; - // Next, check for conflicts and bail out if there are any... - if ((keyHeld[P1LEFT] && keyHeld[P1RIGHT]) - || (keyHeld[P1UP] && keyHeld[P1DOWN]) - || (keyHeld[P2LEFT] && keyHeld[P2RIGHT]) - || (keyHeld[P2UP] && keyHeld[P2DOWN])) - return; -#endif -#endif + // Next, check for conflicts and kill 'em if there are any... + if (keyHeld[P1LEFT] && keyHeld[P1RIGHT]) + keyHeld[P1LEFT] = keyHeld[P1RIGHT] = false; + + if (keyHeld[P1UP] && keyHeld[P1DOWN]) + keyHeld[P1UP] = keyHeld[P1DOWN] = false; + + if (keyHeld[P2LEFT] && keyHeld[P2RIGHT]) + keyHeld[P2LEFT] = keyHeld[P2RIGHT] = false; - // No bad combos exist, let's stuff the emulator key buffers...! + if (keyHeld[P2UP] && keyHeld[P2DOWN]) + keyHeld[P2UP] = keyHeld[P2DOWN] = false; + + // No bad combos exist now, let's stuff the emulator key buffers...! for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++) { if (e->key() == (int)vjs.p1KeyBindings[i]) -// joypad_0_buttons[i] = (uint8)state; joypad0Buttons[i] = (state ? 0x01 : 0x00); -// Pad #2 is screwing up pad #1. Prolly a problem in joystick.cpp... -// So let's try to fix it there. :-P [DONE] if (e->key() == (int)vjs.p2KeyBindings[i]) -// joypad_1_buttons[i] = (uint8)state; joypad1Buttons[i] = (state ? 0x01 : 0x00); } } +// +// N.B.: The profile system AutoConnect functionality sets the gamepad IDs here. +// void MainWin::HandleGamepads(void) { Gamepad::Update(); @@ -563,10 +574,10 @@ void MainWin::HandleGamepads(void) for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++) { if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS)) - joypad0Buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00); + joypad0Buttons[i] = (Gamepad::GetState(gamepadIDSlot1, vjs.p1KeyBindings[i]) ? 0x01 : 0x00); if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS)) - joypad1Buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00); + joypad1Buttons[i] = (Gamepad::GetState(gamepadIDSlot2, vjs.p2KeyBindings[i]) ? 0x01 : 0x00); } } @@ -582,9 +593,17 @@ void MainWin::Configure(void) ConfigDialog dlg(this); //ick. dlg.generalTab->useUnknownSoftware->setChecked(allowUnknownSoftware); + dlg.controllerTab1->profileNum = lastEditedProfile; + dlg.controllerTab1->SetupLastUsedProfile(); +// maybe instead of this, we tell the controller tab to work on a copy that gets +// written if the user hits 'OK'. + SaveProfiles(); // Just in case user cancels if (dlg.exec() == false) + { + RestoreProfiles(); return; + } QString before = vjs.ROMPath; QString alpineBefore = vjs.alpineROMPath; @@ -601,6 +620,8 @@ void MainWin::Configure(void) bool allowOld = allowUnknownSoftware; //ick. allowUnknownSoftware = dlg.generalTab->useUnknownSoftware->isChecked(); + lastEditedProfile = dlg.controllerTab1->profileNum; + AutoConnectProfiles(); // We rescan the "software" folder if the user either changed the path or // checked/unchecked the "Allow unknown files" option in the config dialog. @@ -651,6 +672,16 @@ void MainWin::Configure(void) // void MainWin::Timer(void) { +#if 0 +static uint32_t ntscTickCount; + if (vjs.hardwareTypeNTSC) + { + ntscTickCount++; + ntscTickCount %= 3; + timer->start(16 + (ntscTickCount == 0 ? 1 : 0)); + } +#endif + if (!running) return; @@ -681,13 +712,14 @@ void MainWin::Timer(void) videoWidget->updateGL(); -#if 1 // FPS handling - // Approach: We use a ring buffer to store timestamps over a given amount - // of frames, then sum them to figure out the FPS. + // Approach: We use a ring buffer to store times (in ms) over a given + // amount of frames, then sum them to figure out the FPS. uint32_t timestamp = SDL_GetTicks(); // This assumes the ring buffer size is a power of 2 - ringBufferPointer = (ringBufferPointer + 1) & (RING_BUFFER_SIZE - 1); +// ringBufferPointer = (ringBufferPointer + 1) & (RING_BUFFER_SIZE - 1); + // Doing it this way is better. Ring buffer size can be arbitrary then. + ringBufferPointer = (ringBufferPointer + 1) % RING_BUFFER_SIZE; ringBuffer[ringBufferPointer] = timestamp - oldTimestamp; uint32_t elapsedTime = 0; @@ -698,18 +730,14 @@ void MainWin::Timer(void) if (elapsedTime == 0) elapsedTime = 1; -#if 0 - float framesPerSecond = ((float)RING_BUFFER_SIZE / (float)elapsedTime) * 1000.0; - statusBar()->showMessage(QString("%1 FPS").arg(framesPerSecond)); -#else // This is in frames per 10 seconds, so we can have 1 decimal uint32_t framesPerSecond = (uint32_t)(((float)RING_BUFFER_SIZE / (float)elapsedTime) * 10000.0); uint32_t fpsIntegerPart = framesPerSecond / 10; uint32_t fpsDecimalPart = framesPerSecond % 10; + // If this is updated too frequently to be useful, we can throttle it down + // so that it only updates every 10th frame or so statusBar()->showMessage(QString("%1.%2 FPS").arg(fpsIntegerPart).arg(fpsDecimalPart)); -#endif oldTimestamp = timestamp; -#endif } @@ -862,6 +890,14 @@ void MainWin::ShowHelpWin(void) void MainWin::InsertCart(void) { + // Check to see if we did autorun, 'cause we didn't load anything in that + // case + if (!scannedSoftwareFolder) + { + filePickWin->ScanSoftwareFolder(allowUnknownSoftware); + scannedSoftwareFolder = true; + } + // If the emulator is running, we pause it here and unpause it later // if we dismiss the file selector without choosing anything if (running && powerButtonOn) @@ -1077,6 +1113,7 @@ void MainWin::ReadSettings(void) zoomLevel = settings.value("zoom", 2).toInt(); allowUnknownSoftware = settings.value("showUnknownSoftware", false).toBool(); + lastEditedProfile = settings.value("lastEditedProfile", 0).toInt(); vjs.useJoystick = settings.value("useJoystick", false).toBool(); vjs.joyport = settings.value("joyport", 0).toInt(); @@ -1084,7 +1121,7 @@ void MainWin::ReadSettings(void) vjs.frameSkip = settings.value("frameSkip", 0).toInt(); vjs.useJaguarBIOS = settings.value("useJaguarBIOS", false).toBool(); vjs.GPUEnabled = settings.value("GPUEnabled", true).toBool(); - vjs.DSPEnabled = settings.value("DSPEnabled", false).toBool(); + vjs.DSPEnabled = settings.value("DSPEnabled", true).toBool(); vjs.audioEnabled = settings.value("audioEnabled", true).toBool(); vjs.usePipelinedDSP = settings.value("usePipelinedDSP", false).toBool(); vjs.fullscreen = settings.value("fullscreen", false).toBool(); @@ -1093,8 +1130,9 @@ void MainWin::ReadSettings(void) vjs.renderType = settings.value("renderType", 0).toInt(); vjs.allowWritesToROM = settings.value("writeROM", false).toBool(); vjs.biosType = settings.value("biosType", BT_M_SERIES).toInt(); - strcpy(vjs.EEPROMPath, settings.value("EEPROMs", "./eeproms/").toString().toAscii().data()); - strcpy(vjs.ROMPath, settings.value("ROMs", "./software/").toString().toAscii().data()); + vjs.useFastBlitter = settings.value("useFastBlitter", false).toBool(); + strcpy(vjs.EEPROMPath, settings.value("EEPROMs", QDesktopServices::storageLocation(QDesktopServices::DataLocation).append("/eeproms/")).toString().toAscii().data()); + strcpy(vjs.ROMPath, settings.value("ROMs", QDesktopServices::storageLocation(QDesktopServices::DataLocation).append("/software/")).toString().toAscii().data()); strcpy(vjs.alpineROMPath, settings.value("DefaultROM", "").toString().toAscii().data()); strcpy(vjs.absROMPath, settings.value("DefaultABS", "").toString().toAscii().data()); @@ -1149,6 +1187,8 @@ WriteLog("Pipelined DSP = %s\n", (vjs.usePipelinedDSP ? "ON" : "off")); vjs.p2KeyBindings[BUTTON_9] = settings.value("p2k_9", Qt::Key_9).toInt(); vjs.p2KeyBindings[BUTTON_d] = settings.value("p2k_pound", Qt::Key_Slash).toInt(); vjs.p2KeyBindings[BUTTON_s] = settings.value("p2k_star", Qt::Key_Asterisk).toInt(); + + ReadProfiles(&settings); } @@ -1161,6 +1201,7 @@ void MainWin::WriteSettings(void) settings.setValue("zoom", zoomLevel); settings.setValue("showUnknownSoftware", allowUnknownSoftware); + settings.setValue("lastEditedProfile", lastEditedProfile); settings.setValue("useJoystick", vjs.useJoystick); settings.setValue("joyport", vjs.joyport); @@ -1177,6 +1218,7 @@ void MainWin::WriteSettings(void) settings.setValue("renderType", vjs.renderType); settings.setValue("writeROM", vjs.allowWritesToROM); settings.setValue("biosType", vjs.biosType); + settings.setValue("useFastBlitter", vjs.useFastBlitter); settings.setValue("JagBootROM", vjs.jagBootPath); settings.setValue("CDBootROM", vjs.CDBootPath); settings.setValue("EEPROMs", vjs.EEPROMPath); @@ -1227,6 +1269,8 @@ void MainWin::WriteSettings(void) settings.setValue("p2k_9", vjs.p2KeyBindings[BUTTON_9]); settings.setValue("p2k_pound", vjs.p2KeyBindings[BUTTON_d]); settings.setValue("p2k_star", vjs.p2KeyBindings[BUTTON_s]); + + WriteProfiles(&settings); } @@ -1239,3 +1283,4 @@ void MainWin::WriteUISettings(void) settings.setValue("zoom", zoomLevel); } +