X11: Minimize mod changes
This commit is contained in:
parent
346d9cf375
commit
f80b1d6ef7
1 changed files with 13 additions and 23 deletions
|
|
@ -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<<i) != 0 {
|
||||
mods ^= 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
|
||||
}
|
||||
}
|
||||
return 0, 0
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue