chore: use dynamic duration for scheduleAutoRelease

This commit is contained in:
Siyuan Miao 2025-09-17 18:41:47 +02:00
parent 53789ebd75
commit 6892eeba42
2 changed files with 35 additions and 24 deletions

View File

@ -157,6 +157,9 @@ func (u *UsbGadget) SetOnKeepAliveReset(f func()) {
u.onKeepAliveReset = &f u.onKeepAliveReset = &f
} }
// DefaultAutoReleaseDuration is the default duration for auto-release of a key.
const DefaultAutoReleaseDuration = 100 * time.Millisecond
func (u *UsbGadget) scheduleAutoRelease(key byte) { func (u *UsbGadget) scheduleAutoRelease(key byte) {
u.kbdAutoReleaseLock.Lock() u.kbdAutoReleaseLock.Lock()
defer unlockWithLog(&u.kbdAutoReleaseLock, u.log, "autoRelease scheduled") defer unlockWithLog(&u.kbdAutoReleaseLock, u.log, "autoRelease scheduled")
@ -165,10 +168,14 @@ func (u *UsbGadget) scheduleAutoRelease(key byte) {
u.kbdAutoReleaseTimers[key].Stop() u.kbdAutoReleaseTimers[key].Stop()
} }
// TODO: This shouldn't use the global autoReleaseKeyboardStartInterval duration := u.kbdAutoReleaseTimerExtension
// but rather the baseExtension from the keepalive jitter compensation logic. if duration == 0 {
// Make them global as they will in the future likely be variable. duration = DefaultAutoReleaseDuration
u.kbdAutoReleaseTimers[key] = time.AfterFunc(100*time.Millisecond, func() { }
u.log.Debug().Dur("duration", duration).Msg("autoRelease scheduled with duration")
u.kbdAutoReleaseTimers[key] = time.AfterFunc(duration, func() {
u.performAutoRelease(key) u.performAutoRelease(key)
}) })
} }
@ -197,6 +204,8 @@ func (u *UsbGadget) DelayAutoReleaseWithDuration(resetDuration time.Duration) {
return return
} }
u.kbdAutoReleaseTimerExtension = resetDuration
u.log.Debug().Dur("reset_duration", resetDuration).Msg("delaying auto-release with dynamic duration") u.log.Debug().Dur("reset_duration", resetDuration).Msg("delaying auto-release with dynamic duration")
for _, timer := range u.kbdAutoReleaseTimers { for _, timer := range u.kbdAutoReleaseTimers {

View File

@ -68,8 +68,9 @@ type UsbGadget struct {
keyboardState byte // keyboard latched state (NumLock, CapsLock, ScrollLock, Compose, Kana) keyboardState byte // keyboard latched state (NumLock, CapsLock, ScrollLock, Compose, Kana)
keysDownState KeysDownState // keyboard dynamic state (modifier keys and pressed keys) keysDownState KeysDownState // keyboard dynamic state (modifier keys and pressed keys)
kbdAutoReleaseLock sync.Mutex kbdAutoReleaseLock sync.Mutex
kbdAutoReleaseTimers map[byte]*time.Timer kbdAutoReleaseTimers map[byte]*time.Timer
kbdAutoReleaseTimerExtension time.Duration
keyboardStateLock sync.Mutex keyboardStateLock sync.Mutex
keyboardStateCtx context.Context keyboardStateCtx context.Context
@ -122,24 +123,25 @@ func newUsbGadget(name string, configMap map[string]gadgetConfigItem, enabledDev
keyboardCtx, keyboardCancel := context.WithCancel(context.Background()) keyboardCtx, keyboardCancel := context.WithCancel(context.Background())
g := &UsbGadget{ g := &UsbGadget{
name: name, name: name,
kvmGadgetPath: path.Join(gadgetPath, name), kvmGadgetPath: path.Join(gadgetPath, name),
configC1Path: path.Join(gadgetPath, name, "configs/c.1"), configC1Path: path.Join(gadgetPath, name, "configs/c.1"),
configMap: configMap, configMap: configMap,
customConfig: *config, customConfig: *config,
configLock: sync.Mutex{}, configLock: sync.Mutex{},
keyboardLock: sync.Mutex{}, keyboardLock: sync.Mutex{},
absMouseLock: sync.Mutex{}, absMouseLock: sync.Mutex{},
relMouseLock: sync.Mutex{}, relMouseLock: sync.Mutex{},
txLock: sync.Mutex{}, txLock: sync.Mutex{},
keyboardStateCtx: keyboardCtx, keyboardStateCtx: keyboardCtx,
keyboardStateCancel: keyboardCancel, keyboardStateCancel: keyboardCancel,
keyboardState: 0, keyboardState: 0,
keysDownState: KeysDownState{Modifier: 0, Keys: []byte{0, 0, 0, 0, 0, 0}}, // must be initialized to hidKeyBufferSize (6) zero bytes keysDownState: KeysDownState{Modifier: 0, Keys: []byte{0, 0, 0, 0, 0, 0}}, // must be initialized to hidKeyBufferSize (6) zero bytes
kbdAutoReleaseTimers: make(map[byte]*time.Timer), kbdAutoReleaseTimers: make(map[byte]*time.Timer),
enabledDevices: *enabledDevices, kbdAutoReleaseTimerExtension: 0,
lastUserInput: time.Now(), enabledDevices: *enabledDevices,
log: logger, lastUserInput: time.Now(),
log: logger,
strictMode: config.strictMode, strictMode: config.strictMode,