From cd0a01f4de6e1489caa35bece331c81dbaab2587 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Fri, 8 Jul 2022 09:27:17 +0200 Subject: [PATCH] Added binding by keycodes --- src/config/ConfigManager.cpp | 9 +++++++-- src/managers/KeybindManager.cpp | 29 +++++++++++++++++++---------- src/managers/KeybindManager.hpp | 3 ++- src/managers/input/InputManager.cpp | 4 +++- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 570fd1f6..91a73ca1 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -512,8 +512,13 @@ void CConfigManager::handleBind(const std::string& command, const std::string& v return; } - if (KEY != "") - g_pKeybindManager->addKeybind(SKeybind{KEY, MOD, HANDLER, COMMAND, locked, m_szCurrentSubmap}); + if (KEY != "") { + if (isNumber(KEY) && std::stoi(KEY) > 9) + g_pKeybindManager->addKeybind(SKeybind{"", std::stoi(KEY), MOD, HANDLER, COMMAND, locked, m_szCurrentSubmap}); + else + g_pKeybindManager->addKeybind(SKeybind{KEY, -1, MOD, HANDLER, COMMAND, locked, m_szCurrentSubmap}); + } + } void CConfigManager::handleUnbind(const std::string& command, const std::string& value) { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index ce99030e..bb66e83d 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -69,7 +69,7 @@ uint32_t CKeybindManager::stringToModMask(std::string mods) { return modMask; } -bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t& key) { +bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t& key, const int& keycode) { bool found = false; if (handleInternalKeybinds(key)) @@ -82,15 +82,24 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t if (modmask != k.modmask || (g_pCompositor->m_sSeat.exclusiveClient && !k.locked) || k.submap != m_szCurrentSelectedSubmap) continue; - // oMg such performance hit!!11! - // this little maneouver is gonna cost us 4µs - const auto KBKEY = xkb_keysym_from_name(k.key.c_str(), XKB_KEYSYM_CASE_INSENSITIVE); - const auto KBKEYUPPER = xkb_keysym_to_upper(KBKEY); - // small TODO: fix 0-9 keys and other modified ones with shift - - if (key != KBKEY && key != KBKEYUPPER) - continue; + if (k.keycode != -1) { + if (keycode != k.keycode) + continue; + + } else { + if (key == 0) + continue; // this is a keycode check run + + // oMg such performance hit!!11! + // this little maneouver is gonna cost us 4µs + const auto KBKEY = xkb_keysym_from_name(k.key.c_str(), XKB_KEYSYM_CASE_INSENSITIVE); + const auto KBKEYUPPER = xkb_keysym_to_upper(KBKEY); + // small TODO: fix 0-9 keys and other modified ones with shift + + if (key != KBKEY && key != KBKEYUPPER) + continue; + } const auto DISPATCHER = m_mDispatchers.find(k.handler); @@ -99,7 +108,7 @@ bool CKeybindManager::handleKeybinds(const uint32_t& modmask, const xkb_keysym_t Debug::log(ERR, "Inavlid handler in a keybind! (handler %s does not exist)", k.handler.c_str()); } else { // call the dispatcher - Debug::log(LOG, "Keybind triggered, calling dispatcher (%d, %d)", modmask, KBKEYUPPER); + Debug::log(LOG, "Keybind triggered, calling dispatcher (%d, %d)", modmask, key); DISPATCHER->second(k.arg); } diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index c667a41c..08a1cba3 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -8,6 +8,7 @@ struct SKeybind { std::string key = ""; + int keycode = -1; uint32_t modmask = 0; std::string handler = ""; std::string arg = ""; @@ -19,7 +20,7 @@ class CKeybindManager { public: CKeybindManager(); - bool handleKeybinds(const uint32_t&, const xkb_keysym_t&); + bool handleKeybinds(const uint32_t&, const xkb_keysym_t&, const int&); void addKeybind(SKeybind); void removeKeybind(uint32_t, const std::string&); uint32_t stringToModMask(std::string); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index d5febe66..bdcddbe1 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -594,7 +594,9 @@ void CInputManager::onKeyboardKey(wlr_keyboard_key_event* e, SKeyboard* pKeyboar bool found = false; if (e->state == WL_KEYBOARD_KEY_STATE_PRESSED) { for (int i = 0; i < syms; ++i) - found = g_pKeybindManager->handleKeybinds(MODS, keysyms[i]) || found; + found = g_pKeybindManager->handleKeybinds(MODS, keysyms[i], 0) || found; + + found = g_pKeybindManager->handleKeybinds(MODS, 0, KEYCODE) || found; } else if (e->state == WL_KEYBOARD_KEY_STATE_RELEASED) { // hee hee }