From f80b1d6ef7348bbd5f0541f74c370d08f0860417 Mon Sep 17 00:00:00 2001 From: Unrud Date: Mon, 3 Aug 2026 00:32:34 +0200 Subject: [PATCH] X11: Minimize mod changes --- inputcontrol/controller_x11.go | 36 ++++++++++++---------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/inputcontrol/controller_x11.go b/inputcontrol/controller_x11.go index 8e40c5c..2206df4 100644 --- a/inputcontrol/controller_x11.go +++ b/inputcontrol/controller_x11.go @@ -36,6 +36,8 @@ import "C" import ( "errors" "fmt" + "maps" + "slices" "strings" "sync" "time" @@ -198,31 +200,19 @@ func (p *x11Controller) findKeycodeLocked( if keycode == 0 { return 0, 0 } - var alwaysActiveMods uint - for _, modIndex := range modifierIndexes { - mod := uint(1) << modIndex - if _, modAvailable := modKeycodes[mod]; !modAvailable { - alwaysActiveMods |= activeMods & mod - } - } - _, shiftModAvailable := modKeycodes[C.ShiftMask] - for _, modIndex := range modifierIndexes { - var mod uint - if modIndex != C.ShiftMapIndex { - mod = 1 << modIndex - } - for _, shiftMod := range [...]uint{0, C.ShiftMask} { - if shiftMod != 0 && !shiftModAvailable { - continue - } - mods := alwaysActiveMods | shiftMod | mod - var retMods C.uint - var retKeysym C.KeySym - C.XkbTranslateKeyCode(keyboard, keycode, C.uint(mods), &retMods, &retKeysym) - if retKeysym == C.KeySym(keysym) { - return keycode, mods + for activeModBitmap := range uint(1) << len(modKeycodes) { + mods := activeMods + for i, mod := range slices.Sorted(maps.Keys(modKeycodes)) { + if activeModBitmap&(1<