A userspace daemon for the circular Panasonic Let's Note trackpad. It restores outer-ring scrolling under Wayland and adds compact gestures suited to the unusually small 44 mm pad:
- inner-disc pointer movement
- outer-ring scrolling
- one-finger left-click and two-finger right-click taps
- ordinary passthrough for all physical buttons
- two-finger horizontal window switching
- native GNOME Activities and workspace swipes
The daemon exclusively grabs the real evdev device and creates virtual
pointer, shortcut-keyboard, and gesture-only touchpad devices through
uinput.
Developed and tested on a Panasonic Let's Note with a Synaptics
TM3562-003 touchpad (HID 06cb:cdea, coordinates 0..528). Other models
may require changes to the vendor/product IDs in install.sh and the
geometry constants in the driver.
Requires stable Rust and a Linux system with udev, uinput, and systemd:
git clone https://github.com/kungaa/circulartrackpad
cd circulartrackpad
./install.sh
./enable-autostart.shinstall.sh builds and installs the binary and udev rules.
enable-autostart.sh creates the config and starts the systemd user service.
Log out and back in if the device permissions do not apply immediately.
From an existing checkout:
git pull
./install.sh
./enable-autostart.shPersistent settings use the XDG user configuration location:
${XDG_CONFIG_HOME:-$HOME/.config}/circulartrackpad/config.toml
enable-autostart.sh preserves an existing config when upgrading.
Edit config.toml, then validate and apply it with:
circulartrackpad restartInvalid configuration does not stop the running service. A missing config uses built-in defaults.
pointer = 1.5
scroll = 5.0
ring = 0.65
invert_scroll = false
tap = true
tap_timeout_ms = 180
tap_move_threshold = 20
[two_finger_swipe]
enabled = true
distance = 80
left = ["KEY_LEFTALT", "KEY_ESC"]
right = ["KEY_LEFTSHIFT", "KEY_LEFTALT", "KEY_ESC"]
[native_gestures]
enabled = trueShortcut arrays use Linux KEY_* names in press order.
Older [button_gestures] and two_finger_swipe.up settings remain accepted
for upgrade compatibility, but are ignored with a warning. Remove them after
upgrading.
Command-line options override the config:
circulartrackpad [OPTIONS]
circulartrackpad restart
-d, --device <DEVICE> Input device path [default: auto-detect]
-p, --pointer <POINTER> Pointer sensitivity
-s, --scroll <SCROLL> Scroll ticks per radian
-r, --ring <RING> Ring threshold fraction (0.0-1.0)
-i, --invert-scroll Invert scroll direction
--no-invert-scroll Do not invert scroll direction
--tap Enable tap-to-click
--no-tap Disable tap-to-click
--tap-timeout <MILLISECONDS> Tap timeout
--tap-move-threshold <UNITS> Tap movement threshold
Physical buttons pass through unchanged. Outer-ring motion scrolls, including while a button is held.
Start with two fingers in the inner zone:
- swipe left: next window (
Alt+Escby default) - swipe right: previous window (
Shift+Alt+Escby default) - swipe up/down: GNOME's progressive Activities gesture
Horizontal switching fires after the configured distance. Vertical movement drives GNOME's native gesture animation. A short two-finger tap remains right-click.
On GNOME Wayland, three- and four-finger horizontal swipes switch workspaces;
vertical swipes control Activities. Set native_gestures.enabled = false to
disable them.
The daemon grabs the physical evdev device and creates separate uinput pointer, shortcut-keyboard, and gesture-touchpad devices. A touch that starts in the inner zone moves the pointer; one that starts on the ring scrolls.
Native gestures require GNOME on Wayland. There is no Xorg gesture fallback.
systemctl --user status circulartrackpad.service
journalctl --user -u circulartrackpad.service -n 30 --no-pager
libinput list-devicesThe physical device still appears under hid-rmi/libinput; this is normal.
circulartrackpad gestures should be listed as a touchpad. Log out and back
in if the service reports a device permission error.
The project uses Rust 2021 and stable Rust:
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test
cargo build --release
bash -n install.sh enable-autostart.shBased on the original mikiobraun/circulartrackpad and the fork b3r/circulartrackpad.
MIT — see LICENSE.
