diff options
Diffstat (limited to 'src/config')
| -rw-r--r-- | src/config/legacy/ConfigManager.cpp | 8 | ||||
| -rw-r--r-- | src/config/lua/bindings/LuaBindingsToplevel.cpp | 23 |
2 files changed, 21 insertions, 10 deletions
diff --git a/src/config/legacy/ConfigManager.cpp b/src/config/legacy/ConfigManager.cpp index 2705c395..1b18b4a7 100644 --- a/src/config/legacy/ConfigManager.cpp +++ b/src/config/legacy/ConfigManager.cpp @@ -1538,15 +1538,15 @@ std::optional<std::string> CConfigManager::handleBind(const std::string& command else if ((ARGS.size() > sc<size_t>(4) + DESCR_OFFSET + DEVICE_OFFSET && !mouse) || (ARGS.size() > sc<size_t>(3) + DESCR_OFFSET + DEVICE_OFFSET && mouse)) return "bind: too many args"; - std::vector<xkb_keysym_t> KEYSYMS; - std::vector<xkb_keysym_t> MODS; + std::vector<KeybindKey> KEYSYMS; + std::vector<KeybindKey> MODS; if (multiKey) { for (const auto& splitKey : CVarList(ARGS[1], 8, '&')) { - KEYSYMS.emplace_back(xkb_keysym_from_name(splitKey.c_str(), XKB_KEYSYM_CASE_INSENSITIVE)); + KEYSYMS.emplace_back(xkb_keysym_from_name(splitKey.c_str(), XKB_KEYSYM_CASE_INSENSITIVE), 0); } for (const auto& splitMod : CVarList(ARGS[0], 8, '&')) { - MODS.emplace_back(xkb_keysym_from_name(splitMod.c_str(), XKB_KEYSYM_CASE_INSENSITIVE)); + MODS.emplace_back(xkb_keysym_from_name(splitMod.c_str(), XKB_KEYSYM_CASE_INSENSITIVE), 0); } } const auto MOD = g_pKeybindManager->stringToModMask(ARGS[0]); diff --git a/src/config/lua/bindings/LuaBindingsToplevel.cpp b/src/config/lua/bindings/LuaBindingsToplevel.cpp index 8bdd1c19..2d54a7b3 100644 --- a/src/config/lua/bindings/LuaBindingsToplevel.cpp +++ b/src/config/lua/bindings/LuaBindingsToplevel.cpp @@ -9,6 +9,7 @@ #include "../../../devices/IKeyboard.hpp" #include "../../../managers/eventLoop/EventLoopManager.hpp" +#include <hyprutils/string/Numeric.hpp> #include <hyprutils/string/String.hpp> #include <hyprutils/string/VarList.hpp> @@ -46,12 +47,12 @@ static bool isSymSpecial(std::string_view sv) { } static std::expected<void, std::string> parseKeyString(SKeybind& kb, std::string_view sv) { - bool modsEnded = false, specialSym = false; - CVarList2 vl(sv, 0, '+', true); + bool modsEnded = false, specialSym = false; + CVarList2 vl(sv, 0, '+', true); - uint32_t modMask = 0; - std::vector<xkb_keysym_t> keysyms; - std::string lastKeyArg; + uint32_t modMask = 0; + std::vector<std::pair<xkb_keysym_t, xkb_keycode_t>> keysyms; + std::string lastKeyArg; if (sv == "catchall") { kb.catchAll = true; @@ -86,6 +87,16 @@ static std::expected<void, std::string> parseKeyString(SKeybind& kb, std::string continue; } + if (arg.starts_with("code:") && isNumber(std::string{arg.substr(5)})) { + auto res = strToNumber<uint32_t>(arg.substr(5)); + + if (!res) + return std::unexpected(std::format("Invalid keycode: \"{}\".", arg)); + + keysyms.emplace_back(XKB_KEY_NoSymbol, xkb_keycode_t{*res}); + continue; + } + auto sym = xkb_keysym_from_name(std::string{arg}.c_str(), XKB_KEYSYM_CASE_INSENSITIVE); if (sym == XKB_KEY_NoSymbol) { @@ -99,7 +110,7 @@ static std::expected<void, std::string> parseKeyString(SKeybind& kb, std::string } lastKeyArg = arg; - keysyms.emplace_back(sym); + keysyms.emplace_back(sym, 0); } kb.modmask = modMask; |
