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.