From 146cee9309ca7a8b7ab103e955f3fcc38a4bc692 Mon Sep 17 00:00:00 2001 From: Daniel Lorch Date: Tue, 13 May 2025 18:55:47 +0200 Subject: [PATCH] Move hold key handling into Go backend analogous to https://www.kernel.org/doc/Documentation/usb/gadget_hid.txt --- internal/usbgadget/hid_keyboard.go | 9 ++++++++- jsonrpc.go | 2 +- ui/src/components/popovers/PasteModal.tsx | 11 ++++------- ui/src/hooks/useKeyboard.ts | 6 +++++- usb.go | 4 ++-- 5 files changed, 20 insertions(+), 12 deletions(-) diff --git a/internal/usbgadget/hid_keyboard.go b/internal/usbgadget/hid_keyboard.go index de007e4..dbebb2d 100644 --- a/internal/usbgadget/hid_keyboard.go +++ b/internal/usbgadget/hid_keyboard.go @@ -74,7 +74,7 @@ func (u *UsbGadget) keyboardWriteHidFile(data []byte) error { return nil } -func (u *UsbGadget) KeyboardReport(modifier uint8, keys []uint8) error { +func (u *UsbGadget) KeyboardReport(modifier uint8, keys []uint8, hold bool) error { u.keyboardLock.Lock() defer u.keyboardLock.Unlock() @@ -90,6 +90,13 @@ func (u *UsbGadget) KeyboardReport(modifier uint8, keys []uint8) error { return err } + if !hold { + err := u.keyboardWriteHidFile(make([]uint8, 8)) + if err != nil { + return err + } + } + u.resetUserInputTime() return nil } diff --git a/jsonrpc.go b/jsonrpc.go index cb06fa3..3154bd7 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -980,7 +980,7 @@ var rpcHandlers = map[string]RPCHandler{ "getNetworkSettings": {Func: rpcGetNetworkSettings}, "setNetworkSettings": {Func: rpcSetNetworkSettings, Params: []string{"settings"}}, "renewDHCPLease": {Func: rpcRenewDHCPLease}, - "keyboardReport": {Func: rpcKeyboardReport, Params: []string{"modifier", "keys"}}, + "keyboardReport": {Func: rpcKeyboardReport, Params: []string{"modifier", "keys", "hold"}}, "absMouseReport": {Func: rpcAbsMouseReport, Params: []string{"x", "y", "buttons"}}, "relMouseReport": {Func: rpcRelMouseReport, Params: []string{"dx", "dy", "buttons"}}, "wheelReport": {Func: rpcWheelReport, Params: []string{"wheelY"}}, diff --git a/ui/src/components/popovers/PasteModal.tsx b/ui/src/components/popovers/PasteModal.tsx index 2f0662d..b8d313e 100644 --- a/ui/src/components/popovers/PasteModal.tsx +++ b/ui/src/components/popovers/PasteModal.tsx @@ -13,8 +13,8 @@ import { keys, modifiers } from "@/keyboardMappings"; import { layouts, chars } from "@/keyboardLayouts"; import notifications from "@/notifications"; -const hidKeyboardPayload = (keys: number[], modifier: number) => { - return { keys, modifier }; +const hidKeyboardPayload = (keys: number[], modifier: number, hold: boolean) => { + return { keys, modifier, hold }; }; const modifierCode = (shift?: boolean, altRight?: boolean) => { @@ -82,13 +82,10 @@ export default function PasteModal() { await new Promise((resolve, reject) => { send( "keyboardReport", - hidKeyboardPayload([kei], modz[index]), + hidKeyboardPayload([kei], modz[index], false), params => { if ("error" in params) return reject(params.error); - send("keyboardReport", hidKeyboardPayload([], 0), params => { - if ("error" in params) return reject(params.error); - resolve(); - }); + resolve(); }, ); }); diff --git a/ui/src/hooks/useKeyboard.ts b/ui/src/hooks/useKeyboard.ts index 0ce1eef..67fa1c1 100644 --- a/ui/src/hooks/useKeyboard.ts +++ b/ui/src/hooks/useKeyboard.ts @@ -4,6 +4,10 @@ import { useHidStore, useRTCStore } from "@/hooks/stores"; import { useJsonRpc } from "@/hooks/useJsonRpc"; import { keys, modifiers } from "@/keyboardMappings"; +const hidKeyboardPayload = (keys: number[], modifier: number, hold: boolean) => { + return { keys, modifier, hold }; +}; + export default function useKeyboard() { const [send] = useJsonRpc(); @@ -17,7 +21,7 @@ export default function useKeyboard() { if (rpcDataChannel?.readyState !== "open") return; const accModifier = modifiers.reduce((acc, val) => acc + val, 0); - send("keyboardReport", { keys, modifier: accModifier }); + send("keyboardReport", hidKeyboardPayload(keys, accModifier, true)); // We do this for the info bar to display the currently pressed keys for the user updateActiveKeysAndModifiers({ keys: keys, modifiers: modifiers }); diff --git a/usb.go b/usb.go index 91674c9..1ecd8d3 100644 --- a/usb.go +++ b/usb.go @@ -26,8 +26,8 @@ func initUsbGadget() { }() } -func rpcKeyboardReport(modifier uint8, keys []uint8) error { - return gadget.KeyboardReport(modifier, keys) +func rpcKeyboardReport(modifier uint8, keys []uint8, hold bool) error { + return gadget.KeyboardReport(modifier, keys, hold) } func rpcAbsMouseReport(x, y int, buttons uint8) error {