Move hold key handling into Go backend analogous to https://www.kernel.org/doc/Documentation/usb/gadget_hid.txt

This commit is contained in:
Daniel Lorch 2025-05-13 18:55:47 +02:00
parent 9b3d1e0417
commit 146cee9309
5 changed files with 20 additions and 12 deletions

View File

@ -74,7 +74,7 @@ func (u *UsbGadget) keyboardWriteHidFile(data []byte) error {
return nil 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() u.keyboardLock.Lock()
defer u.keyboardLock.Unlock() defer u.keyboardLock.Unlock()
@ -90,6 +90,13 @@ func (u *UsbGadget) KeyboardReport(modifier uint8, keys []uint8) error {
return err return err
} }
if !hold {
err := u.keyboardWriteHidFile(make([]uint8, 8))
if err != nil {
return err
}
}
u.resetUserInputTime() u.resetUserInputTime()
return nil return nil
} }

View File

@ -980,7 +980,7 @@ var rpcHandlers = map[string]RPCHandler{
"getNetworkSettings": {Func: rpcGetNetworkSettings}, "getNetworkSettings": {Func: rpcGetNetworkSettings},
"setNetworkSettings": {Func: rpcSetNetworkSettings, Params: []string{"settings"}}, "setNetworkSettings": {Func: rpcSetNetworkSettings, Params: []string{"settings"}},
"renewDHCPLease": {Func: rpcRenewDHCPLease}, "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"}}, "absMouseReport": {Func: rpcAbsMouseReport, Params: []string{"x", "y", "buttons"}},
"relMouseReport": {Func: rpcRelMouseReport, Params: []string{"dx", "dy", "buttons"}}, "relMouseReport": {Func: rpcRelMouseReport, Params: []string{"dx", "dy", "buttons"}},
"wheelReport": {Func: rpcWheelReport, Params: []string{"wheelY"}}, "wheelReport": {Func: rpcWheelReport, Params: []string{"wheelY"}},

View File

@ -13,8 +13,8 @@ import { keys, modifiers } from "@/keyboardMappings";
import { layouts, chars } from "@/keyboardLayouts"; import { layouts, chars } from "@/keyboardLayouts";
import notifications from "@/notifications"; import notifications from "@/notifications";
const hidKeyboardPayload = (keys: number[], modifier: number) => { const hidKeyboardPayload = (keys: number[], modifier: number, hold: boolean) => {
return { keys, modifier }; return { keys, modifier, hold };
}; };
const modifierCode = (shift?: boolean, altRight?: boolean) => { const modifierCode = (shift?: boolean, altRight?: boolean) => {
@ -82,13 +82,10 @@ export default function PasteModal() {
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
send( send(
"keyboardReport", "keyboardReport",
hidKeyboardPayload([kei], modz[index]), hidKeyboardPayload([kei], modz[index], false),
params => { params => {
if ("error" in params) return reject(params.error); if ("error" in params) return reject(params.error);
send("keyboardReport", hidKeyboardPayload([], 0), params => { resolve();
if ("error" in params) return reject(params.error);
resolve();
});
}, },
); );
}); });

View File

@ -4,6 +4,10 @@ import { useHidStore, useRTCStore } from "@/hooks/stores";
import { useJsonRpc } from "@/hooks/useJsonRpc"; import { useJsonRpc } from "@/hooks/useJsonRpc";
import { keys, modifiers } from "@/keyboardMappings"; import { keys, modifiers } from "@/keyboardMappings";
const hidKeyboardPayload = (keys: number[], modifier: number, hold: boolean) => {
return { keys, modifier, hold };
};
export default function useKeyboard() { export default function useKeyboard() {
const [send] = useJsonRpc(); const [send] = useJsonRpc();
@ -17,7 +21,7 @@ export default function useKeyboard() {
if (rpcDataChannel?.readyState !== "open") return; if (rpcDataChannel?.readyState !== "open") return;
const accModifier = modifiers.reduce((acc, val) => acc + val, 0); 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 // We do this for the info bar to display the currently pressed keys for the user
updateActiveKeysAndModifiers({ keys: keys, modifiers: modifiers }); updateActiveKeysAndModifiers({ keys: keys, modifiers: modifiers });

4
usb.go
View File

@ -26,8 +26,8 @@ func initUsbGadget() {
}() }()
} }
func rpcKeyboardReport(modifier uint8, keys []uint8) error { func rpcKeyboardReport(modifier uint8, keys []uint8, hold bool) error {
return gadget.KeyboardReport(modifier, keys) return gadget.KeyboardReport(modifier, keys, hold)
} }
func rpcAbsMouseReport(x, y int, buttons uint8) error { func rpcAbsMouseReport(x, y int, buttons uint8) error {