Gesture mode has no effect on Signature M650 — button divert works, raw-XY does not (macOS)
- Dominant language
- Rust
- Stars
- 21k
- Forks
- 675
- Avg merge
- 1d 6h
- Merged PRs (30d)
- 180
Description
## Environment
- **Device:** Logitech Signature M650
- **Transport:** Bluetooth direct
- **OpenLogi version:** 0.7.1
- **macOS:** 27.0
- **Mac:** Apple silicon (arm64)
- Logi Options+ is not installed / not running.
## Summary
Putting a side button into **Gestures** mode on a Signature M650 produces no reaction at all —
neither the Click arm nor any of the four directional arms fire. The UI accepts the
configuration and shows the plus-shaped navigator normally, so there is no visible error.
## What works vs. what does not
I isolated this with an A/B test on the *same* button:
| Configuration on the same side button | Result |
| --- | --- |
| Plain single action (e.g. Mission Control / a keyboard shortcut) | ✅ Fires reliably |
| Gestures mode (Click + Up/Down/Left/Right) | ❌ No reaction whatsoever |
So `0x1b04` reprogControls **divert works** on this device — the agent clearly receives the
button-down event, otherwise the plain remap could not fire. What is missing is the raw-XY
movement stream that the swipe detector needs.
Per the docs, a directional swipe requires the button "held past 160 ms with at least 50 raw-XY
units of travel on the dominant axis." The Signature line exposes a much smaller HID++ feature
set than the MX Master series, and as far as I can tell the M650 does not advertise raw-XY
divert at all. With no movement samples arriving, the detector can never cross the 50-unit
threshold — and because a quick tap is only supposed to fire the Click arm *after* the swipe
window elapses without qualifying travel, the Click arm appears to get swallowed too. Net
effect: gesture mode is silently inert rather than degraded.
## Suggested fix
Fall back to OS-level pointer deltas when the device does not expose raw-XY divert, instead of
requiring the HID++ path.
On macOS the agent already owns a `CGEventTap` for remapping, and that tap carries
`kCGMouseEventDeltaX` / `kCGMouseEventDeltaY` for every motion event regardless of which device
produced it. Gating on "is the diverted gesture button currently held?" and accumulating those
deltas would give the swipe detector its travel signal on any HID++ device whose buttons can be
diverted — which, based on the A/B test above, includes the whole Signature line.
This is essentially the same technique @NotTanJune describes in #2 for the MX Master 3S gesture
button, applied as a general capability fallback rather than a per-model special case. It would
also mean gesture mode either works or is greyed out, instead of accepting a configuration that
can never fire.
## Alternative, if the fallback is out of scope
Detect the missing raw-XY capability at bind time and disable (or annotate) the **Gestures** row
in the action picker for that button, so it is clear the device cannot do it. Right now the only
way to find out is to configure it and discover nothing happens.
## Happy to help
I have the hardware and can test patches or builds against the M650 and report back, including
the CLI diagnostics output for whichever features you want dumped.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start with the macOS agent's existing CGEventTap and the gesture detector, then compare the M650's advertised capabilities with the raw-XY path. Verify the proposed pointer-delta fallback, or the capability-based UI safeguard, against the documented gesture behavior; done means gestures work on the M650 or are clearly unavailable.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, rust
- Domain
- desktop, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 56/100