Skip to content

Commit

Permalink
keybinds: fixup xkb_states for resolve_by_sym
Browse files Browse the repository at this point in the history
fixes #7750
  • Loading branch information
vaxerski committed Oct 8, 2024
1 parent b3a7e31 commit e0cfbec
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 3 deletions.
10 changes: 10 additions & 0 deletions src/devices/IKeyboard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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;

Expand Down
5 changes: 3 additions & 2 deletions src/devices/IKeyboard.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/managers/KeybindManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit e0cfbec

Please sign in to comment.