AprilNEA / AprilNEA/OpenLogi

[Bug]: Gesture mode fails to capture input on all buttons — HID++ path drops swipe events, OS-hook path drops everything including the Click action

Open
#946 1 comment 0 reactions 0 assignees View on GitHub
needs: triage type: bug
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.