summaryrefslogtreecommitdiff
path: root/src/config
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2026-05-02 19:18:44 +0100
committerGitHub <noreply@github.com>2026-05-02 19:18:44 +0100
commita3fa7b49503d8eadd644d68c5bc452b600a11935 (patch)
tree6d660d6dab0c6213ccd2fcf6be303089cd22e383 /src/config
parentfceb15979e487ed74f73e05caf786a91d45b4075 (diff)
keybinds: fix keycode matching on lua (#14254)
Diffstat (limited to 'src/config')
-rw-r--r--src/config/legacy/ConfigManager.cpp8
-rw-r--r--src/config/lua/bindings/LuaBindingsToplevel.cpp23
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;