Skip to content

Commit

Permalink
config: Add option to resolve keybinds by sym instead of code (#4851)
Browse files Browse the repository at this point in the history
This commit adds the new configuration option 'resolve_binds_by_sym'
which can be set globally or per-device. It is off by default, which
preserves the current behavior.

This setting only affects the behavior of keybinds that are defined via
key symbols, not those defined via keycode. Binds defined by symbols
currently activate if the keycode pressed would generate the specified
symbol on the first layout specified in the input section.
If enabled, keys pressed on the relevant device will instead match
keybinds by the symbols they produce with their current layout.

Closes #1881.
  • Loading branch information
Cu3PO42 authored Feb 27, 2024
1 parent e337366 commit 489ac40
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/config/ConfigManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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});
Expand Down Expand Up @@ -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});
Expand Down
10 changes: 6 additions & 4 deletions src/helpers/WLClasses.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/managers/KeybindManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
11 changes: 9 additions & 2 deletions src/managers/input/InputManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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 != "" &&
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 489ac40

Please sign in to comment.