From 6e2467cc24f8afb70a4aaad3841a7c41fbc568b5 Mon Sep 17 00:00:00 2001 From: vaxerski Date: Tue, 16 Aug 2022 16:10:20 +0200 Subject: [PATCH] fix active keymap in hyprctl devices --- src/debug/HyprCtl.cpp | 4 ++-- src/managers/input/InputManager.cpp | 19 +++++++++++++++++++ src/managers/input/InputManager.hpp | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index 21f4e23d..bee5ce79 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -300,7 +300,7 @@ R"#( { result += "\"keyboards\": [\n"; for (auto& k : g_pInputManager->m_lKeyboards) { - const auto KM = xkb_keymap_layout_get_name(wlr_keyboard_from_input_device(k.keyboard)->keymap, 0); + const auto KM = g_pInputManager->getActiveLayoutForKeyboard(&k); result += getFormat( R"#( { "address": "0x%x", @@ -385,7 +385,7 @@ R"#( { result += "\n\nKeyboards:\n"; for (auto& k : g_pInputManager->m_lKeyboards) { - const auto KM = xkb_keymap_layout_get_name(wlr_keyboard_from_input_device(k.keyboard)->keymap, 0); + const auto KM = g_pInputManager->getActiveLayoutForKeyboard(&k); result += getFormat("\tKeyboard at %x:\n\t\t%s\n\t\t\trules: r \"%s\", m \"%s\", l \"%s\", v \"%s\", o \"%s\"\n\t\t\tactive keymap: %s\n", &k, k.keyboard->name, k.currentRules.rules.c_str(), k.currentRules.model.c_str(), k.currentRules.layout.c_str(), k.currentRules.variant.c_str(), k.currentRules.options.c_str(), KM); } diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index c60b85bf..c552910c 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -887,3 +887,22 @@ uint32_t CInputManager::accumulateModsFromAllKBs() { return finalMask; } + +std::string CInputManager::getActiveLayoutForKeyboard(SKeyboard* pKeyboard) { + const auto WLRKB = wlr_keyboard_from_input_device(pKeyboard->keyboard); + const auto KEYMAP = WLRKB->keymap; + const auto STATE = WLRKB->xkb_state; + const auto LAYOUTSNUM = xkb_keymap_num_layouts(KEYMAP); + + for (auto i = 0; i < LAYOUTSNUM; ++i) { + if (xkb_state_layout_index_is_active(STATE, i, XKB_STATE_LAYOUT_EFFECTIVE)) { + const auto LAYOUTNAME = xkb_keymap_layout_get_name(KEYMAP, i); + + if (LAYOUTNAME) + return std::string(LAYOUTNAME); + return "error"; + } + } + + return "none"; +} diff --git a/src/managers/input/InputManager.hpp b/src/managers/input/InputManager.hpp index b9e04d23..6f472521 100644 --- a/src/managers/input/InputManager.hpp +++ b/src/managers/input/InputManager.hpp @@ -35,6 +35,7 @@ public: void constrainMouse(SMouse*, wlr_pointer_constraint_v1*); void recheckConstraint(SMouse*); void unconstrainMouse(); + std::string getActiveLayoutForKeyboard(SKeyboard*); Vector2D getMouseCoordsInternal(); void refocus();