32 lines
921 B
Go
32 lines
921 B
Go
// Copyright (c) 2026 Storm Dragon
|
|
// Authors: Storm Dragon, Angus Kola
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package input
|
|
|
|
// RepeatTracker is owned by the native input producer. Classic X11 repeats
|
|
// release and press with the same timestamp; detectable autorepeat emits
|
|
// another press while the key remains down. Neither is a fresh physical press.
|
|
type RepeatTracker struct {
|
|
held [256]bool
|
|
releasedTimestamp [256]uint32
|
|
}
|
|
|
|
func (tracker *RepeatTracker) Observe(event Event) bool {
|
|
code := event.Keycode
|
|
if !event.Pressed {
|
|
tracker.held[code] = false
|
|
tracker.releasedTimestamp[code] = event.Timestamp
|
|
return false
|
|
}
|
|
repeated := tracker.held[code] || event.Timestamp != 0 &&
|
|
tracker.releasedTimestamp[code] == event.Timestamp
|
|
tracker.held[code] = true
|
|
tracker.releasedTimestamp[code] = 0
|
|
return repeated
|
|
}
|
|
|
|
func (tracker *RepeatTracker) Reset() {
|
|
*tracker = RepeatTracker{}
|
|
}
|