mirror of https://github.com/stella-emu/stella.git
Handle modekey mask properly.
This commit is contained in:
parent
aa42c51709
commit
f44f5654e4
|
@ -22,6 +22,52 @@
|
||||||
|
|
||||||
using json = nlohmann::json;
|
using json = nlohmann::json;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
json serializeModkeyMask(int mask)
|
||||||
|
{
|
||||||
|
if(mask == StellaMod::KBDM_NONE) return json(nullptr);
|
||||||
|
|
||||||
|
json serializedMask = json::array();
|
||||||
|
|
||||||
|
for(StellaMod mod: {
|
||||||
|
StellaMod::KBDM_CTRL,
|
||||||
|
StellaMod::KBDM_SHIFT,
|
||||||
|
StellaMod::KBDM_ALT,
|
||||||
|
StellaMod::KBDM_GUI,
|
||||||
|
StellaMod::KBDM_LSHIFT,
|
||||||
|
StellaMod::KBDM_RSHIFT,
|
||||||
|
StellaMod::KBDM_LCTRL,
|
||||||
|
StellaMod::KBDM_RCTRL,
|
||||||
|
StellaMod::KBDM_LALT,
|
||||||
|
StellaMod::KBDM_RALT,
|
||||||
|
StellaMod::KBDM_LGUI,
|
||||||
|
StellaMod::KBDM_RGUI,
|
||||||
|
StellaMod::KBDM_NUM,
|
||||||
|
StellaMod::KBDM_CAPS,
|
||||||
|
StellaMod::KBDM_MODE,
|
||||||
|
StellaMod::KBDM_RESERVED
|
||||||
|
}) {
|
||||||
|
if((mask & mod) != mod) continue;
|
||||||
|
|
||||||
|
serializedMask.push_back(json(mod));
|
||||||
|
mask &= ~mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
return serializedMask.size() == 1 ? serializedMask.at(0) : serializedMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
int deserializeModkeyMask(json serializedMask)
|
||||||
|
{
|
||||||
|
if (serializedMask.is_null()) return StellaMod::KBDM_NONE;
|
||||||
|
if (!serializedMask.is_array()) return serializedMask.get<StellaMod>();
|
||||||
|
|
||||||
|
int mask = 0;
|
||||||
|
for(const json& mod: serializedMask) mask |= mod.get<StellaMod>();
|
||||||
|
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void KeyMap::add(const Event::Type event, const Mapping& mapping)
|
void KeyMap::add(const Event::Type event, const Mapping& mapping)
|
||||||
{
|
{
|
||||||
|
@ -186,7 +232,7 @@ json KeyMap::saveMapping(const EventMode mode) const
|
||||||
mapping["key"] = item.first.key;
|
mapping["key"] = item.first.key;
|
||||||
|
|
||||||
if (item.first.mod != StellaMod::KBDM_NONE)
|
if (item.first.mod != StellaMod::KBDM_NONE)
|
||||||
mapping["mod"] = item.first.mod;
|
mapping["mod"] = serializeModkeyMask(item.first.mod);
|
||||||
|
|
||||||
mappings.push_back(mapping);
|
mappings.push_back(mapping);
|
||||||
}
|
}
|
||||||
|
@ -204,7 +250,7 @@ int KeyMap::loadMapping(const json& mappings, const EventMode mode) {
|
||||||
mapping.at("event").get<Event::Type>(),
|
mapping.at("event").get<Event::Type>(),
|
||||||
mode,
|
mode,
|
||||||
mapping.at("key").get<StellaKey>(),
|
mapping.at("key").get<StellaKey>(),
|
||||||
mapping.contains("mod") ? mapping.at("mod").get<StellaMod>() : StellaMod::KBDM_NONE
|
mapping.contains("mod") ? deserializeModkeyMask(mapping.at("mod")) : StellaMod::KBDM_NONE
|
||||||
);
|
);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
|
@ -235,7 +281,7 @@ json KeyMap::convertLegacyMapping(string list)
|
||||||
mapping["event"] = Event::Type(event);
|
mapping["event"] = Event::Type(event);
|
||||||
mapping["key"] = StellaKey(key);
|
mapping["key"] = StellaKey(key);
|
||||||
|
|
||||||
if (StellaMod(mod) != StellaMod::KBDM_NONE) mapping["mod"] = StellaMod(mod);
|
if (StellaMod(mod) != StellaMod::KBDM_NONE) mapping["mod"] = serializeModkeyMask(mod);
|
||||||
|
|
||||||
convertedMapping.push_back(mapping);
|
convertedMapping.push_back(mapping);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue