A small userspace daemon that makes the circular ring gesture on the Panasonic Let's Note trackpad work as a scroll wheel under Wayland.
Panasonic Let's Note laptops ship with a distinctive round trackpad whose
outer ring is meant to be used as a rotary scroll control. Under X11 this
was handled by the old xf86-input-synaptics driver (CircularScrolling
option). libinput — which every Wayland compositor uses — dropped
circular scroll support, so on Wayland the ring zone just moves the
pointer like any other spot on the pad.
circulartrackpad restores the feature in userspace:
- Grabs the real trackpad's
evdevnode exclusively. - Creates a virtual pointer device via
uinput. - Classifies each touch: the inner disc becomes pointer motion, the
outer ring becomes
REL_WHEELticks based on angular movement.
The compositor sees a plain mouse-like device, so it works in GNOME, KDE, Sway, or anything else — no extensions or plugins needed.
Developed and tested on a Panasonic Let's Note with a
Synaptics TM3562-003 touchpad (HID 06cb:cdea). Other Let's Note
models with a different touchpad controller will need the vendor/product
IDs in install.sh and the coordinate range in src/main.rs adjusted —
see Porting below.
Requires Rust (stable) and a Linux system with udev and uinput.
git clone https://github.com/mikiobraun/circulartrackpad
cd circulartrackpad
./install.shThe installer:
- builds the release binary
- copies it to
/usr/local/bin/circulartrackpad - writes a udev rule to
/etc/udev/rules.d/70-circulartrackpad.rulesthat grants the active local-seat user access to the trackpad and/dev/uinputvia POSIX ACLs (systemduaccess) - reloads udev
Log out and back in once after install so the ACLs apply, then run:
circulartrackpad --helpNo sudo, no input group membership needed — only the user currently
logged in at the physical seat can access the devices, and access is
revoked on logout.
circulartrackpad [OPTIONS]
-d, --device <DEVICE> Input device path [default: auto-detect]
-p, --pointer <POINTER> Pointer sensitivity multiplier [default: 1.5]
-s, --scroll <SCROLL> Scroll ticks per radian of ring rotation [default: 5]
-r, --ring <RING> Ring threshold as fraction of max radius [default: 0.65]
-i, --invert-scroll Invert scroll direction
--no-tap Disable tap-to-click
--tap-timeout <MS> Tap timeout in milliseconds [default: 180]
--tap-move-threshold <UNITS>
Tap movement threshold in raw coordinate units [default: 20]
By default the daemon auto-detects the Panasonic trackpad by its reported name
(Synaptics TM3562-003). You only need -d if your trackpad shows up under a
different name or you want to use an explicit event node.
Touch the inner area to move the pointer; slide your finger around the
outer ring to scroll. Lower --ring values make the ring zone wider
(easier to stay in while scrolling); higher values make it thinner.
Tap-to-click is enabled by default: a quick, single-finger tap in the
inner zone emits a left button click, and a quick two-finger tap emits a
right button click. Use --no-tap to disable this, or adjust the
--tap-timeout and --tap-move-threshold if you find taps are being
missed or triggered accidentally.
Once you're happy with the options, run:
./enable-autostart.sh -p 1.5 -s 5 -r 0.65Any arguments you pass to the script are baked into the systemd user
unit's ExecStart. It writes
~/.config/systemd/user/circulartrackpad.service, reloads the user
daemon, and enables + starts the service. To change the options later
either re-run the script or edit the unit file directly and
systemctl --user daemon-reload && systemctl --user restart circulartrackpad.
If your trackpad reports different HID IDs or a different coordinate range, two spots need updating:
install.sh— changeVENDOR_ID/PRODUCT_IDto match your device (find them withcat /proc/bus/input/devices).src/main.rs— thePAD_MAXconstant assumesABS_X/ABS_Ygo from 0 to 528. Check your device withsudo evtestand adjust if different. The classifier assumes a square, circular pad centered on the origin of the coordinate space.
The daemon reads multitouch events (ABS_MT_SLOT, ABS_MT_POSITION_X/Y,
ABS_MT_TRACKING_ID) and on each SYN_REPORT inspects slot 0 (the
primary finger):
- If the finger is within
ringof the max radius from center, it's in the ring zone: compute the polar angle, take the delta from the previous frame (with wraparound handling), accumulate fractional scroll ticks, and emitREL_WHEEL. - Otherwise it's in the inner zone: emit
REL_X/REL_Ydeltas.
Physical button events (BTN_LEFT, BTN_RIGHT) are forwarded unchanged.
In addition, because the daemon exclusively grabs the real touchpad,
tap-to-click is implemented in userspace: a short, single-finger touch in
the inner zone synthesizes BTN_LEFT, and a short two-finger touch
synthesizes BTN_RIGHT.
MIT — see LICENSE.
