Control mouse and keyboard from a smartphone
Previously, typing non-Latin characters (e.g. Greek) via the X11 backend was extremely slow (~1000ms per character) because the server had to dynamically remap an unused keycode to the desired keysym via XChangeKeyboardMapping. A blind 500ms sleep was used twice per character: once before sending the key event (to wait for the mapping to propagate), and once after (to wait for clients to process MappingNotify). The root cause is that X11 key events only carry keycodes, not keysyms. When a keysym has no existing keycode in the keyboard mapping, the app must temporarily remap a keycode. Clients cache the keyboard mapping locally and re-read it upon receiving a MappingNotify event from the server. The race condition is that a client may process the key event before it has processed the MappingNotify, interpreting the keycode with the stale (old) mapping. This patch replaces the blind pre-send sleep with a server-side verification loop: after XChangeKeyboardMapping, it polls XGetKeyboardMapping to confirm the server has applied the new mapping before sending the key event. This is safe because XGetKeyboardMapping reads directly from the server, which is the authority on the current mapping. The post-send delay is reduced from 500ms to 50ms, which is sufficient for clients to process MappingNotify on modern systems. Expected improvement: non-Latin characters go from ~1000ms/char to ~55-60ms/char (verification ~5ms + post-send 50ms). Latin characters remain instant as they already have existing keycode mappings. The 500ms constant was overly conservative. The verification loop provides a correct and responsive solution: it returns as soon as the server confirms the mapping, and times out after 200ms as a safety net. Fixes #46 |
||
|---|---|---|
| .github/workflows | ||
| desktop | ||
| flatpak | ||
| icon-font | ||
| inputcontrol | ||
| screenshots | ||
| snap | ||
| terminal | ||
| webdata | ||
| CHANGELOG.md | ||
| COPYING | ||
| go.mod | ||
| go.sum | ||
| host.go | ||
| icon_windows.go | ||
| icon_windows.syso | ||
| main.go | ||
| README.md | ||
| webdata.go | ||
| webdata_test.go | ||
Remote Touchpad
Control mouse and keyboard from the webbrowser of a smartphone (or any other device with a touchscreen). To take control open the displayed URL or scan the QR code.
Supports Flatpak's RemoteDesktop portal (for Wayland), Windows and X11.
Installation
- Flatpak
- Snap
- Windows
- Golang:
-
Portal & uinput & X11:
go install -tags portal,uinput,x11 github.com/unrud/remote-touchpad@latest -
Windows:
go install github.com/unrud/remote-touchpad@latest
-



