From e12ddaff799d718afc393bd175f9c31e55f2b99d Mon Sep 17 00:00:00 2001 From: Marc Brooks Date: Wed, 5 Nov 2025 14:56:04 -0600 Subject: [PATCH] Use a single exported HidKeyBufferSize from hid_keyboard --- internal/hidrpc/message.go | 9 ++++----- internal/usbgadget/hid_keyboard.go | 16 ++++++++-------- internal/usbgadget/usbgadget.go | 2 +- jsonrpc.go | 2 +- 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/internal/hidrpc/message.go b/internal/hidrpc/message.go index 381801f4..a42ca4e3 100644 --- a/internal/hidrpc/message.go +++ b/internal/hidrpc/message.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/google/uuid" + "github.com/jetkvm/kvm/internal/usbgadget" ) // Message .. @@ -135,18 +136,16 @@ func (m *Message) KeyboardReport() (KeyboardReport, error) { // Macro .. type KeyboardMacroStep struct { Modifier byte // 1 byte - Keys []byte // 6 bytes: HidKeyBufferSize + Keys []byte // 6 bytes: usbgadget.HidKeyBufferSize Delay uint16 // 2 bytes } + type KeyboardMacroReport struct { IsPaste bool StepCount uint32 Steps []KeyboardMacroStep } -// HidKeyBufferSize is the size of the keys buffer in the keyboard report. -const HidKeyBufferSize int = 6 - // KeyboardMacroReport returns the keyboard macro report from the message. func (m *Message) KeyboardMacroReport() (KeyboardMacroReport, error) { if m.t != TypeKeyboardMacroReport { @@ -171,7 +170,7 @@ func (m *Message) KeyboardMacroReport() (KeyboardMacroReport, error) { Delay: binary.BigEndian.Uint16(m.d[offset+7 : offset+9]), }) - offset += 1 + HidKeyBufferSize + 2 + offset += 1 + usbgadget.HidKeyBufferSize + 2 } return KeyboardMacroReport{ diff --git a/internal/usbgadget/hid_keyboard.go b/internal/usbgadget/hid_keyboard.go index 8f7829ac..7a12f5ac 100644 --- a/internal/usbgadget/hid_keyboard.go +++ b/internal/usbgadget/hid_keyboard.go @@ -76,7 +76,7 @@ var keyboardReportDesc = []byte{ const ( hidReadBufferSize = 8 - hidKeyBufferSize = 6 + HidKeyBufferSize = 6 hidErrorRollOver = 0x01 // https://www.usb.org/sites/default/files/documents/hid1_11.pdf // https://www.usb.org/sites/default/files/hut1_2.pdf @@ -342,7 +342,7 @@ func (u *UsbGadget) keyboardWriteHidFile(modifier byte, keys []byte) error { return err } - _, err := u.writeWithTimeout(u.keyboardHidFile, append([]byte{modifier, 0x00}, keys[:hidKeyBufferSize]...)) + _, err := u.writeWithTimeout(u.keyboardHidFile, append([]byte{modifier, 0x00}, keys[:HidKeyBufferSize]...)) if err != nil { u.logWithSuppression("keyboardWriteHidFile", 100, u.log, err, "failed to write to hidg0") u.keyboardHidFile.Close() @@ -386,11 +386,11 @@ func (u *UsbGadget) UpdateKeysDown(modifier byte, keys []byte) KeysDownState { func (u *UsbGadget) KeyboardReport(modifier byte, keys []byte) error { defer u.resetUserInputTime() - if len(keys) > hidKeyBufferSize { - keys = keys[:hidKeyBufferSize] + if len(keys) > HidKeyBufferSize { + keys = keys[:HidKeyBufferSize] } - if len(keys) < hidKeyBufferSize { - keys = append(keys, make([]byte, hidKeyBufferSize-len(keys))...) + if len(keys) < HidKeyBufferSize { + keys = append(keys, make([]byte, HidKeyBufferSize-len(keys))...) } err := u.keyboardWriteHidFile(modifier, keys) @@ -473,7 +473,7 @@ func (u *UsbGadget) keypressReport(key byte, press bool) (KeysDownState, error) // handle other keys that are not modifier keys by placing or removing them // from the key buffer since the buffer tracks currently pressed keys overrun := true - for i := range hidKeyBufferSize { + for i := range HidKeyBufferSize { // If we find the key in the buffer the buffer, we either remove it (if press is false) // or do nothing (if down is true) because the buffer tracks currently pressed keys // and if we find a zero byte, we can place the key there (if press is true) @@ -484,7 +484,7 @@ func (u *UsbGadget) keypressReport(key byte, press bool) (KeysDownState, error) // we are releasing the key, remove it from the buffer if keys[i] != 0 { copy(keys[i:], keys[i+1:]) - keys[hidKeyBufferSize-1] = 0 // Clear the last byte + keys[HidKeyBufferSize-1] = 0 // Clear the last byte } } overrun = false // We found a slot for the key diff --git a/internal/usbgadget/usbgadget.go b/internal/usbgadget/usbgadget.go index f01ae09d..7def29f1 100644 --- a/internal/usbgadget/usbgadget.go +++ b/internal/usbgadget/usbgadget.go @@ -135,7 +135,7 @@ func newUsbGadget(name string, configMap map[string]gadgetConfigItem, enabledDev keyboardStateCtx: keyboardCtx, keyboardStateCancel: keyboardCancel, 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 usbgadget.HidKeyBufferSize (6) zero bytes kbdAutoReleaseTimers: make(map[byte]*time.Timer), enabledDevices: *enabledDevices, lastUserInput: time.Now(), diff --git a/jsonrpc.go b/jsonrpc.go index b39c5206..ebb6d672 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -1210,7 +1210,7 @@ func executeKeyboardMacro(ctx context.Context, isPaste bool, macro []hidrpc.Keyb case <-ctx.Done(): // make sure keyboard state is reset and the client gets notified gadget.ResumeSuspendKeyDownMessages() - err := rpcKeyboardReport(0, make([]byte, hidrpc.HidKeyBufferSize)) + err := rpcKeyboardReport(0, make([]byte, usbgadget.HidKeyBufferSize)) if err != nil { logger.Warn().Err(err).Msg("failed to reset keyboard state") }