aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2024-10-08 13:15:53 +0100
committerVaxry <[email protected]>2024-10-09 13:47:52 +0100
commit736a8735b3d160a3228c7b6dacc82dfc9ffc22ba (patch)
tree7f8a54b4ea4b14d304268b95af9ddbeb41baed11
parentb54eecbd79165e8eaf73e7db2f20f6afe80fc30f (diff)
downloadHyprland-736a8735b3d160a3228c7b6dacc82dfc9ffc22ba.tar.gz
Hyprland-736a8735b3d160a3228c7b6dacc82dfc9ffc22ba.zip
keybinds: fixup xkb_states for resolve_by_sym
fixes #7750
-rw-r--r--src/devices/IKeyboard.cpp10
-rw-r--r--src/devices/IKeyboard.hpp5
-rw-r--r--src/managers/KeybindManager.cpp2
3 files changed, 14 insertions, 3 deletions
diff --git a/src/devices/IKeyboard.cpp b/src/devices/IKeyboard.cpp
index 13440169..3300f252 100644
--- a/src/devices/IKeyboard.cpp
+++ b/src/devices/IKeyboard.cpp
@@ -178,13 +178,18 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
if (xkbState)
xkb_state_unref(xkbState);
+ if (xkbSymState)
+ xkb_state_unref(xkbSymState);
+
xkbState = nullptr;
xkbStaticState = nullptr;
+ xkbSymState = nullptr;
if (keymap) {
Debug::log(LOG, "Updating keyboard {:x}'s translation state from a provided keymap", (uintptr_t)this);
xkbStaticState = xkb_state_new(keymap);
xkbState = xkb_state_new(keymap);
+ xkbSymState = xkb_state_new(keymap);
return;
}
@@ -230,6 +235,7 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
xkbState = xkb_state_new(KEYMAP);
xkbStaticState = xkb_state_new(KEYMAP);
+ xkbSymState = xkb_state_new(KEYMAP);
xkb_keymap_unref(KEYMAP);
xkb_context_unref(PCONTEXT);
@@ -252,6 +258,7 @@ void IKeyboard::updateXKBTranslationState(xkb_keymap* const keymap) {
xkbState = xkb_state_new(NEWKEYMAP);
xkbStaticState = xkb_state_new(NEWKEYMAP);
+ xkbSymState = xkb_state_new(NEWKEYMAP);
xkb_keymap_unref(NEWKEYMAP);
xkb_context_unref(PCONTEXT);
@@ -332,6 +339,9 @@ void IKeyboard::updateModifiers(uint32_t depressed, uint32_t latched, uint32_t l
xkb_state_update_mask(xkbState, depressed, latched, locked, 0, 0, group);
+ if (xkbSymState)
+ xkb_state_update_mask(xkbSymState, 0, 0, 0, 0, 0, group);
+
if (!updateModifiersState())
return;
diff --git a/src/devices/IKeyboard.hpp b/src/devices/IKeyboard.hpp
index 759b2f58..76d2c31b 100644
--- a/src/devices/IKeyboard.hpp
+++ b/src/devices/IKeyboard.hpp
@@ -82,8 +82,9 @@ class IKeyboard : public IHID {
bool keymapOverridden = false;
xkb_layout_index_t activeLayout = 0;
- xkb_state * xkbState = nullptr, *xkbStaticState /* Static state: never gets modifiers or layout changes sent, used for keybinds. */ = nullptr;
- xkb_keymap* xkbKeymap = nullptr;
+ xkb_state * xkbState = nullptr, *xkbStaticState /* Static state: never gets modifiers or layout changes sent, used for keybinds. */ = nullptr,
+ *xkbSymState = nullptr /* Same as static but gets layouts */;
+ xkb_keymap* xkbKeymap = nullptr;
struct {
uint32_t depressed = 0, latched = 0, locked = 0, group = 0;
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index cd47bf71..d893e258 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -376,7 +376,7 @@ bool CKeybindManager::onKeyEvent(std::any event, SP<IKeyboard> 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(pKeyboard->resolveBindsBySym ? pKeyboard->xkbState : m_pXKBTranslationState, KEYCODE);
+ const xkb_keysym_t keysym = xkb_state_key_get_one_sym(pKeyboard->resolveBindsBySym ? pKeyboard->xkbSymState : m_pXKBTranslationState, KEYCODE);
const xkb_keysym_t internalKeysym = xkb_state_key_get_one_sym(pKeyboard->xkbState, KEYCODE);
if (handleInternalKeybinds(internalKeysym))