[Bug]: Gesture mode fails to capture input on all buttons — HID++ path drops swipe events, OS-hook path drops everything including the Click action
- Dominant language
- Rust
- Stars
- 21k
- Forks
- 675
- Avg merge
- 2d 5h
- Merged PRs (30d)
- 172
Description
### Pre-flight checklist
- [x] I searched [existing issues](https://github.com/AprilNEA/OpenLogi/issues?q=is%3Aissue) and this is not a duplicate.
- [x] I am on the [latest release](https://github.com/AprilNEA/OpenLogi/releases/latest) or a recent `master` build.
- [x] I quit **Logi Options+** before running OpenLogi (the two apps fight over HID++ access and only one can own a receiver at a time).
### Which part of OpenLogi?
GUI (desktop app)
### OpenLogi version
0.7.10
### Operating system
macOS
### OS version & architecture
MacOS 26.6.2
### Device model
MX Anywhere 3S
### How is the device connected?
Logi Bolt receiver
### Affected area(s)
- [ ] Device discovery / detection
- [x] Button remapping
- [ ] DPI control
- [ ] SmartShift
- [ ] Per-application profiles
- [ ] Battery status
- [ ] Settings / configuration (TOML)
- [ ] Auto-update
- [ ] Menu bar / tray
- [ ] Other
### What happened?
Environment:
OpenLogi v0.7.10 (release, Homebrew cask)
macOS 26.6.2 (arm64)
Device: MX Anywhere 3S via Logi Bolt receiver
Accessibility: granted · Input hook: installed (per app diagnostics)
Steps to reproduce:
Bind DpiToggle as a single action (e.g. MissionControl) — confirm it fires correctly.
Convert DpiToggle to gesture mode with Click, Left, Right bound.
Press the button: Click fires correctly. Swipe left/right: nothing happens.
Bind MiddleClick as a single action — confirm it fires correctly, and confirm via Karabiner-EventViewer that no native middle-click event reaches the OS.
Convert MiddleClick to gesture mode with the same bindings.
Click the wheel: Karabiner-EventViewer shows the native middle-click event passing through unmodified. The Click action never fires. Swipes never fire.
Repeat with Back and Forward in gesture mode: same failure as MiddleClick.
Expected: Gesture mode should suppress the native event and dispatch bound actions, consistent with single-action-mode behavior on the same buttons.
Actual:
HID++-diverted controls (DpiToggle): Click arm works, directional arms silently no-op despite openlogi diag controls confirming raw-xy capability on the device.
CGEventTap-diverted controls (MiddleClick, Back, Forward): gesture mode doesn't suppress or divert the native event at all; behaves identically to no binding present.
Notes: Reverting any of the above buttons to a single action immediately restores correct capture/suppression on that same button, isolating the fault specifically to gesture-mode capture logic.
### Steps to reproduce
Steps to reproduce:
Bind DpiToggle as a single action (e.g. MissionControl) — confirm it fires correctly.
Convert DpiToggle to gesture mode with Click, Left, Right bound.
Press the button: Click fires correctly. Swipe left/right: nothing happens.
Bind MiddleClick as a single action — confirm it fires correctly, and confirm via Karabiner-EventViewer that no native middle-click event reaches the OS.
Convert MiddleClick to gesture mode with the same bindings.
Click the wheel: Karabiner-EventViewer shows the native middle-click event passing through unmodified. The Click action never fires. Swipes never fire.
Repeat with Back and Forward in gesture mode: same failure as MiddleClick.
### Diagnostics report
```markdown
### OpenLogi Diagnostics
**App**
- OpenLogi (GUI): v0.7.10 (release)
- Agent: v0.7.10 (connected)
- IPC protocol: GUI 26 / agent 26
- Inventory: ready
- OS: macOS 26.6.2 (arm64)
- Locale: en-US (UI: follow system)
- Accessibility: granted · Input hook: installed
- Launch at login: yes · Menu bar: yes · Update check: on
- Running from: source build (dev)
- Config: schema 4 · 2 configured device(s) · thumbwheel 14
**Assets**
- Source: user cache · Index: loaded (210 models) · User cache: present
- Cache path: ~/.local/share/openlogi/assets · Bundle assets: absent
**Devices (3)**
- MX Mechanical — keyboard (codename: MX MCHNCL)
- Connection: Logi Bolt receiver · Online: yes · Battery: 70% (discharging, full)
- Capabilities: buttons=yes, pointer=no, lighting=no
- Model: 0b366 (model-ids: b366/0000/0000, ext-model: 00)
- Transports: BTLE
- Render: mx_mechanical · Slot 1
- MX Anywhere 3S — mouse (codename: MX Anywhere 3)
- Connection: Logi Bolt receiver · Online: yes · Battery: 60% (discharging, full)
- Capabilities: buttons=yes, pointer=yes, lighting=no
- Model: 3b037 (model-ids: b037/0000/0000, ext-model: 03)
- Transports: BTLE
- Render: mx_anywhere_3s · Slot 2
- Logitech BRIO — camera
- Connection: unknown · Online: yes · Battery: n/a
- Capabilities: not probed
- Model: 085e
- Render: brio · Slot 0
**Receivers (1)**
- Logi Bolt Receiver (VID 046d / PID c548)
```
### `openlogi list` output
```text
(inventory read from the running agent)
Logi Bolt Receiver (A8B79F01CEB59BAC, vid=046d pid=c548)
├─ slot 1 ● MX MCHNCL (keyboard, wpid=?, battery=70% full (discharging))
│ model_ids=[b366,0000,0000] ext=00 serial=2401SCT01Z28 unit_id=b6a38a6e transports=btle
└─ slot 2 ● MX Anywhere 3 (mouse, wpid=?, battery=60% full (discharging))
model_ids=[b037,0000,0000] ext=03 serial=2422LZ034L78 unit_id=7137b68c transports=btle
Cameras (1 Logitech UVC)
└─ ● Logitech BRIO (camera, vid=046d pid=085e, up to 1920x1080@30, id=0x122200046d085e)
```
### Logs
```shell
```
### macOS permissions (if applicable)
- [x] OpenLogi has **Accessibility** permission (needed to remap buttons via the event tap).
- [ ] OpenLogi has **Input Monitoring** permission (needed for Bluetooth-direct devices and capture).
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by reproducing gesture mode with DpiToggle, MiddleClick, Back, and Forward on macOS, comparing the HID++ and CGEventTap capture paths described in the report. Trace how gesture-mode input is captured, native events are suppressed, and Click/Left/Right actions are dispatched; done means all listed controls suppress their native events and dispatch their bound gesture actions.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, rust
- Domain
- desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100