diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 8095b64c..5cb18e0f 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -448,6 +448,7 @@ CConfigManager::CConfigManager() { m_pConfig->addConfigValue("input:repeat_delay", {600L}); m_pConfig->addConfigValue("input:natural_scroll", {0L}); m_pConfig->addConfigValue("input:numlock_by_default", {0L}); + m_pConfig->addConfigValue("input:resolve_binds_by_sym", {0L}); m_pConfig->addConfigValue("input:force_no_accel", {0L}); m_pConfig->addConfigValue("input:float_switch_override_focus", {1L}); m_pConfig->addConfigValue("input:left_handed", {0L}); @@ -533,6 +534,7 @@ CConfigManager::CConfigManager() { m_pConfig->addSpecialConfigValue("device", "natural_scroll", {0L}); m_pConfig->addSpecialConfigValue("device", "tap_button_map", {STRVAL_EMPTY}); m_pConfig->addSpecialConfigValue("device", "numlock_by_default", {0L}); + m_pConfig->addSpecialConfigValue("device", "resolve_binds_by_sym", {0L}); m_pConfig->addSpecialConfigValue("device", "disable_while_typing", {1L}); m_pConfig->addSpecialConfigValue("device", "clickfinger_behavior", {0L}); m_pConfig->addSpecialConfigValue("device", "middle_button_emulation", {0L}); diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index 02681f48..6cc9b5d5 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -127,15 +127,17 @@ struct SKeyboard { bool active = false; bool enabled = true; - xkb_layout_index_t activeLayout = 0; + xkb_layout_index_t activeLayout = 0; + xkb_state* xkbTranslationState = nullptr; std::string name = ""; std::string xkbFilePath = ""; SStringRuleNames currentRules; - int repeatRate = 0; - int repeatDelay = 0; - int numlockOn = -1; + int repeatRate = 0; + int repeatDelay = 0; + int numlockOn = -1; + bool resolveBindsBySym = false; // For the list lookup bool operator==(const SKeyboard& rhs) const { diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 198aa8f6..481b8987 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -304,7 +304,7 @@ bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard const auto KEYCODE = e->keycode + 8; // Because to xkbcommon it's +8 from libinput - const xkb_keysym_t keysym = xkb_state_key_get_one_sym(m_pXKBTranslationState, KEYCODE); + const xkb_keysym_t keysym = xkb_state_key_get_one_sym(pKeyboard->resolveBindsBySym ? pKeyboard->xkbTranslationState : m_pXKBTranslationState, KEYCODE); const xkb_keysym_t internalKeysym = xkb_state_key_get_one_sym(wlr_keyboard_from_input_device(pKeyboard->keyboard)->xkb_state, KEYCODE); if (handleInternalKeybinds(internalKeysym)) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index bda23378..2c8c2d7c 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -823,7 +823,8 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) { const auto REPEATRATE = g_pConfigManager->getDeviceInt(devname, "repeat_rate", "input:repeat_rate"); const auto REPEATDELAY = g_pConfigManager->getDeviceInt(devname, "repeat_delay", "input:repeat_delay"); - const auto NUMLOCKON = g_pConfigManager->getDeviceInt(devname, "numlock_by_default", "input:numlock_by_default"); + const auto NUMLOCKON = g_pConfigManager->getDeviceInt(devname, "numlock_by_default", "input:numlock_by_default"); + const auto RESOLVEBINDSBYSYM = g_pConfigManager->getDeviceInt(devname, "resolve_binds_by_sym", "input:resolve_binds_by_sym"); const auto FILEPATH = g_pConfigManager->getDeviceString(devname, "kb_file", "input:kb_file"); const auto RULES = g_pConfigManager->getDeviceString(devname, "kb_rules", "input:kb_rules"); @@ -834,7 +835,8 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) { const auto ENABLED = HASCONFIG ? g_pConfigManager->getDeviceInt(devname, "enabled") : true; - pKeyboard->enabled = ENABLED; + pKeyboard->enabled = ENABLED; + pKeyboard->resolveBindsBySym = RESOLVEBINDSBYSYM; try { if (NUMLOCKON == pKeyboard->numlockOn && REPEATDELAY == pKeyboard->repeatDelay && REPEATRATE == pKeyboard->repeatRate && RULES != "" && @@ -906,6 +908,9 @@ void CInputManager::applyConfigToKeyboard(SKeyboard* pKeyboard) { KEYMAP = xkb_keymap_new_from_names(CONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS); } + xkb_state_unref(pKeyboard->xkbTranslationState); + pKeyboard->xkbTranslationState = xkb_state_new(KEYMAP); + wlr_keyboard_set_keymap(wlr_keyboard_from_input_device(pKeyboard->keyboard), KEYMAP); wlr_keyboard_modifiers wlrMods = {0}; @@ -1127,6 +1132,8 @@ void CInputManager::destroyKeyboard(SKeyboard* pKeyboard) { pKeyboard->hyprListener_keyboardMod.removeCallback(); pKeyboard->hyprListener_keyboardKey.removeCallback(); + xkb_state_unref(pKeyboard->xkbTranslationState); + if (pKeyboard->active) { m_lKeyboards.remove(*pKeyboard);