summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTobias Zimmermann <cu3po42@gmail.com>2024-02-28 00:21:22 +0100
committerGitHub <noreply@github.com>2024-02-27 23:21:22 +0000
commit489ac40abd7b3ae037e1681ee92bbef9d981a29c (patch)
treefba3d5bd1c2ca60837153ddac22d2312021bad56 /src
parente3373669e5544c3f18cf1edcd8fcfff9c6222f5c (diff)
config: Add option to resolve keybinds by sym instead of code (#4851)
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.
Diffstat (limited to 'src')
-rw-r--r--src/config/ConfigManager.cpp2
-rw-r--r--src/helpers/WLClasses.hpp10
-rw-r--r--src/managers/KeybindManager.cpp2
-rw-r--r--src/managers/input/InputManager.cpp11
4 files changed, 18 insertions, 7 deletions
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 8095b64c..5cb18e0f 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -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});
@@ -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});
diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp
index 02681f48..6cc9b5d5 100644
--- a/src/helpers/WLClasses.hpp
+++ b/src/helpers/WLClasses.hpp
@@ -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 {
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 198aa8f6..481b8987 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -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))
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index bda23378..2c8c2d7c 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -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");
@@ -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 != "" &&
@@ -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};
@@ -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);