add support for specifying multiple keys per command in config

This commit is contained in:
ohsqueezy 2023-08-02 13:17:44 -04:00
parent 67fa7e61c3
commit 62450f7033
2 changed files with 41 additions and 24 deletions

View File

@ -30,45 +30,60 @@ void Input::print_key_combination(const KeyCombination &combination) const
void Input::load_key_map()
{
const nlohmann::json& config = configuration()();
for (auto& entry : config.at("keys").items())
for (const auto& [command, input] : config.at("keys").items())
{
bool ctrl = false, alt = false, shift = false;
int key;
if (not entry.value().is_string())
if (input.is_array())
{
for (std::string part : entry.value())
if (input[0].is_array())
{
if (part == "CTRL")
for (nlohmann::json version : input)
{
ctrl = true;
}
else if (part == "SHIFT")
{
shift = true;
}
else if (part == "ALT")
{
alt = true;
}
else
{
key = get_key_code(part);
key_map.push_back(parse_key(command, version));
}
}
else
{
key_map.push_back(parse_key(command, input));
}
}
else
{
key = get_key_code(entry.value());
key_map.push_back((KeyCombination){command, get_key_code(input.get<std::string>()), false, false, false});
}
add_to_key_map(entry.key(), key, ctrl, shift, alt);
}
}
int Input::get_key_code(const std::string& name)
KeyCombination Input::parse_key(const std::string& command, const nlohmann::json& json) const
{
SDL_Keycode key_code;
bool ctrl = false, alt = false, shift = false;
for (const std::string& component : json)
{
if (component == "CTRL")
{
ctrl = true;
}
else if (component == "SHIFT")
{
shift = true;
}
else if (component == "ALT")
{
alt = true;
}
else
{
key_code = get_key_code(component);
}
}
return (KeyCombination){command, key_code, ctrl, shift, alt};
}
int Input::get_key_code(const std::string& name) const
{
if (key_ids.count(name) > 0)
{
return key_ids[name];
return key_ids.at(name);
}
else
{

View File

@ -56,6 +56,8 @@ private:
std::vector<KeyCombination> key_map;
bool suppressed = false;
KeyCombination parse_key(const std::string& command, const nlohmann::json& json) const;
public:
inline static std::string any = "any";
@ -64,7 +66,7 @@ public:
Input(Node*);
void respond(SDL_Event&);
void load_key_map();
SDL_Keycode get_key_code(const std::string&);
SDL_Keycode get_key_code(const std::string&) const;
void add_to_key_map(std::string, SDL_Keycode, bool = false, bool = false, bool = false);
void print_key_combination(const KeyCombination&) const;
void suppress();