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
}
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
}

View File

@ -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"}},

View File

@ -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<void>((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();
},
);
});

View File

@ -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 });

4
usb.go
View File

@ -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 {