summaryrefslogtreecommitdiff
path: root/src/managers/KeybindManager.cpp
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-21 16:43:18 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-08-21 16:43:22 +0200
commit0f63077a0774642df6813987fc9d34d0c985901d (patch)
tree4f18308755354edc1e1f0e13b1abf9abf2bee33e /src/managers/KeybindManager.cpp
parent5e1f2539cb24b10cad50eba4c3131190022d5ee0 (diff)
use a custom translation state in keybinds
Diffstat (limited to 'src/managers/KeybindManager.cpp')
-rw-r--r--src/managers/KeybindManager.cpp40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 3d821d14..c38d82dc 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -94,13 +94,51 @@ uint32_t CKeybindManager::stringToModMask(std::string mods) {
return modMask;
}
+void CKeybindManager::updateXKBTranslationState() {
+ if (m_pXKBTranslationState) {
+ xkb_keymap_unref(xkb_state_get_keymap(m_pXKBTranslationState));
+ xkb_state_unref(m_pXKBTranslationState);
+
+ m_pXKBTranslationState = nullptr;
+ }
+
+ const auto FILEPATH = g_pConfigManager->getString("input:kb_file");
+ const auto RULES = g_pConfigManager->getString("input:kb_rules");
+ const auto MODEL = g_pConfigManager->getString("input:kb_model");
+ const auto LAYOUT = g_pConfigManager->getString("input:kb_layout");
+ const auto VARIANT = g_pConfigManager->getString("input:kb_variant");
+ const auto OPTIONS = g_pConfigManager->getString("input:kb_options");
+
+ xkb_rule_names rules = {
+ .rules = RULES.c_str(),
+ .model = MODEL.c_str(),
+ .layout = LAYOUT.c_str(),
+ .variant = VARIANT.c_str(),
+ .options = OPTIONS.c_str()};
+
+ const auto PCONTEXT = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+
+ const auto PKEYMAP = FILEPATH == "" ? xkb_keymap_new_from_names(PCONTEXT, &rules, XKB_KEYMAP_COMPILE_NO_FLAGS) : xkb_keymap_new_from_file(PCONTEXT, fopen(FILEPATH.c_str(), "r"), XKB_KEYMAP_FORMAT_TEXT_V1, XKB_KEYMAP_COMPILE_NO_FLAGS);
+
+ xkb_context_unref(PCONTEXT);
+ m_pXKBTranslationState = xkb_state_new(PKEYMAP);
+}
+
bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard) {
if (pKeyboard->isVirtual)
return true;
+ if (!m_pXKBTranslationState) {
+ Debug::log(ERR, "BUG THIS: m_pXKBTranslationState NULL!");
+ updateXKBTranslationState();
+
+ if (!m_pXKBTranslationState)
+ return true;
+ }
+
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(wlr_keyboard_from_input_device(pKeyboard->keyboard)->xkb_state, KEYCODE);
+ const xkb_keysym_t keysym = xkb_state_key_get_one_sym(m_pXKBTranslationState, KEYCODE);
const auto MODS = g_pInputManager->accumulateModsFromAllKBs();