Skip to content

Commit

Permalink
Input updates and fixes
Browse files Browse the repository at this point in the history
* Imagine: Add a modifier key utility functions to Input::Device
* Imagine: Add RingArray and simplify ZArray class
* EmuFramework: Add support for mapping key combos with up to 3 keys
* EmuFramework: Track recently pushed keys in InputDeviceData
* EmuFramework: Fix UI virtual controls still activating when set to off
* EmuFramework: Reset turbo clock when first event is added and run events on main thread to avoid data race
* EmuFramework: Add headings to InputManagerDeviceView
* C64.emu: Update key config to use key combos instead of hard-coded symbolic shifted keys
* Swan.emu: Fix incorrect key strings
  • Loading branch information
Robert Broglia committed Jul 31, 2023
1 parent 02f32c5 commit c26eecc
Show file tree
Hide file tree
Showing 22 changed files with 331 additions and 152 deletions.
115 changes: 49 additions & 66 deletions C64.emu/src/main/input.cc
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ enum class C64Key : KeyCode
KeyboardGreater,
KeyboardQuestion,
KeyboardApostrophe,
KeyboardShiftPound,

KeyboardLastEnum = KeyboardApostrophe,
};
Expand Down Expand Up @@ -175,7 +174,6 @@ constexpr auto kbKeyInfo = makeArray<KeyInfo>
C64Key::KeyboardF6,
C64Key::KeyboardF7,
C64Key::KeyboardF8,
C64Key::KeyboardLeftArrow,
C64Key::Keyboard1,
C64Key::Keyboard2,
C64Key::Keyboard3,
Expand All @@ -186,8 +184,18 @@ constexpr auto kbKeyInfo = makeArray<KeyInfo>
C64Key::Keyboard8,
C64Key::Keyboard9,
C64Key::Keyboard0,
C64Key::KeyboardExclam,
C64Key::KeyboardAt,
C64Key::KeyboardNumberSign,
C64Key::KeyboardDollar,
C64Key::KeyboardPercent,
C64Key::KeyboardAmpersand,
C64Key::KeyboardAsterisk,
C64Key::KeyboardParenLeft,
C64Key::KeyboardParenRight,
C64Key::KeyboardPlus,
C64Key::KeyboardMinus,
C64Key::KeyboardLeftArrow,
C64Key::KeyboardPound,
C64Key::KeyboardClrHome,
C64Key::KeyboardInstDel,
Expand All @@ -202,8 +210,6 @@ constexpr auto kbKeyInfo = makeArray<KeyInfo>
C64Key::KeyboardI,
C64Key::KeyboardO,
C64Key::KeyboardP,
C64Key::KeyboardAt,
C64Key::KeyboardAsterisk,
C64Key::KeyboardUpArrow,
C64Key::KeyboardRestore,
C64Key::KeyboardRunStop,
Expand All @@ -217,8 +223,8 @@ constexpr auto kbKeyInfo = makeArray<KeyInfo>
C64Key::KeyboardJ,
C64Key::KeyboardK,
C64Key::KeyboardL,
C64Key::KeyboardColon,
C64Key::KeyboardSemiColon,
C64Key::KeyboardColon,
C64Key::KeyboardEquals,
C64Key::KeyboardReturn,
C64Key::KeyboardCommodore,
Expand All @@ -233,28 +239,20 @@ constexpr auto kbKeyInfo = makeArray<KeyInfo>
C64Key::KeyboardComma,
C64Key::KeyboardPeriod,
C64Key::KeyboardSlash,
C64Key::KeyboardApostrophe,
C64Key::KeyboardLess,
C64Key::KeyboardGreater,
C64Key::KeyboardQuestion,
C64Key::KeyboardQuoteDbl,
C64Key::KeyboardRightShift,
C64Key::KeyboardUp,
C64Key::KeyboardRight,
C64Key::KeyboardDown,
C64Key::KeyboardLeft,
C64Key::KeyboardSpace,
C64Key::KeyboardCtrlLock,
C64Key::KeyboardExclam,
C64Key::KeyboardQuoteDbl,
C64Key::KeyboardNumberSign,
C64Key::KeyboardDollar,
C64Key::KeyboardPercent,
C64Key::KeyboardAmpersand,
C64Key::KeyboardParenLeft,
C64Key::KeyboardParenRight,
C64Key::KeyboardBracketLeft,
C64Key::KeyboardBracketRight,
C64Key::KeyboardLess,
C64Key::KeyboardGreater,
C64Key::KeyboardQuestion,
C64Key::KeyboardApostrophe,
C64Key::KeyboardShiftPound
C64Key::KeyboardBracketRight
);

constexpr auto jsKeyInfo = concatToArrayNow<dpadKeyInfo, triggerKeyInfo, turboTriggerKeyInfo>;
Expand Down Expand Up @@ -292,18 +290,18 @@ std::string_view C64App::systemKeyCodeToString(KeyCode c)
case C64Key::KeyboardF7: return "F7";
case C64Key::KeyboardF8: return "F8";
case C64Key::KeyboardLeftArrow: return "";
case C64Key::Keyboard1: return "1 ⇧!";
case C64Key::Keyboard2: return "2 ⇧@";
case C64Key::Keyboard3: return "3 ⇧#";
case C64Key::Keyboard4: return "4 ⇧$";
case C64Key::Keyboard5: return "5 ⇧%";
case C64Key::Keyboard1: return "1";
case C64Key::Keyboard2: return "2";
case C64Key::Keyboard3: return "3";
case C64Key::Keyboard4: return "4";
case C64Key::Keyboard5: return "5";
case C64Key::Keyboard6: return "6";
case C64Key::Keyboard7: return "7 ⇧&";
case C64Key::Keyboard8: return "8 ⇧(";
case C64Key::Keyboard9: return "9 ⇧)";
case C64Key::Keyboard7: return "7";
case C64Key::Keyboard8: return "8";
case C64Key::Keyboard9: return "9";
case C64Key::Keyboard0: return "0";
case C64Key::KeyboardPlus: return "+";
case C64Key::KeyboardMinus: return "- ⇧←";
case C64Key::KeyboardMinus: return "-";
case C64Key::KeyboardPound: return "£";
case C64Key::KeyboardClrHome: return "Clr Home";
case C64Key::KeyboardInstDel: return "Inst Del";
Expand Down Expand Up @@ -334,7 +332,7 @@ std::string_view C64App::systemKeyCodeToString(KeyCode c)
case C64Key::KeyboardK: return "K";
case C64Key::KeyboardL: return "L";
case C64Key::KeyboardColon: return ":";
case C64Key::KeyboardSemiColon: return "; ⇧:";
case C64Key::KeyboardSemiColon: return ";";
case C64Key::KeyboardEquals: return "=";
case C64Key::KeyboardReturn: return "Return";
case C64Key::KeyboardCommodore: return "Commodore Logo";
Expand All @@ -346,9 +344,9 @@ std::string_view C64App::systemKeyCodeToString(KeyCode c)
case C64Key::KeyboardB: return "B";
case C64Key::KeyboardN: return "N";
case C64Key::KeyboardM: return "M";
case C64Key::KeyboardComma: return ", ⇧<";
case C64Key::KeyboardPeriod: return ". ⇧>";
case C64Key::KeyboardSlash: return "/ ⇧?";
case C64Key::KeyboardComma: return ",";
case C64Key::KeyboardPeriod: return ".";
case C64Key::KeyboardSlash: return "/";
case C64Key::KeyboardRightShift: return "Right Shift";
case C64Key::KeyboardUp: return "Up";
case C64Key::KeyboardRight: return "Right";
Expand All @@ -369,7 +367,7 @@ std::string_view C64App::systemKeyCodeToString(KeyCode c)
case C64Key::KeyboardLess: return "<";
case C64Key::KeyboardGreater: return ">";
case C64Key::KeyboardQuestion: return "?";
case C64Key::KeyboardApostrophe: return "'\"";
case C64Key::KeyboardApostrophe: return "'";
default: return "";
}
}
Expand Down Expand Up @@ -404,7 +402,17 @@ std::span<const KeyConfigDesc> C64App::defaultKeyConfigs()
KeyMapping{C64Key::Keyboard8, Keycode::_8},
KeyMapping{C64Key::Keyboard9, Keycode::_9},
KeyMapping{C64Key::Keyboard0, Keycode::_0},
KeyMapping{C64Key::KeyboardExclam, {Keycode::LSHIFT, Keycode::_1}},
KeyMapping{C64Key::KeyboardAt, {Keycode::LSHIFT, Keycode::_2}},
KeyMapping{C64Key::KeyboardNumberSign, {Keycode::LSHIFT, Keycode::_3}},
KeyMapping{C64Key::KeyboardDollar, {Keycode::LSHIFT, Keycode::_4}},
KeyMapping{C64Key::KeyboardPercent, {Keycode::LSHIFT, Keycode::_5}},
KeyMapping{C64Key::KeyboardAmpersand, {Keycode::LSHIFT, Keycode::_7}},
KeyMapping{C64Key::KeyboardAsterisk, {Keycode::LSHIFT, Keycode::_8}},
KeyMapping{C64Key::KeyboardParenLeft, {Keycode::LSHIFT, Keycode::_9}},
KeyMapping{C64Key::KeyboardParenRight, {Keycode::LSHIFT, Keycode::_0}},
KeyMapping{C64Key::KeyboardMinus, Keycode::MINUS},
KeyMapping{C64Key::KeyboardLeftArrow, {Keycode::LSHIFT, Keycode::MINUS}},
KeyMapping{C64Key::KeyboardPound, Keycode::BACKSLASH},
KeyMapping{C64Key::KeyboardClrHome, Keycode::HOME},
KeyMapping{C64Key::KeyboardInstDel, Keycode::BACK_SPACE},
Expand Down Expand Up @@ -433,7 +441,9 @@ std::span<const KeyConfigDesc> C64App::defaultKeyConfigs()
KeyMapping{C64Key::KeyboardK, Keycode::K},
KeyMapping{C64Key::KeyboardL, Keycode::L},
KeyMapping{C64Key::KeyboardSemiColon, Keycode::SEMICOLON},
KeyMapping{C64Key::KeyboardColon, {Keycode::LSHIFT, Keycode::SEMICOLON}},
KeyMapping{C64Key::KeyboardEquals, Keycode::EQUALS},
KeyMapping{C64Key::KeyboardPlus, {Keycode::LSHIFT, Keycode::EQUALS}},
KeyMapping{C64Key::KeyboardReturn, Keycode::ENTER},
KeyMapping{C64Key::KeyboardCommodore, Keycode::TAB},
KeyMapping{C64Key::KeyboardLeftShift, Keycode::LSHIFT},
Expand All @@ -445,14 +455,18 @@ std::span<const KeyConfigDesc> C64App::defaultKeyConfigs()
KeyMapping{C64Key::KeyboardN, Keycode::N},
KeyMapping{C64Key::KeyboardM, Keycode::M},
KeyMapping{C64Key::KeyboardComma, Keycode::COMMA},
KeyMapping{C64Key::KeyboardLess, {Keycode::LSHIFT, Keycode::COMMA}},
KeyMapping{C64Key::KeyboardPeriod, Keycode::PERIOD},
KeyMapping{C64Key::KeyboardGreater, {Keycode::LSHIFT, Keycode::PERIOD}},
KeyMapping{C64Key::KeyboardSlash, Keycode::SLASH},
KeyMapping{C64Key::KeyboardQuestion, {Keycode::LSHIFT, Keycode::SLASH}},
KeyMapping{C64Key::KeyboardRightShift, Keycode::RSHIFT},
KeyMapping{C64Key::KeyboardSpace, Keycode::SPACE},
KeyMapping{C64Key::KeyboardCtrlLock, Keycode::INSERT},
KeyMapping{C64Key::KeyboardBracketLeft, Keycode::LEFT_BRACKET},
KeyMapping{C64Key::KeyboardBracketRight, Keycode::RIGHT_BRACKET},
KeyMapping{C64Key::KeyboardApostrophe, Keycode::APOSTROPHE},
KeyMapping{C64Key::KeyboardQuoteDbl, {Keycode::LSHIFT, Keycode::APOSTROPHE}},
};

static constexpr std::array genericGamepadMap
Expand Down Expand Up @@ -552,31 +566,6 @@ VController::KbMap C64System::vControllerKeyboardMap(VControllerKbMode mode)
return mode == VControllerKbMode::LAYOUT_2 ? kbToEventMap2 : kbToEventMap;
}

static KeyCode shiftKeycodeSymbolic(C64Key keycode)
{
switch(keycode)
{
case C64Key::KeyboardEquals: return KeyCode(C64Key::KeyboardPlus);
case C64Key::KeyboardSemiColon: return KeyCode(C64Key::KeyboardColon);
case C64Key::KeyboardMinus: return KeyCode(C64Key::KeyboardLeftArrow);
case C64Key::KeyboardComma: return KeyCode(C64Key::KeyboardLess);
case C64Key::KeyboardPeriod: return KeyCode(C64Key::KeyboardGreater);
case C64Key::KeyboardSlash: return KeyCode(C64Key::KeyboardQuestion);
case C64Key::KeyboardApostrophe: return KeyCode(C64Key::KeyboardQuoteDbl);
case C64Key::KeyboardPound: return KeyCode(C64Key::KeyboardShiftPound);
case C64Key::Keyboard1: return KeyCode(C64Key::KeyboardExclam);
case C64Key::Keyboard2: return KeyCode(C64Key::KeyboardAt);
case C64Key::Keyboard3: return KeyCode(C64Key::KeyboardNumberSign);
case C64Key::Keyboard4: return KeyCode(C64Key::KeyboardDollar);
case C64Key::Keyboard5: return KeyCode(C64Key::KeyboardPercent);
case C64Key::Keyboard7: return KeyCode(C64Key::KeyboardAmpersand);
case C64Key::Keyboard8: return KeyCode(C64Key::KeyboardAsterisk);
case C64Key::Keyboard9: return KeyCode(C64Key::KeyboardParenLeft);
case C64Key::Keyboard0: return KeyCode(C64Key::KeyboardParenRight);
default: return KeyCode(keycode);
}
}

static KeyCode shiftKeycodePositional(C64Key keycode)
{
switch(keycode)
Expand All @@ -586,7 +575,6 @@ static KeyCode shiftKeycodePositional(C64Key keycode)
case C64Key::KeyboardComma: return KeyCode(C64Key::KeyboardLess);
case C64Key::KeyboardPeriod: return KeyCode(C64Key::KeyboardGreater);
case C64Key::KeyboardSlash: return KeyCode(C64Key::KeyboardQuestion);
case C64Key::KeyboardPound: return KeyCode(C64Key::KeyboardShiftPound);
case C64Key::Keyboard1: return KeyCode(C64Key::KeyboardExclam);
case C64Key::Keyboard2: return KeyCode(C64Key::KeyboardQuoteDbl);
case C64Key::Keyboard3: return KeyCode(C64Key::KeyboardNumberSign);
Expand All @@ -600,19 +588,15 @@ static KeyCode shiftKeycodePositional(C64Key keycode)
}
}

static KeyCode shiftKeycode(C64Key keycode, bool positional)
{
return positional ? shiftKeycodePositional(keycode) : shiftKeycodeSymbolic(keycode);
}

void C64System::handleKeyboardInput(InputAction a, bool positionalShift)
{
//logMsg("key:%u %d", key, (int)action);
int mod{};
if(a.metaState & Input::Meta::SHIFT)
{
mod |= KBD_MOD_LSHIFT;
a.code = shiftKeycode(C64Key(a.code), positionalShift);
if(positionalShift)
a.code = shiftKeycodePositional(C64Key(a.code));
}
if(a.metaState & Input::Meta::CAPS_LOCK)
{
Expand Down Expand Up @@ -884,7 +868,6 @@ signed long kbd_arch_keyname_to_keynum(char *keynamePtr)
else if(keyname == "question") { return long(C64Key::KeyboardQuestion); }
else if(keyname == "apostrophe") { return long(C64Key::KeyboardApostrophe); }
else if(keyname == "Caps_Lock") { return long(C64Key::KeyboardShiftLock); }
else if(keyname == "bar") { return long(C64Key::KeyboardShiftPound); }
//logWarn("unknown keyname:%s", keyname.data());
return 0;
}
22 changes: 5 additions & 17 deletions EmuFramework/include/emuframework/AppKeyCode.hh
Original file line number Diff line number Diff line change
Expand Up @@ -88,24 +88,12 @@ constexpr std::array genericWiimoteAppKeyCodeMap

constexpr std::array genericKeyboardAppKeyCodeMap
{
KeyMapping{appKeys.openContent, Input::Keycode::F2},
KeyMapping{appKeys.openContent, {Input::Keycode::LCTRL, Input::Keycode::_2}},
KeyMapping{appKeys.openSystemActions, Input::Keycode::MENU},
KeyMapping{appKeys.saveState, Input::Keycode::F1},
KeyMapping{appKeys.loadState, Input::Keycode::F4},
KeyMapping{appKeys.decStateSlot, Input::Keycode::LEFT_BRACKET},
KeyMapping{appKeys.incStateSlot, Input::Keycode::RIGHT_BRACKET},
KeyMapping{appKeys.fastForward, Input::Keycode::GRAVE},
KeyMapping{appKeys.openMenu, Input::Keycode::BACK_KEY},
};

constexpr std::array genericKeyboardModifierAppKeyCodeMap
{
KeyMapping{appKeys.openContent, {Input::Keycode::LCTRL, Input::Keycode::F2}},
KeyMapping{appKeys.openSystemActions, Input::Keycode::MENU},
KeyMapping{appKeys.saveState, {Input::Keycode::LCTRL, Input::Keycode::F1}},
KeyMapping{appKeys.loadState, {Input::Keycode::LCTRL, Input::Keycode::F4}},
KeyMapping{appKeys.decStateSlot, {Input::Keycode::RCTRL, Input::Keycode::LEFT_BRACKET}},
KeyMapping{appKeys.incStateSlot, {Input::Keycode::RCTRL, Input::Keycode::RIGHT_BRACKET}},
KeyMapping{appKeys.saveState, {Input::Keycode::LCTRL, Input::Keycode::_1}},
KeyMapping{appKeys.loadState, {Input::Keycode::LCTRL, Input::Keycode::_4}},
KeyMapping{appKeys.decStateSlot, {Input::Keycode::LCTRL, Input::Keycode::LEFT_BRACKET}},
KeyMapping{appKeys.incStateSlot, {Input::Keycode::LCTRL, Input::Keycode::RIGHT_BRACKET}},
KeyMapping{appKeys.fastForward, {Input::Keycode::LCTRL, Input::Keycode::GRAVE}},
KeyMapping{appKeys.openMenu, Input::Keycode::BACK_KEY},
};
Expand Down
2 changes: 2 additions & 0 deletions EmuFramework/include/emuframework/ButtonConfigView.hh
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ private:
const Input::Device *savedDev{};
InputManagerView &rootIMView;
std::string actionStr;
MappedKeys pushedKeys;

void initPointerUI();
bool pointerUIIsInit();
void finalize();
};

class ButtonConfigView : public TableView, public EmuAppHelper<ButtonConfigView>
Expand Down
2 changes: 0 additions & 2 deletions EmuFramework/include/emuframework/EmuInput.hh
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
#include <emuframework/TurboInput.hh>
#include <emuframework/inputDefs.hh>
#include <imagine/input/Input.hh>
#include <imagine/util/container/VMemArray.hh>
#include <imagine/util/string/StaticString.hh>
#include <string>
#include <string_view>
#include <memory>
Expand Down
2 changes: 2 additions & 0 deletions EmuFramework/include/emuframework/InputManagerView.hh
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ private:
BoolMenuItem joystickAxisHatDPad;
IG_UseMemberIf(Config::envIsAndroid, BoolMenuItem, consumeUnboundKeys);
//TextMenuItem disconnect {"Disconnect"}; // TODO
TextHeadingMenuItem categories;
TextHeadingMenuItem options;
std::vector<TextMenuItem> inputCategory;
std::vector<MenuItem*> item;
InputDeviceConfig *devConf{};
Expand Down
1 change: 1 addition & 0 deletions EmuFramework/include/emuframework/TurboInput.hh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct TurboInput
constexpr TurboInput() = default;
void addEvent(KeyInfo);
void removeEvent(KeyInfo);
void updateEvent(EmuApp &, KeyInfo, Input::Action);
void update(EmuApp &);
};

Expand Down
1 change: 0 additions & 1 deletion EmuFramework/include/emuframework/VController.hh
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,6 @@ public:
void setDisabledInputKeys(std::span<const KeyCode> keys);
void updateKeyboardMapping();
void updateTextures();
void inputAction(Input::Action action, KeyInfo vBtn);
void resetInput();
void updateAltSpeedModeInput(AltSpeedMode, bool on);
void place();
Expand Down
8 changes: 8 additions & 0 deletions EmuFramework/include/emuframework/inputDefs.hh
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ struct KeyFlags
using KeyCode = uint8_t;
using KeyCodeArray = ZArray<KeyCode, 3>;

constexpr KeyCode comboKeyCode = 255;

struct KeyInfo
{
KeyCodeArray codes;
Expand All @@ -64,7 +66,13 @@ struct KeyInfo
return KeyInfo{code, KeyFlags{.appCode = 1}};
}

static constexpr auto comboKey(KeyCode idx)
{
return KeyInfo{std::array{comboKeyCode, idx}, KeyFlags{.appCode = 1}};
}

constexpr bool isAppKey() const { return flags.appCode; }
constexpr bool isComboKey() const { return isAppKey() && codes[0] == comboKeyCode; }
constexpr bool operator==(const KeyInfo &) const = default;
constexpr explicit operator bool() { return codes[0]; }
constexpr auto &operator[](size_t pos) { return codes[pos]; }
Expand Down
Loading

0 comments on commit c26eecc

Please sign in to comment.