add new mappings automatically

add more events which can be remapped
enable all emulation events for pause mode too
This commit is contained in:
thrust26 2019-05-26 00:07:53 +02:00
parent 5e36cb9fed
commit 9ea265859a
7 changed files with 150 additions and 98 deletions

View File

@ -88,6 +88,18 @@ string KeyMap::getEventMappingDesc(const Event::Type event, const int mode) cons
return buf.str(); return buf.str();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
std::vector<KeyMap::Mapping> KeyMap::getEventMapping(const Event::Type event, const int mode) const
{
std::vector<KeyMap::Mapping> map;
for (auto item : myMap)
if (item.second == event && item.first.mode == mode)
map.push_back(item.first);
return map;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string KeyMap::saveMapping(const int mode) const string KeyMap::saveMapping(const int mode) const
{ {

View File

@ -75,6 +75,8 @@ class KeyMap
string getDesc(const Mapping& input) const; string getDesc(const Mapping& input) const;
string getDesc(const int mode, const int key, const int mod) const; string getDesc(const int mode, const int key, const int mod) const;
std::vector<Mapping> getEventMapping(const Event::Type event, const int mode) const;
string saveMapping(const int mode) const; string saveMapping(const int mode) const;
int loadMapping(string& list, const int mode); int loadMapping(string& list, const int mode);

View File

@ -49,26 +49,29 @@ PhysicalKeyboardHandler::PhysicalKeyboardHandler(
list = myOSystem.settings().getString("keymap_ui"); list = myOSystem.settings().getString("keymap_ui");
i += myKeyMap.loadMapping(list, kMenuMode); i += myKeyMap.loadMapping(list, kMenuMode);
if (!i) setDefaultMapping(Event::NoType, kEmulationMode);
{ setDefaultMapping(Event::NoType, kMenuMode);
setDefaultMapping(Event::NoType, kEmulationMode);
setDefaultMapping(Event::NoType, kMenuMode);
}
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalKeyboardHandler::setDefaultMapping(Event::Type event, EventMode mode) void PhysicalKeyboardHandler::setDefaultMapping(Event::Type event, EventMode mode)
{ {
// If event is 'NoType', erase and reset all mappings // If event is 'NoType', check for missing default mappings
// Otherwise, only reset the given event bool defaultMissing = (event == Event::NoType);
bool eraseAll = (event == Event::NoType);
if(eraseAll)
// Erase all mappings of given mode
myKeyMap.eraseMode(mode);
auto setDefaultKey = [&](Event::Type k_event, StellaKey key, int mod = StellaMod::KBDM_NONE) auto setDefaultKey = [&](Event::Type k_event, StellaKey key, int mod = KBDM_NONE)
{ {
if (eraseAll || k_event == event) if (defaultMissing)
{
// if there is no existing mapping for the event and
// the default mapping for the event is unused, set default key for event
if (myKeyMap.getEventMapping(k_event, mode).size() == 0 &&
myKeyMap.get(mode, key, mod) == Event::Type::NoType)
{
myKeyMap.add(k_event, mode, key, mod);
}
}
else if (k_event == event)
{ {
myKeyMap.eraseEvent(k_event, mode); myKeyMap.eraseEvent(k_event, mode);
myKeyMap.add(k_event, mode, key, mod); myKeyMap.add(k_event, mode, key, mod);
@ -147,6 +150,20 @@ void PhysicalKeyboardHandler::setDefaultMapping(Event::Type event, EventMode mod
setDefaultKey(Event::VolumeIncrease , KBDK_RIGHTBRACKET, KBDM_ALT); setDefaultKey(Event::VolumeIncrease , KBDK_RIGHTBRACKET, KBDM_ALT);
setDefaultKey(Event::SoundToggle , KBDK_RIGHTBRACKET, KBDM_CTRL); setDefaultKey(Event::SoundToggle , KBDK_RIGHTBRACKET, KBDM_CTRL);
setDefaultKey(Event::ToggleFullScreen , KBDK_RETURN, KBDM_ALT);
setDefaultKey(Event::VidmodeStd , KBDK_1, KBDM_ALT);
setDefaultKey(Event::VidmodeRGB , KBDK_2, KBDM_ALT);
setDefaultKey(Event::VidmodeSVideo , KBDK_3, KBDM_ALT);
setDefaultKey(Event::VidModeComposite , KBDK_4, KBDM_ALT);
setDefaultKey(Event::VidModeBad , KBDK_5, KBDM_ALT);
setDefaultKey(Event::VidModeCustom , KBDK_6, KBDM_ALT);
setDefaultKey(Event::ScanlinesDecrease , KBDK_7, KBDM_SHIFT | KBDM_ALT);
setDefaultKey(Event::ScanlinesIncrease , KBDK_7, KBDM_ALT);
setDefaultKey(Event::PreviousAttribute , KBDK_9, KBDM_SHIFT | KBDM_ALT);
setDefaultKey(Event::NextAttribute , KBDK_9, KBDM_ALT);
setDefaultKey(Event::DecreaseAttribute , KBDK_0, KBDM_SHIFT | KBDM_ALT);
setDefaultKey(Event::IncreaseAttribute , KBDK_0, KBDM_ALT);
// FIXME - use the R77 define in the final release // FIXME - use the R77 define in the final release
// use the '1' define for testing // use the '1' define for testing
#if defined(RETRON77) #if defined(RETRON77)
@ -294,20 +311,8 @@ void PhysicalKeyboardHandler::handleEvent(StellaKey key, StellaMod mod, bool pre
switch(estate) switch(estate)
{ {
case EventHandlerState::EMULATION: case EventHandlerState::EMULATION:
myHandler.handleEvent(myKeyMap.get(kEmulationMode, key, mod), pressed);
break;
case EventHandlerState::PAUSE: case EventHandlerState::PAUSE:
switch (myKeyMap.get(kEmulationMode, key, mod)) myHandler.handleEvent(myKeyMap.get(kEmulationMode, key, mod), pressed);
{
case Event::TakeSnapshot:
case Event::DebuggerMode:
myHandler.handleEvent(myKeyMap.get(kEmulationMode, key, mod), pressed);
break;
default:
break;
}
break; break;
default: default:
@ -341,10 +346,6 @@ bool PhysicalKeyboardHandler::handleAltEvent(StellaKey key, StellaMod mod, bool
myAltKeyCounter = 1; myAltKeyCounter = 1;
return true; return true;
} }
else if(key == KBDK_RETURN)
{
myOSystem.frameBuffer().toggleFullscreen();
}
// State rewinding must work in pause mode too // State rewinding must work in pause mode too
else if(estate == EventHandlerState::EMULATION || estate == EventHandlerState::PAUSE) else if(estate == EventHandlerState::EMULATION || estate == EventHandlerState::PAUSE)
{ {
@ -374,61 +375,6 @@ bool PhysicalKeyboardHandler::handleAltEvent(StellaKey key, StellaMod mod, bool
myOSystem.console().changeYStart(-1); myOSystem.console().changeYStart(-1);
break; break;
case KBDK_1: // Alt-1 turns off NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::OFF);
break;
case KBDK_2: // Alt-2 turns on 'rgb' NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::RGB);
break;
case KBDK_3: // Alt-3 turns on 'svideo' NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::SVIDEO);
break;
case KBDK_4: // Alt-4 turns on 'composite' NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::COMPOSITE);
break;
case KBDK_5: // Alt-5 turns on 'bad' NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::BAD);
break;
case KBDK_6: // Alt-6 turns on 'custom' NTSC filtering
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
break;
case KBDK_7: // Alt-7 changes scanline intensity for NTSC filtering
if(StellaModTest::isShift(mod))
myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(-5);
else
myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(+5);
break;
case KBDK_9: // Alt-9 selects various custom adjustables for NTSC filtering
if(myOSystem.frameBuffer().tiaSurface().ntscEnabled())
{
if(StellaModTest::isShift(mod))
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().setPreviousAdjustable());
else
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().setNextAdjustable());
}
break;
case KBDK_0: // Alt-0 changes custom adjustables for NTSC filtering
if(myOSystem.frameBuffer().tiaSurface().ntscEnabled())
{
if(StellaModTest::isShift(mod))
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().decreaseAdjustable());
else
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().increaseAdjustable());
}
break;
case KBDK_Z: case KBDK_Z:
if(StellaModTest::isShift(mod)) if(StellaModTest::isShift(mod))
myOSystem.console().toggleP0Collision(); myOSystem.console().toggleP0Collision();

View File

@ -70,11 +70,11 @@ string NTSCFilter::getPreset() const
{ {
switch(myPreset) switch(myPreset)
{ {
case Preset::COMPOSITE: return "COMPOSITE"; case Preset::COMPOSITE: return "COMPOSITE";
case Preset::SVIDEO: return "S-VIDEO"; case Preset::SVIDEO: return "S-VIDEO";
case Preset::RGB: return "RGB"; case Preset::RGB: return "RGB";
case Preset::BAD: return "BAD ADJUST"; case Preset::BAD: return "BAD ADJUST";
case Preset::CUSTOM: return "CUSTOM"; case Preset::CUSTOM: return "CUSTOM";
default: return "Disabled"; default: return "Disabled";
} }
} }

View File

@ -36,12 +36,13 @@ class Event
*/ */
enum Type enum Type
{ {
NoType, NoType = 0,
ConsoleOn, ConsoleOff, ConsoleColor, ConsoleBlackWhite, ConsoleOn = 1, ConsoleOff = 2, ConsoleColor = 3, ConsoleBlackWhite = 4,
ConsoleLeftDiffA, ConsoleLeftDiffB, ConsoleLeftDiffA, ConsoleLeftDiffB,
ConsoleRightDiffA, ConsoleRightDiffB, ConsoleRightDiffA, ConsoleRightDiffB,
ConsoleSelect, ConsoleReset, ConsoleSelect, ConsoleReset,
ConsoleLeftDiffToggle, ConsoleRightDiffToggle, ConsoleColorToggle, Console7800Pause, ConsoleLeftDiffToggle, ConsoleRightDiffToggle, ConsoleColorToggle,
Console7800Pause,
JoystickZeroUp, JoystickZeroDown, JoystickZeroLeft, JoystickZeroRight, JoystickZeroUp, JoystickZeroDown, JoystickZeroLeft, JoystickZeroRight,
JoystickZeroFire, JoystickZeroFire5, JoystickZeroFire9, JoystickZeroFire, JoystickZeroFire5, JoystickZeroFire9,
@ -81,6 +82,11 @@ class Event
UISelect, UINavPrev, UINavNext, UIOK, UICancel, UIPrevDir, UISelect, UINavPrev, UINavNext, UIOK, UICancel, UIPrevDir,
UITabPrev, UITabNext, UITabPrev, UITabNext,
ToggleFullScreen,
VidmodeStd, VidmodeRGB, VidmodeSVideo, VidModeComposite, VidModeBad, VidModeCustom,
PreviousAttribute, NextAttribute, DecreaseAttribute, IncreaseAttribute,
ScanlinesDecrease, ScanlinesIncrease,
LastType LastType
}; };
@ -147,10 +153,10 @@ class Event
{ {
std::lock_guard<std::mutex> lock(myMutex); std::lock_guard<std::mutex> lock(myMutex);
for(uInt32 i = 0; i < LastType; ++i) for(Int32 i = 0; i < LastType; ++i)
myValues[i] = Event::NoType; myValues[i] = Event::NoType;
for(uInt32 i = 0; i < KBDK_LAST; ++i) for(Int32 i = 0; i < KBDK_LAST; ++i)
myKeyTable[i] = false; myKeyTable[i] = false;
} }

View File

@ -405,6 +405,78 @@ void EventHandler::handleEvent(Event::Type event, bool pressed)
if(pressed) myOSystem.frameBuffer().changeVidMode(+1); if(pressed) myOSystem.frameBuffer().changeVidMode(+1);
return; return;
case Event::ToggleFullScreen:
if (pressed) myOSystem.frameBuffer().toggleFullscreen();
return;
case Event::VidmodeStd:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::OFF);
return;
case Event::VidmodeRGB:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::RGB);
return;
case Event::VidmodeSVideo:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::SVIDEO);
return;
case Event::VidModeComposite:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::COMPOSITE);
return;
case Event::VidModeBad:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::BAD);
return;
case Event::VidModeCustom:
if (pressed) myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
return;
case Event::ScanlinesDecrease:
if (pressed) myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(-5);
return;
case Event::ScanlinesIncrease:
if (pressed) myOSystem.frameBuffer().tiaSurface().setScanlineIntensity(+5);
return;
case Event::PreviousAttribute:
if (pressed)
{
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().setPreviousAdjustable());
}
return;
case Event::NextAttribute:
if (pressed)
{
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().setNextAdjustable());
}
return;
case Event::DecreaseAttribute:
if (pressed)
{
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().decreaseAdjustable());
}
return;
case Event::IncreaseAttribute:
if (pressed)
{
myOSystem.frameBuffer().tiaSurface().setNTSC(NTSCFilter::Preset::CUSTOM);
myOSystem.frameBuffer().showMessage(
myOSystem.frameBuffer().tiaSurface().ntsc().increaseAdjustable());
}
return;
case Event::SaveState: case Event::SaveState:
if(pressed) myOSystem.state().saveState(); if(pressed) myOSystem.state().saveState();
return; return;
@ -1309,11 +1381,25 @@ EventHandler::ActionList EventHandler::ourEmulActionList[EMUL_ACTIONLIST_SIZE] =
{ Event::LoadState, "Load state", "", false }, { Event::LoadState, "Load state", "", false },
{ Event::TakeSnapshot, "Snapshot", "", false }, { Event::TakeSnapshot, "Snapshot", "", false },
{ Event::Fry, "Fry cartridge", "", false }, { Event::Fry, "Fry cartridge", "", false },
{ Event::VidmodeDecrease, "Previous zoom level", "", false },
{ Event::VidmodeIncrease, "Next zoom level", "", false },
{ Event::ToggleFullScreen, "Toggle fullscreen", "", false },
{ Event::VidmodeStd, "Disable TV effects", "", false },
{ Event::VidmodeRGB, "Select 'RGB' preset", "", false },
{ Event::VidmodeSVideo, "Select 'S-Video' preset", "", false },
{ Event::VidModeComposite, "Select 'Composite' preset", "", false },
{ Event::VidModeBad, "Select 'Badly adjusted' preset", "", false },
{ Event::VidModeCustom, "Select 'Custom' preset", "", false },
{ Event::PreviousAttribute, "Select previous 'Custom' attribute", "", false },
{ Event::NextAttribute, "Select next 'Custom' attribute", "", false },
{ Event::DecreaseAttribute, "Decrease selected 'Custom' attribute", "", false },
{ Event::IncreaseAttribute, "Increase selected 'Custom' attribute", "", false },
{ Event::ScanlinesDecrease, "Decrease scanlines", "", false },
{ Event::ScanlinesIncrease, "Increase scanlines", "", false },
{ Event::VolumeDecrease, "Decrease volume", "", false }, { Event::VolumeDecrease, "Decrease volume", "", false },
{ Event::VolumeIncrease, "Increase volume", "", false }, { Event::VolumeIncrease, "Increase volume", "", false },
{ Event::SoundToggle, "Toggle sound", "", false }, { Event::SoundToggle, "Toggle sound", "", false },
{ Event::VidmodeDecrease, "Previous zoom level", "", false },
{ Event::VidmodeIncrease, "Next zoom level", "", false },
{ Event::PauseMode, "Pause", "", false }, { Event::PauseMode, "Pause", "", false },
{ Event::OptionsMenuMode, "Enter options menu UI", "", false }, { Event::OptionsMenuMode, "Enter options menu UI", "", false },
{ Event::CmdMenuMode, "Toggle command menu UI", "", false }, { Event::CmdMenuMode, "Toggle command menu UI", "", false },

View File

@ -367,7 +367,7 @@ class EventHandler
static constexpr Int32 static constexpr Int32
COMBO_SIZE = 16, COMBO_SIZE = 16,
EVENTS_PER_COMBO = 8, EVENTS_PER_COMBO = 8,
EMUL_ACTIONLIST_SIZE = 85 + COMBO_SIZE, EMUL_ACTIONLIST_SIZE = 98 + COMBO_SIZE,
MENU_ACTIONLIST_SIZE = 16 MENU_ACTIONLIST_SIZE = 16
; ;