diff --git a/docs/index.html b/docs/index.html index 246b84390..5c5204863 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1767,6 +1767,24 @@ Alt + Up arrow Cmd + Up arrow + + + Decrease current setting (*) + PageDown + PageDown + + + + Increase current setting (*) + PageUp + PageUp + + + +
+ (*) Note: These keys allow easy changing of the current displayed selection (e.g. volume (default), + phosphor, zoom...) without having to use the original keys.
+

UI keys in Text Editing areas (cannot be remapped)

diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx index fc2c78722..95cef05e8 100644 --- a/src/common/PKeyboardHandler.cxx +++ b/src/common/PKeyboardHandler.cxx @@ -493,11 +493,14 @@ PhysicalKeyboardHandler::EventMappingArray PhysicalKeyboardHandler::DefaultCommo {Event::ToggleColorLoss, KBDK_L, KBDM_CTRL}, {Event::PaletteDecrease, KBDK_P, KBDM_SHIFT | KBDM_CTRL}, {Event::PaletteIncrease, KBDK_P, KBDM_CTRL}, + {Event::SettingDecrease, KBDK_PAGEDOWN}, + {Event::SettingIncrease, KBDK_PAGEUP}, {Event::ToggleInter, KBDK_I, KBDM_CTRL}, {Event::ToggleTurbo, KBDK_T, KBDM_CTRL}, {Event::ToggleJitter, KBDK_J, MOD3}, {Event::ToggleFrameStats, KBDK_L, MOD3}, {Event::ToggleTimeMachine, KBDK_T, MOD3}, + #ifdef PNG_SUPPORT {Event::ToggleContSnapshots, KBDK_S, MOD3}, {Event::ToggleContSnapshotsFrame, KBDK_S, KBDM_SHIFT | MOD3}, diff --git a/src/common/PaletteHandler.cxx b/src/common/PaletteHandler.cxx index f040fe8e5..2c04ccd3b 100644 --- a/src/common/PaletteHandler.cxx +++ b/src/common/PaletteHandler.cxx @@ -55,7 +55,7 @@ string PaletteHandler::toPaletteName(PaletteType type) const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PaletteHandler::cyclePalette(bool next) +AdjustFunction PaletteHandler::cyclePalette(bool next) { const string MESSAGES[PaletteType::NumTypes] = { "Standard Stella", "Z26", "User-defined", "Custom" @@ -89,6 +89,7 @@ void PaletteHandler::cyclePalette(bool next) myOSystem.frameBuffer().showMessage(message); setPalette(palette); + return std::bind(&PaletteHandler::cyclePalette, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -112,12 +113,13 @@ void PaletteHandler::showAdjustableMessage() { const int value = scaleTo100(*myAdjustables[myCurrentAdjustable].value); buf << value << "%"; - myOSystem.frameBuffer().showMessage(msg.str(), buf.str(), value); + myOSystem.frameBuffer().showMessage( + msg.str(), buf.str(), value); } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PaletteHandler::cycleAdjustable(bool next) +AdjustFunction PaletteHandler::cycleAdjustable(bool next) { const bool isCustomPalette = SETTING_CUSTOM == myOSystem.settings().getString("palette"); bool isPhaseShift; @@ -141,10 +143,11 @@ void PaletteHandler::cycleAdjustable(bool next) } while(isPhaseShift && !isCustomPalette); showAdjustableMessage(); + return std::bind(&PaletteHandler::changeAdjustable, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void PaletteHandler::changeAdjustable(bool increase) +AdjustFunction PaletteHandler::changeAdjustable(bool increase) { if(myAdjustables[myCurrentAdjustable].value == nullptr) changeColorPhaseShift(increase); @@ -163,6 +166,7 @@ void PaletteHandler::changeAdjustable(bool increase) showAdjustableMessage(); setPalette(); } + return std::bind(&PaletteHandler::changeAdjustable, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/common/PaletteHandler.hxx b/src/common/PaletteHandler.hxx index e8e083a8a..7a4b8676d 100644 --- a/src/common/PaletteHandler.hxx +++ b/src/common/PaletteHandler.hxx @@ -21,6 +21,7 @@ #include "bspf.hxx" #include "OSystem.hxx" #include "ConsoleTiming.hxx" +#include "EventHandlerConstants.hxx" class PaletteHandler { @@ -51,21 +52,21 @@ class PaletteHandler @param next Select next palette, else previous one */ - void cyclePalette(bool next = true); + AdjustFunction cyclePalette(bool next = true); /* Cycle through each palette adjustable. @param next Select next adjustable, else previous one */ - void cycleAdjustable(bool next = true); + AdjustFunction cycleAdjustable(bool next = true); /* Increase or decrease current palette adjustable. @param increase Increase adjustable if true, else decrease */ - void changeAdjustable(bool increase = true); + AdjustFunction changeAdjustable(bool increase = true); // Load adjustables from settings void loadConfig(const Settings& settings); @@ -129,7 +130,7 @@ class PaletteHandler string toPaletteName(PaletteType type) const; /** - Display current adjustable with bar gauge message + Display current adjustable with gauge bar message */ void showAdjustableMessage(); diff --git a/src/common/SoundNull.hxx b/src/common/SoundNull.hxx index f2aafbff8..ef07090a3 100644 --- a/src/common/SoundNull.hxx +++ b/src/common/SoundNull.hxx @@ -97,10 +97,10 @@ class SoundNull : public Sound /** Adjusts the volume of the sound device based on the given direction. - @param direction Increase or decrease the current volume by a predefined - amount based on the direction (1 = increase, -1 =decrease) + @param increase Increase or decrease the current volume by a predefined + amount */ - void adjustVolume(Int8 direction) override { } + AdjustFunction adjustVolume(bool increase) override { return nullptr; } /** This method is called to provide information about the sound device. diff --git a/src/common/SoundSDL2.cxx b/src/common/SoundSDL2.cxx index 85489abb5..234e4aae7 100644 --- a/src/common/SoundSDL2.cxx +++ b/src/common/SoundSDL2.cxx @@ -186,16 +186,31 @@ bool SoundSDL2::mute(bool state) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool SoundSDL2::toggleMute() { - bool enabled = myAudioSettings.enabled(); + bool enabled = !myAudioSettings.enabled(); - setEnabled(!enabled); + setEnabled(enabled); myOSystem.console().initializeAudio(); string message = "Sound "; - message += !enabled ? "unmuted" : "muted"; + message += enabled ? "unmuted" : "muted"; myOSystem.frameBuffer().showMessage(message); + //ostringstream strval; + //uInt32 volume; + //// Now show an onscreen message + //if(enabled) + //{ + // volume = myVolume; + // strval << volume << "%"; + //} + //else + //{ + // volume = 0; + // strval << "Muted"; + //} + //myOSystem.frameBuffer().showMessage("Volume", strval.str(), volume); + return enabled; } @@ -214,17 +229,12 @@ void SoundSDL2::setVolume(uInt32 percent) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void SoundSDL2::adjustVolume(Int8 direction) +AdjustFunction SoundSDL2::adjustVolume(bool increase) { ostringstream strval; - Int32 percent = myVolume; - if(direction == -1) - percent -= 2; - else if(direction == 1) - percent += 2; - percent = BSPF::clamp(percent, 0, 100); + percent = BSPF::clamp(percent += increase ? 2 : -2, 0, 100); setVolume(percent); @@ -243,6 +253,7 @@ void SoundSDL2::adjustVolume(Int8 direction) else strval << "Off"; myOSystem.frameBuffer().showMessage("Volume", strval.str(), percent); + return std::bind(&SoundSDL2::adjustVolume, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/common/SoundSDL2.hxx b/src/common/SoundSDL2.hxx index 613e6980d..bea035dd3 100644 --- a/src/common/SoundSDL2.hxx +++ b/src/common/SoundSDL2.hxx @@ -98,10 +98,10 @@ class SoundSDL2 : public Sound /** Adjusts the volume of the sound device based on the given direction. - @param direction Increase or decrease the current volume by a predefined - amount based on the direction (1 = increase, -1 = decrease) - */ - void adjustVolume(Int8 direction) override; + @param increase Increase or decrease the current volume by a predefined + amount + */ + AdjustFunction adjustVolume(bool increase) override; /** This method is called to provide information about the sound device. diff --git a/src/common/StateManager.cxx b/src/common/StateManager.cxx index 667665054..016b7a97a 100644 --- a/src/common/StateManager.cxx +++ b/src/common/StateManager.cxx @@ -198,7 +198,7 @@ void StateManager::update() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void StateManager::loadState(int slot) +AdjustFunction StateManager::loadState(int slot) { if(myOSystem.hasConsole()) { @@ -216,7 +216,7 @@ void StateManager::loadState(int slot) buf.str(""); buf << "Can't open/load from state file " << slot; myOSystem.frameBuffer().showMessage(buf.str()); - return; + return nullptr; } // First test if we have a valid header @@ -241,10 +241,11 @@ void StateManager::loadState(int slot) myOSystem.frameBuffer().showMessage(buf.str()); } + return std::bind(&StateManager::changeState, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void StateManager::saveState(int slot) +AdjustFunction StateManager::saveState(int slot) { if(myOSystem.hasConsole()) { @@ -262,7 +263,7 @@ void StateManager::saveState(int slot) buf.str(""); buf << "Can't open/save to state file " << slot; myOSystem.frameBuffer().showMessage(buf.str()); - return; + return nullptr; } try @@ -275,7 +276,7 @@ void StateManager::saveState(int slot) { buf << "Error saving state " << slot; myOSystem.frameBuffer().showMessage(buf.str()); - return; + return nullptr; } // Do a complete state save using the Console @@ -294,12 +295,13 @@ void StateManager::saveState(int slot) myOSystem.frameBuffer().showMessage(buf.str()); } + return std::bind(&StateManager::changeState, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void StateManager::changeState(int direction) +AdjustFunction StateManager::changeState(bool next) { - myCurrentSlot += direction; + myCurrentSlot += next ? 1 : -1; if (myCurrentSlot < 0) myCurrentSlot = 9; else @@ -309,6 +311,7 @@ void StateManager::changeState(int direction) ostringstream buf; buf << "Changed to slot " << myCurrentSlot; myOSystem.frameBuffer().showMessage(buf.str()); + return std::bind(&StateManager::changeState, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/common/StateManager.hxx b/src/common/StateManager.hxx index 09de785fb..3739b8c31 100644 --- a/src/common/StateManager.hxx +++ b/src/common/StateManager.hxx @@ -104,19 +104,19 @@ class StateManager @param slot The state 'slot' to load state from */ - void loadState(int slot = -1); + AdjustFunction loadState(int slot = -1); /** Save the current state from the system. @param slot The state 'slot' to save into */ - void saveState(int slot = -1); + AdjustFunction saveState(int slot = -1); /** Switches to the next higher or lower state slot (circular queue style). */ - void changeState(int direction); + AdjustFunction changeState(bool next); /** Toggles auto slot mode. diff --git a/src/common/bspf.hxx b/src/common/bspf.hxx index 1484b21ed..cfb801045 100644 --- a/src/common/bspf.hxx +++ b/src/common/bspf.hxx @@ -43,6 +43,7 @@ using uInt64 = uint64_t; #include #include #include +#include #include #include #include @@ -86,6 +87,8 @@ using StringList = std::vector; using ByteBuffer = std::unique_ptr; // NOLINT using DWordBuffer = std::unique_ptr; // NOLINT +using AdjustFunction = std::function; + // We use KB a lot; let's make a literal for it constexpr uInt32 operator "" _KB(unsigned long long size) { diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index 5af3d1077..be5643e81 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -349,7 +349,7 @@ bool Console::load(Serializer& in) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Console::selectFormat(bool next) +AdjustFunction Console::selectFormat(bool next) { string saveformat, message; uInt32 format = myCurrentFormat; @@ -360,6 +360,7 @@ void Console::selectFormat(bool next) format = myCurrentFormat > 0 ? (myCurrentFormat - 1) : 6; setFormat(format); + return std::bind(&Console::selectFormat, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -504,7 +505,7 @@ void Console::toggleTurbo() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Console::togglePhosphor() +AdjustFunction Console::togglePhosphor() { if(myOSystem.frameBuffer().tiaSurface().phosphorEnabled()) { @@ -518,10 +519,11 @@ void Console::togglePhosphor() myOSystem.frameBuffer().tiaSurface().enablePhosphor(true); myOSystem.frameBuffer().showMessage("Phosphor effect enabled"); } + return std::bind(&Console::changePhosphor, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Console::changePhosphor(bool increase) +AdjustFunction Console::changePhosphor(bool increase) { int blend = BSPF::stringToInt(myProperties.get(PropType::Display_PPBlend)); @@ -530,6 +532,7 @@ void Console::changePhosphor(bool increase) else // decrease blend blend -= 2; blend = BSPF::clamp(blend, 0, 100); + myOSystem.frameBuffer().tiaSurface().enablePhosphor(true, blend); ostringstream val; val << blend; @@ -542,7 +545,7 @@ void Console::changePhosphor(bool increase) val << "Off"; } myOSystem.frameBuffer().showMessage("Phosphor blend", val.str(), blend); - myOSystem.frameBuffer().tiaSurface().enablePhosphor(true, blend); + return std::bind(&Console::changePhosphor, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -619,7 +622,7 @@ void Console::fry() const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Console::changeVerticalCenter(bool increase) +AdjustFunction Console::changeVerticalCenter(bool increase) { Int32 vcenter = myTIA->vcenter(); @@ -638,6 +641,7 @@ void Console::changeVerticalCenter(bool increase) val << (vcenter ? vcenter > 0 ? "+" : "" : " ") << vcenter << "px"; myOSystem.frameBuffer().showMessage("V-Center", val.str(), vcenter, myTIA->minVcenter(), myTIA->maxVcenter()); + return std::bind(&Console::changeVerticalCenter, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -650,7 +654,7 @@ void Console::updateVcenter(Int32 vcenter) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Console::changeVSizeAdjust(bool increase) +AdjustFunction Console::changeVSizeAdjust(bool increase) { Int32 newAdjustVSize = myTIA->adjustVSize(); @@ -670,6 +674,7 @@ void Console::changeVSizeAdjust(bool increase) val << (newAdjustVSize ? newAdjustVSize > 0 ? "+" : "" : " ") << newAdjustVSize << "%"; myOSystem.frameBuffer().showMessage("V-Size", val.str(), newAdjustVSize, -5, 5); + return std::bind(&Console::changeVSizeAdjust, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/Console.hxx b/src/emucore/Console.hxx index 15173b48d..8c48575ad 100644 --- a/src/emucore/Console.hxx +++ b/src/emucore/Console.hxx @@ -191,7 +191,7 @@ class Console : public Serializable, public ConsoleIO @param next Select next if true, else previous */ - void selectFormat(bool next = true); + AdjustFunction selectFormat(bool next = true); /** Set NTSC/PAL/SECAM (and variants) display format. @@ -217,14 +217,14 @@ class Console : public Serializable, public ConsoleIO /** Toggles phosphor effect. */ - void togglePhosphor(); + AdjustFunction togglePhosphor(); /** Change the "Display.PPBlend" variable. @param increase Increase if true, else decrease */ - void changePhosphor(bool increase = true); + AdjustFunction changePhosphor(bool increase = true); /** Toggles the PAL color-loss effect. @@ -259,7 +259,7 @@ class Console : public Serializable, public ConsoleIO @param increase Increase if true, else decrease */ - void changeVerticalCenter(bool increase = true); + AdjustFunction changeVerticalCenter(bool increase = true); /** Change the "TIA scanline adjust" variable. @@ -268,7 +268,7 @@ class Console : public Serializable, public ConsoleIO @param increase Increase if true, else decrease */ - void changeVSizeAdjust(bool increase = true); + AdjustFunction changeVSizeAdjust(bool increase = true); /** Returns the current framerate. diff --git a/src/emucore/Event.hxx b/src/emucore/Event.hxx index 0c84225ed..2102b57f6 100644 --- a/src/emucore/Event.hxx +++ b/src/emucore/Event.hxx @@ -122,6 +122,7 @@ class Event ToggleFrameStats, ToggleSAPortOrder, ExitGame, // add new events from here to avoid that user remapped events get overwritten + SettingDecrease, SettingIncrease, LastType }; diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx index 2dbc5e217..883d2b744 100644 --- a/src/emucore/EventHandler.cxx +++ b/src/emucore/EventHandler.cxx @@ -63,6 +63,8 @@ #include "ScrollBarWidget.hxx" #endif +using namespace std::placeholders; + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - EventHandler::EventHandler(OSystem& osystem) : myOSystem(osystem) @@ -347,8 +349,32 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) // or need to be preprocessed before passing them on const bool pressed = (value != 0); + // The global settings keys react as long as the setting message from the previous event is + // still displayed. When no message is displayed, volume adjustment will be the default event. + if(!myOSystem.frameBuffer().messageShown() || myAdjustFunction == nullptr) + myAdjustFunction = std::bind(&Sound::adjustVolume, &myOSystem.sound(), std::placeholders::_1); + + // Assume no adjust function will be pressed + const AdjustFunction oldAdjustFunction = myAdjustFunction; + if(pressed) + myAdjustFunction = nullptr; + switch(event) { + //////////////////////////////////////////////////////////////////////// + // Allow adjusting several (mostly repeated) settings using the same two hotkeys + case Event::SettingDecrease: + if(pressed && oldAdjustFunction != nullptr) + oldAdjustFunction(false); + myAdjustFunction = oldAdjustFunction; + return; + + case Event::SettingIncrease: + if(pressed && oldAdjustFunction != nullptr) + oldAdjustFunction(true); + myAdjustFunction = oldAdjustFunction; + return; + //////////////////////////////////////////////////////////////////////// // If enabled, make sure 'impossible' joystick directions aren't allowed case Event::JoystickZeroUp: @@ -401,55 +427,68 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::VolumeDecrease: - if(pressed) myOSystem.sound().adjustVolume(-1); + if(pressed) + myAdjustFunction = myOSystem.sound().adjustVolume(false); return; case Event::VolumeIncrease: - if(pressed) myOSystem.sound().adjustVolume(+1); + if(pressed) + myAdjustFunction = myOSystem.sound().adjustVolume(true); return; case Event::SoundToggle: - if(pressed && !repeated) myOSystem.sound().toggleMute(); + if(pressed && !repeated) + myOSystem.sound().toggleMute(); return; case Event::VidmodeDecrease: - if(pressed) myOSystem.frameBuffer().selectVidMode(false); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().selectVidMode(false); return; case Event::VidmodeIncrease: - if(pressed) myOSystem.frameBuffer().selectVidMode(true); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().selectVidMode(true); return; case Event::VCenterDecrease: - if (pressed) myOSystem.console().changeVerticalCenter(false); + if (pressed) + myAdjustFunction = myOSystem.console().changeVerticalCenter(false); return; case Event::VCenterIncrease: - if (pressed) myOSystem.console().changeVerticalCenter(true); + if (pressed) + myAdjustFunction = myOSystem.console().changeVerticalCenter(true); return; case Event::VSizeAdjustDecrease: - if (pressed) myOSystem.console().changeVSizeAdjust(false); + if (pressed) + myAdjustFunction = myOSystem.console().changeVSizeAdjust(false); return; case Event::VSizeAdjustIncrease: - if (pressed) myOSystem.console().changeVSizeAdjust(true); + if (pressed) + myAdjustFunction = myOSystem.console().changeVSizeAdjust(true); return; case Event::PreviousPaletteAttribute: - if (pressed) myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(false); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(false); return; case Event::NextPaletteAttribute: - if (pressed) myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(true); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().cycleAdjustable(true); return; case Event::PaletteAttributeDecrease: - if (pressed) myOSystem.frameBuffer().tiaSurface().paletteHandler().changeAdjustable(false); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().changeAdjustable(false); return; case Event::PaletteAttributeIncrease: - if (pressed) myOSystem.frameBuffer().tiaSurface().paletteHandler().changeAdjustable(true); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().changeAdjustable(true); return; case Event::ToggleFullScreen: @@ -457,19 +496,23 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::OverscanDecrease: - if (pressed) myOSystem.frameBuffer().changeOverscan(false); + if (pressed) + myAdjustFunction = myOSystem.frameBuffer().changeOverscan(false); return; case Event::OverscanIncrease: - if (pressed) myOSystem.frameBuffer().changeOverscan(true); + if (pressed) + myAdjustFunction = myOSystem.frameBuffer().changeOverscan(true); return; case Event::PreviousVideoMode: - if (pressed && !repeated) myOSystem.frameBuffer().tiaSurface().changeNTSC(false); + if (pressed && !repeated) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().changeNTSC(false); return; case Event::NextVideoMode: - if (pressed && !repeated) myOSystem.frameBuffer().tiaSurface().changeNTSC(true); + if (pressed && !repeated) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().changeNTSC(true); return; case Event::VidmodeStd: @@ -497,39 +540,48 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::PreviousAttribute: - if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(false); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(false); return; case Event::NextAttribute: - if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(true); + if (pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().setNTSCAdjustable(true); return; case Event::DecreaseAttribute: - if(pressed) myOSystem.frameBuffer().tiaSurface().changeNTSCAdjustable(false); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().changeNTSCAdjustable(false); return; case Event::IncreaseAttribute: - if(pressed) myOSystem.frameBuffer().tiaSurface().changeNTSCAdjustable(true); + if(pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().changeNTSCAdjustable(true); return; case Event::ScanlinesDecrease: - if (pressed) myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(-2); + if (pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(false); return; case Event::ScanlinesIncrease: - if (pressed) myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(+2); + if (pressed) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(true); return; case Event::PhosphorDecrease: - if (pressed) myOSystem.console().changePhosphor(false); + if (pressed) + myAdjustFunction = myOSystem.console().changePhosphor(false); return; case Event::PhosphorIncrease: - if (pressed) myOSystem.console().changePhosphor(true); + if (pressed) + myAdjustFunction = myOSystem.console().changePhosphor(true); return; case Event::TogglePhosphor: - if (pressed && !repeated) myOSystem.console().togglePhosphor(); + if(pressed && !repeated) + myAdjustFunction = myOSystem.console().togglePhosphor(); return; case Event::ToggleColorLoss: @@ -537,11 +589,13 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::PaletteDecrease: - if (pressed && !repeated) myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(false); + if (pressed && !repeated) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(false); return; case Event::PaletteIncrease: - if (pressed && !repeated) myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(true); + if (pressed && !repeated) + myAdjustFunction = myOSystem.frameBuffer().tiaSurface().paletteHandler().cyclePalette(true); return; case Event::ToggleInter: @@ -583,11 +637,13 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::FormatDecrease: - if (pressed) myOSystem.console().selectFormat(false); + if (pressed && !repeated) + myAdjustFunction = myOSystem.console().selectFormat(false); return; case Event::FormatIncrease: - if (pressed) myOSystem.console().selectFormat(true); + if (pressed && !repeated) + myAdjustFunction = myOSystem.console().selectFormat(true); return; case Event::ToggleGrabMouse: @@ -656,7 +712,8 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::SaveState: - if(pressed && !repeated) myOSystem.state().saveState(); + if(pressed && !repeated) + myAdjustFunction = myOSystem.state().saveState(); return; case Event::SaveAllStates: @@ -664,12 +721,14 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) myOSystem.frameBuffer().showMessage(myOSystem.state().rewindManager().saveAllStates()); return; - case Event::NextState: - if(pressed) myOSystem.state().changeState(1); + case Event::PreviousState: + if (pressed) + myAdjustFunction = myOSystem.state().changeState(false); return; - case Event::PreviousState: - if (pressed) myOSystem.state().changeState(-1); + case Event::NextState: + if(pressed) + myAdjustFunction = myOSystem.state().changeState(true); return; case Event::ToggleAutoSlot: @@ -677,7 +736,8 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated) return; case Event::LoadState: - if(pressed && !repeated) myOSystem.state().loadState(); + if(pressed && !repeated) + myAdjustFunction = myOSystem.state().loadState(); return; case Event::LoadAllStates: @@ -1950,6 +2010,10 @@ EventHandler::EmulActionList EventHandler::ourEmulActionList = { { { Event::PhosphorIncrease, "Increase 'phosphor' blend", "" }, { Event::ScanlinesDecrease, "Decrease scanlines", "" }, { Event::ScanlinesIncrease, "Increase scanlines", "" }, + + { Event::SettingDecrease, "Decrease current setting", "" }, + { Event::SettingIncrease, "Increase current setting", "" }, + // Developer keys: { Event::ToggleFrameStats, "Toggle frame stats", "" }, { Event::ToggleP0Bit, "Toggle TIA Player0 object", "" }, @@ -2044,6 +2108,7 @@ const Event::EventSet EventHandler::MiscEvents = { // Event::MouseButtonLeftValue, Event::MouseButtonRightValue, Event::HandleMouseControl, Event::ToggleGrabMouse, Event::ToggleSAPortOrder, + Event::SettingDecrease, Event::SettingIncrease }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx index 6d19b685b..4b7e91af1 100644 --- a/src/emucore/EventHandler.hxx +++ b/src/emucore/EventHandler.hxx @@ -425,6 +425,8 @@ class EventHandler string key; }; + AdjustFunction myAdjustFunction{nullptr}; + // Global Event object Event myEvent; @@ -468,7 +470,7 @@ class EventHandler #else PNG_SIZE = 0, #endif - EMUL_ACTIONLIST_SIZE = 152 + PNG_SIZE + COMBO_SIZE, + EMUL_ACTIONLIST_SIZE = 154 + PNG_SIZE + COMBO_SIZE, MENU_ACTIONLIST_SIZE = 18 ; diff --git a/src/emucore/FrameBuffer.cxx b/src/emucore/FrameBuffer.cxx index cd7e2e57c..dd88c3020 100644 --- a/src/emucore/FrameBuffer.cxx +++ b/src/emucore/FrameBuffer.cxx @@ -533,11 +533,11 @@ void FrameBuffer::showMessage(const string& message, const string& valueText, return; const int fontWidth = font().getMaxCharWidth(), - fontHeight = font().getFontHeight(); + fontHeight = font().getFontHeight(); const int VBORDER = fontHeight / 4; const int HBORDER = fontWidth * 1.25 / 2.0; - myMsg.counter = uInt32(myOSystem.frameRate()) * 5; // Show message for 5 seconds + myMsg.counter = uInt32(myOSystem.frameRate()) * 3; // Show message for 3 seconds if(myMsg.counter == 0) myMsg.counter = 120; @@ -551,10 +551,10 @@ void FrameBuffer::showMessage(const string& message, const string& valueText, myMsg.value = 100.F; myMsg.valueText = valueText; myMsg.w = std::min(fontWidth * MESSAGE_WIDTH, - font().getStringWidth(myMsg.text) - + fontWidth * (GAUGEBAR_WIDTH + 2) - + font().getStringWidth(myMsg.valueText)) - + HBORDER * 2; + font().getStringWidth(myMsg.text) + + fontWidth * (GAUGEBAR_WIDTH + 2) + + font().getStringWidth(myMsg.valueText)) + + HBORDER * 2; myMsg.h = fontHeight + VBORDER * 2; myMsg.position = MessagePosition::BottomCenter; myMsg.enabled = true; @@ -564,6 +564,16 @@ void FrameBuffer::showMessage(const string& message, const string& valueText, #endif } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool FrameBuffer::messageShown() +{ +#ifdef GUI_SUPPORT + return myMsg.enabled; +#else + return false; +#endif +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBuffer::drawFrameStats(float framesPerSecond) { @@ -662,6 +672,7 @@ inline bool FrameBuffer::drawMessage() #ifdef GUI_SUPPORT // Either erase the entire message (when time is reached), // or show again this frame + cerr << myMsg.counter << endl; if(myMsg.counter == 0) { myMsg.enabled = false; @@ -749,7 +760,7 @@ inline bool FrameBuffer::drawMessage() // align bar with bottom of text const int y = VBORDER + font().desc().ascent - bheight; - // draw bar gauge + // draw gauge bar myMsg.surface->fillRect(x - BORDER, y, swidth + BORDER * 2, bheight, kSliderBGColor); myMsg.surface->fillRect(x, y + BORDER, bwidth, bheight - BORDER * 2, kSliderColor); // draw tickmark in the middle of the bar @@ -983,7 +994,7 @@ void FrameBuffer::toggleFullscreen() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBuffer::changeOverscan(bool increase) +AdjustFunction FrameBuffer::changeOverscan(bool increase) { if (fullScreen()) { @@ -1002,10 +1013,11 @@ void FrameBuffer::changeOverscan(bool increase) val << (overscan ? overscan > 0 ? "+" : "" : " ") << overscan << "%"; myOSystem.frameBuffer().showMessage("Overscan", val.str(), overscan, 0, 10); } + return std::bind(&FrameBuffer::changeOverscan, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool FrameBuffer::selectVidMode(bool next) +AdjustFunction FrameBuffer::selectVidMode(bool next) { EventHandlerState state = myOSystem.eventHandler().state(); bool tiaMode = (state != EventHandlerState::DEBUGGER && @@ -1013,7 +1025,7 @@ bool FrameBuffer::selectVidMode(bool next) // Only applicable when in TIA/emulation mode if(!tiaMode) - return false; + return nullptr; if(next) myCurrentModeList->next(); @@ -1047,11 +1059,11 @@ bool FrameBuffer::selectVidMode(bool next) else myOSystem.settings().setValue("tia.zoom", mode.zoom); - return true; + return std::bind(&FrameBuffer::selectVidMode, this, std::placeholders::_1); } myOSystem.sound().mute(oldMuteState); - return false; + return nullptr; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/FrameBuffer.hxx b/src/emucore/FrameBuffer.hxx index 7a73b3d90..4dd55f7f5 100644 --- a/src/emucore/FrameBuffer.hxx +++ b/src/emucore/FrameBuffer.hxx @@ -148,17 +148,19 @@ class FrameBuffer MessagePosition position = MessagePosition::BottomCenter, bool force = false); /** - Shows a message with a bar gauge onscreen. + Shows a message with a gauge bar onscreen. @param message The message to be shown - @param valueText The value of the bar gauge as text - @param value The bar gauge percentage - @param minValue The minimal value of the bar gauge - @param maxValue The maximal value of the bar gauge + @param valueText The value of the gauge bar as text + @param value The gauge bar percentage + @param minValue The minimal value of the gauge bar + @param maxValue The maximal value of the gauge bar */ void showMessage(const string& message, const string& valueText, float value, float minValue = 0.F, float maxValue = 100.F); + bool messageShown(); + /** Toggles showing or hiding framerate statistics. */ @@ -265,7 +267,7 @@ class FrameBuffer @param increase Increase if true, else decrease */ - void changeOverscan(bool increase = true); + AdjustFunction changeOverscan(bool increase = true); /** This method is called when the user wants to switch to the next @@ -277,7 +279,7 @@ class FrameBuffer @param next Select next if true, else previous */ - bool selectVidMode(bool next = true); + AdjustFunction selectVidMode(bool next = true); /** Sets the state of the cursor (hidden or grabbed) based on the diff --git a/src/emucore/Sound.hxx b/src/emucore/Sound.hxx index f74705489..a03223f71 100644 --- a/src/emucore/Sound.hxx +++ b/src/emucore/Sound.hxx @@ -88,10 +88,10 @@ class Sound /** Adjusts the volume of the sound device based on the given direction. - @param direction Increase or decrease the current volume by a predefined - amount based on the direction (1 = increase, -1 =decrease) + @param increase Increase or decrease the current volume by a predefined + amount */ - virtual void adjustVolume(Int8 direction) = 0; + virtual AdjustFunction adjustVolume(bool increase) = 0; /** This method is called to provide information about the sound device. diff --git a/src/emucore/TIASurface.cxx b/src/emucore/TIASurface.cxx index 98adb4bd4..88a41415c 100644 --- a/src/emucore/TIASurface.cxx +++ b/src/emucore/TIASurface.cxx @@ -200,7 +200,7 @@ void TIASurface::setNTSC(NTSCFilter::Preset preset, bool show) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void TIASurface::changeNTSC(bool next, bool show) +AdjustFunction TIASurface::changeNTSC(bool next) { constexpr NTSCFilter::Preset PRESETS[] = { NTSCFilter::Preset::OFF, NTSCFilter::Preset::RGB, NTSCFilter::Preset::SVIDEO, @@ -222,11 +222,12 @@ void TIASurface::changeNTSC(bool next, bool show) else preset--; } - setNTSC(PRESETS[preset], show); + setNTSC(PRESETS[preset], true); + return std::bind(&TIASurface::changeNTSC, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void TIASurface::setNTSCAdjustable(bool next) +AdjustFunction TIASurface::setNTSCAdjustable(bool next) { string text, valueText; Int32 value; @@ -234,11 +235,12 @@ void TIASurface::setNTSCAdjustable(bool next) setNTSC(NTSCFilter::Preset::CUSTOM); ntsc().selectAdjustable(next, text, valueText, value); myOSystem.frameBuffer().showMessage(text, valueText, value); + return std::bind(&TIASurface::changeNTSCAdjustable, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void TIASurface::changeNTSCAdjustable(bool increase) +AdjustFunction TIASurface::changeNTSCAdjustable(bool increase) { string text, valueText; Int32 newValue; @@ -246,13 +248,14 @@ void TIASurface::changeNTSCAdjustable(bool increase) setNTSC(NTSCFilter::Preset::CUSTOM); ntsc().changeAdjustable(increase, text, valueText, newValue); myOSystem.frameBuffer().showMessage(text, valueText, newValue); + return std::bind(&TIASurface::changeNTSCAdjustable, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void TIASurface::setScanlineIntensity(int amount) +AdjustFunction TIASurface::setScanlineIntensity(bool increase) { ostringstream buf; - uInt32 intensity = enableScanlines(amount); + uInt32 intensity = enableScanlines(increase ? 2 : -2); myOSystem.settings().setValue("tv.scanlines", intensity); enableNTSC(ntscEnabled()); @@ -262,6 +265,7 @@ void TIASurface::setScanlineIntensity(int amount) else buf << "Off"; myFB.showMessage("Scanline intensity", buf.str(), intensity); + return std::bind(&TIASurface::setScanlineIntensity, this, std::placeholders::_1); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/emucore/TIASurface.hxx b/src/emucore/TIASurface.hxx index 90aeacb14..ecb1de752 100644 --- a/src/emucore/TIASurface.hxx +++ b/src/emucore/TIASurface.hxx @@ -92,17 +92,17 @@ class TIASurface /** Switch to next/previous NTSC filtering effect. */ - void changeNTSC(bool next, bool show = true); + AdjustFunction changeNTSC(bool next); /** Switch to next/previous NTSC filtering adjustable. */ - void setNTSCAdjustable(bool next = true); + AdjustFunction setNTSCAdjustable(bool next = true); /** Increase/decrease current NTSC filtering adjustable. */ - void changeNTSCAdjustable(bool increase = true); + AdjustFunction changeNTSCAdjustable(bool increase = true); /** Retrieve palette handler. @@ -112,7 +112,7 @@ class TIASurface /** Increase/decrease current scanline intensity by given relative amount. */ - void setScanlineIntensity(int relative); + AdjustFunction setScanlineIntensity(bool increase); /** Change scanline intensity and interpolation. diff --git a/src/libretro/SoundLIBRETRO.hxx b/src/libretro/SoundLIBRETRO.hxx index aa98780e1..f69d71a14 100644 --- a/src/libretro/SoundLIBRETRO.hxx +++ b/src/libretro/SoundLIBRETRO.hxx @@ -95,10 +95,10 @@ class SoundLIBRETRO : public Sound /** Adjusts the volume of the sound device based on the given direction. - @param direction Increase or decrease the current volume by a predefined - amount based on the direction (1 = increase, -1 = decrease) + @param increase Increase or decrease the current volume by a predefined + amount */ - void adjustVolume(Int8 direction) override { } + void adjustVolume(bool increase) override { return nullptr; } /** This method is called to provide information about the sound device.