From 2fa72ee0dc67d973330aec4ba98260e9f57f7821 Mon Sep 17 00:00:00 2001 From: Lena Date: Thu, 1 Jan 2026 00:00:00 +0000 Subject: Enter mouseboard Keyboard-only pointing: a labelled grid over every monitor, type a label to jump to a cell, bisect it by quadrant until the crosshair is exact, then one key clicks. The coarse grid keeps labels short and bisection keeps precision unlimited, so a hotkey and a few keystrokes replace the mouse. The core talks only to the backend interface in platform.h; wlroots Wayland and Win32 backends supply the overlay, keyboard grab and pointer. --- README | 190 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 README (limited to 'README') diff --git a/README b/README new file mode 100644 index 0000000..ee81bde --- /dev/null +++ b/README @@ -0,0 +1,190 @@ +mouseboard +========== +Keyboard-driven virtual pointer for Wayland and Windows. Bring up a labelled +grid over the screen, type a label to jump to a cell, refine the spot by +bisection, then press one key to click. No mouse, no daemon. + + +What it does +------------ +Run `mouseboard` (bound to a hotkey) and a grid is drawn over every monitor: + +1. Grid Type the two-or-so letter label in a cell to jump there. +2. Refine The cell becomes the active region. Split it by quadrant with + u/i/j/k until the crosshair sits exactly where you want; the pointer + tracks the region centre live. Backspace undoes a split. +3. Click m left, , middle, . right, ; double, v drag. Esc cancels. + +Bisection gives unlimited precision in a few keystrokes, so the coarse grid can +stay coarse and the labels short. + + +Requirements +------------ +Linux: a wlroots-based compositor (sway, Hyprland, river, Wayfire, labwc, ...) +implementing `wlr-layer-shell` and `wlr-virtual-pointer`. GNOME and KDE are not +supported yet (see Portability). A shipped static binary needs nothing else. + +Windows: Windows 10 1703 or newer (per-monitor DPI v2). The shipped .exe is +static and needs nothing else. + + +Build and install +----------------- +The Wayland protocols are vendored under proto/, so a build needs only a +toolchain. The release build is static: provision its dependencies once, then +build and install. + + ./provision-static.sh # once per machine: static wayland/xkbcommon/ffi + # archives (pinned, checksummed) into musl-sysroot/ + make static # -> ./mouseboard, one static binary + sudo make install + +The result is self-contained, already stripped, and runs on any Linux. + +Besides a C compiler, make and pkg-config, provisioning needs meson, ninja, +bison, expat, curl and the Linux kernel headers - plus a musl toolchain on a +glibc distro (Debian, Arch). It builds its own wayland-scanner from source, so +the host's version does not matter. On musl-native distros (Alpine, Void-musl) +gcc is already musl and provision-static.sh uses it automatically; set CC only +to override the detected compiler. + +These commands install enough for both Linux builds: + + # Debian / Ubuntu + sudo apt install build-essential pkgconf libwayland-bin libwayland-dev \ + libxkbcommon-dev meson ninja-build bison curl musl-tools libexpat1-dev + + # Arch + sudo pacman -S --needed base-devel wayland libxkbcommon meson ninja bison \ + curl linux-api-headers musl expat + + # Alpine (musl-native: gcc is already musl, detected automatically) + sudo apk add build-base pkgconf wayland-dev libxkbcommon-dev meson samurai \ + bison curl linux-headers expat-dev + + # Void (use the musl flavour: gcc is already musl, detected automatically) + sudo xbps-install -S base-devel pkgconf wayland-devel libxkbcommon-devel \ + meson ninja bison curl expat-devel + + # Gentoo (gcc/make/pkg-config already in @system) + sudo emerge --ask dev-libs/wayland x11-libs/libxkbcommon dev-libs/expat \ + meson ninja sys-devel/bison net-misc/curl sys-kernel/linux-headers + + +Windows build +------------- +The .exe is cross-built from Linux with a mingw-w64 toolchain (native mingw on +Windows builds the same way). It links only gdi32/user32, so there are no other +libraries: + + # Debian / Ubuntu + sudo apt install gcc-mingw-w64-x86-64 make + + # Arch + sudo pacman -S --needed mingw-w64-gcc make + + # Fedora + sudo dnf install mingw64-gcc make + + make -f Makefile.win # -> mouseboard.exe + +Copy the result to the Windows machine and run it; there is nothing to install. + + +Developing (dynamic build) +-------------------------- +A plain `make` links against the system's shared libraries, so it needs no +provisioning - only wayland-scanner (it ships with the Wayland package) plus the +wayland-client, xkbcommon and Linux kernel development headers: + + make # dev build; produces ./mouseboard + make check # dependency-free core and state-machine tests + +If anything is missing it tells you exactly what to install. `make static` +cleans first (the modes use different compilers); run `make clean` when +switching back. + + +Usage +----- +Wayland does not let a client grab a global hotkey, so bind the command in your +compositor. One binding runs the whole flow; the final key decides the button. + +sway (~/.config/sway/config): + + bindsym $mod+g exec mouseboard + +Hyprland (~/.config/hypr/hyprland.conf): + + bind = SUPER, G, exec, mouseboard + +Windows: run mouseboard.exe directly, or bind it to a hotkey with a shortcut or +a tool such as AutoHotkey. It grabs the keyboard while the grid is up, so keys +do not leak to the focused window; Esc cancels. + +Try it without clicking anything; it prints the target and action instead: + + mouseboard --dry-run + + +Keys +---- +Defaults; all are configurable (see Configuration). + + label chars f j d k s l a g h r u e i w o q p t y v b c n x m z + refine u top-left i top-right j bottom-left k bottom-right + click m left , middle . right ; double v drag + Enter left click (once a cell is selected) + Backspace undo last split (or return to the grid) + Esc cancel + +Drag is two targets: press v over the start, then pick the end the same way +(grid, refine) and press any click key to release. + + +Configuration +------------- +Optional file at $XDG_CONFIG_HOME/mouseboard/config (default +~/.config/mouseboard/config; on Windows %APPDATA%\mouseboard\config). Lines are +`key = value`; lines starting with # are comments. Command-line flags override +the file. See config.example for every key with its default. Colours are +#RRGGBB or #RRGGBBAA. Two opacities (0..100): `opacity_bg` dims the desktop +(default 33; 100 is solid) and `opacity_fg` sets how strong the labels, grid +and crosshair are (default 65). + + +How to debug +------------ + mouseboard --dry-run print "x y action" instead of moving the pointer + mouseboard --selftest run offline checks of labels/bisection/config + WAYLAND_DEBUG=1 mouseboard --dry-run trace every protocol message + +If it exits with "compositor lacks ...", the compositor does not implement a +required wlroots protocol and is not supported. If labels do not appear, confirm +the binding actually launched mouseboard (run it from a terminal to see errors). + + +Portability +----------- +The core (grid, labels, bisection, rendering, config) talks only to the backend +interface in platform.h and never includes an OS header. A backend is one file +providing platform_init(), and exactly one is linked into the binary. + +The wlroots Wayland backend uses layer-shell for the overlay and virtual-pointer +for input. The Win32 backend draws a per-monitor layered overlay with +UpdateLayeredWindow, grabs the keyboard with a low-level hook, and clicks via +SendInput. It is a GUI-subsystem binary, so a hotkey launch shows no console; it +attaches to a parent console when run from a terminal, so --dry-run and --help +still print. + + +Credits +------- +mouseboard is released under the MIT licence; see LICENSE. It bundles +third-party files, each kept under its own terms: + +- font8x8_basic.h: 8x8 bitmap font by Daniel Hepper and Marcel Sondaar / IBM, + public domain. +- proto/*.xml: Wayland protocol descriptions from wayland-protocols and + wlr-protocols, MIT/Expat. Per-file provenance is in proto/SOURCES. -- cgit v1.2.3