AprilNEA / AprilNEA/OpenLogi

[Bug]: Scrollwheel tilt left/right not detected for MX AnyWhere 2

Open
#1,187 0 comments 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.8.3

### Operating system

macOS

### OS version & architecture

MacOS Tahoe 26.6.2

### Device model

Logitech Mx Anywhere 2

### How is the device connected?

Bluetooth (direct, no 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?

Whatever action I set to the tile left/right for my mouse, the action does not trigger

### Steps to reproduce

set the tilt action to anything, it is not working.

### Diagnostics report

```markdown
### OpenLogi Diagnostics

**App**
- OpenLogi (GUI): v0.8.3 (release)
- Agent: v0.8.3 (connected)
- IPC protocol: GUI 29 / agent 29
- 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 7 · 1 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 (1)**
- MX Anywhere 2 — mouse (codename: Wireless Mouse MX Anywhere 2)
- Connection: Bluetooth (direct) · Online: yes · Battery: 50% (discharging, good)
- Capabilities: buttons=yes, pointer=yes, lighting=no
- DPI: read failed
- Model: 0b013 (model-ids: b013/404a/0000, ext-model: 00)
- Transports: eQuad, BTLE
- Render: mx_anywhere_2 · direct
```

### `openlogi list` output

```text
➜ ~ openlogi list
(inventory read from the running agent)
MX Anywhere 2 (—, vid=046d pid=b013)
└─ slot 255 ● Wireless Mouse MX Anywhere 2 (mouse, wpid=?, battery=50% good (discharging))
model_ids=[b013,404a,0000] ext=00 serial=— unit_id=4cc30d80 transports=equad+btle
```

### Logs

```shell
➜ ~ OPENLOGI_LOG=debug /Applications/OpenLogi.app/Contents/MacOS/OpenLogi
(no agent reachable — reading hardware directly; macOS judges this process's Input Monitoring grant, not the agent's)
2026-08-31T07:59:40.755237Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0006 matched=false
2026-08-31T07:59:40.755293Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0002 matched=false
2026-08-31T07:59:40.755300Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0001 matched=false
2026-08-31T07:59:40.755306Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0xff43 usage_id=0x0202 matched=true
2026-08-31T07:59:40.755321Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=1
2026-08-31T07:59:40.785364Z DEBUG openlogi_hid::transport: opened HID++ channel name=MX Anywhere 2 vid=046d
2026-08-31T07:59:40.785513Z DEBUG openlogi_device::inventory::features: Device::new failed slot=255 error=Channel(Implementation(Message("report writer callback error: 0xE00002E2")))
2026-08-31T07:59:40.785534Z DEBUG openlogi_device::inventory::probe: feature walk did not complete — transient probe failure, keeping last-known identity vid=046d pid=b013
2026-08-31T07:59:40.785550Z DEBUG openlogi_device::inventory: one-shot enumerate inventory incomplete or still changing — retrying attempt=1 complete=false healthy=false
2026-08-31T07:59:41.089167Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0006 matched=false
2026-08-31T07:59:41.089271Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0002 matched=false
2026-08-31T07:59:41.089293Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0001 matched=false
2026-08-31T07:59:41.089309Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0xff43 usage_id=0x0202 matched=true
2026-08-31T07:59:41.089478Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=1
2026-08-31T07:59:41.089937Z DEBUG openlogi_device::inventory::features: Device::new failed slot=255 error=Channel(Implementation(Message("report writer callback error: 0xE00002E2")))
2026-08-31T07:59:41.089988Z DEBUG openlogi_device::inventory::probe: feature walk did not complete — transient probe failure, keeping last-known identity vid=046d pid=b013
2026-08-31T07:59:41.090024Z WARN openlogi_device::inventory: node probe keeps failing — retiring its channel before reopen
2026-08-31T07:59:41.090069Z DEBUG openlogi_device::inventory: one-shot enumerate inventory incomplete or still changing — retrying attempt=2 complete=false healthy=false
2026-08-31T07:59:41.392876Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0006 matched=false
2026-08-31T07:59:41.392959Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0002 matched=false
2026-08-31T07:59:41.392978Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0001 matched=false
2026-08-31T07:59:41.392993Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0xff43 usage_id=0x0202 matched=true
2026-08-31T07:59:41.393046Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=1
2026-08-31T07:59:41.394632Z DEBUG openlogi_device::inventory: node still retiring — waiting for its channel's remaining users to drop
2026-08-31T07:59:41.394698Z DEBUG openlogi_device::inventory: one-shot enumerate inventory incomplete or still changing — retrying attempt=3 complete=false healthy=false
2026-08-31T07:59:41.698318Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0006 matched=false
2026-08-31T07:59:41.698410Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0002 matched=false
2026-08-31T07:59:41.698429Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0x0001 usage_id=0x0001 matched=false
2026-08-31T07:59:41.698444Z DEBUG openlogi_hid::transport: logitech HID node name=MX Anywhere 2 pid=b013 usage_page=0xff43 usage_id=0x0202 matched=true
2026-08-31T07:59:41.698491Z DEBUG openlogi_device::inventory: HID++ candidate interfaces count=1
2026-08-31T07:59:41.720985Z DEBUG openlogi_hid::transport: opened HID++ channel name=MX Anywhere 2 vid=046d
2026-08-31T07:59:41.721117Z DEBUG openlogi_device::inventory::features: Device::new failed slot=255 error=Channel(Implementation(Message("report writer callback error: 0xE00002E2")))
2026-08-31T07:59:41.721135Z DEBUG openlogi_device::inventory::probe: feature walk did not complete — transient probe failure, keeping last-known identity vid=046d pid=b013
2026-08-31T07:59:41.721148Z WARN openlogi_device::inventory: node probe keeps failing — retiring its channel before reopen
No Logitech HID++ devices or webcams found.

Notes:
- On macOS, quit Logi Options+ first — both apps fight over HID++ access.
- A Bluetooth-direct mouse (e.g. Lift, Signature) needs Input Monitoring permission: System Settings → Privacy & Security → Input Monitoring.
- hidpp 0.2 only recognises Logi Bolt receivers (PID 0xC548); other receivers (Unifying) aren't surfaced yet.
```

### macOS permissions (if applicable)

- [x] OpenLogi has **Accessibility** permission (needed to remap buttons via the event tap).
- [x] 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 tracing button-remapping input from the GUI into the openlogi_hid::transport and openlogi_device inventory paths mentioned in the diagnostics. Reproduce with an MX Anywhere 2 over Bluetooth and inspect how tilt-left and tilt-right events are handled. Done means either configured actions trigger for both tilt directions or the limitation is documented with supporting test results.

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
43/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.