X11: Minimize mod changes

This commit is contained in:
Unrud 2026-08-03 00:32:34 +02:00
parent 346d9cf375
commit f80b1d6ef7

View file

@ -36,6 +36,8 @@ import "C"
import ( import (
"errors" "errors"
"fmt" "fmt"
"maps"
"slices"
"strings" "strings"
"sync" "sync"
"time" "time"
@ -198,24 +200,13 @@ func (p *x11Controller) findKeycodeLocked(
if keycode == 0 { if keycode == 0 {
return 0, 0 return 0, 0
} }
var alwaysActiveMods uint for activeModBitmap := range uint(1) << len(modKeycodes) {
for _, modIndex := range modifierIndexes { mods := activeMods
mod := uint(1) << modIndex for i, mod := range slices.Sorted(maps.Keys(modKeycodes)) {
if _, modAvailable := modKeycodes[mod]; !modAvailable { if activeModBitmap&(1<<i) != 0 {
alwaysActiveMods |= activeMods & mod mods ^= 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 retMods C.uint
var retKeysym C.KeySym var retKeysym C.KeySym
C.XkbTranslateKeyCode(keyboard, keycode, C.uint(mods), &retMods, &retKeysym) C.XkbTranslateKeyCode(keyboard, keycode, C.uint(mods), &retMods, &retKeysym)
@ -223,7 +214,6 @@ func (p *x11Controller) findKeycodeLocked(
return keycode, mods return keycode, mods
} }
} }
}
return 0, 0 return 0, 0
} }