AprilNEA / AprilNEA/OpenLogi

[Bug]: Linux (Ubuntu 24.04)/X11: OpenLogi virtual mouse ignores GNOME natural scrolling setting

Open
#1,358 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?

Both

### OpenLogi version

0.8.3

### Operating system

Linux

### OS version & architecture

Ubuntu (24.04.5 LTS) kernel 6.8.0-90-generic

### Device model

MX Ergo S (bluetooth)

### How is the device connected?

Bluetooth (direct, no receiver)

### Affected area(s)

- [x] Device discovery / detection
- [x] Button remapping
- [ ] DPI control
- [ ] SmartShift
- [ ] Per-application profiles
- [ ] Battery status
- [x] Settings / configuration (TOML)
- [ ] Auto-update
- [ ] Menu bar / tray
- [ ] Other

### What happened?

Title: Linux/X11: OpenLogi virtual mouse ignores GNOME natural scrolling setting

Environment

Ubuntu, GNOME on X11

Logitech MX Ergo S

OpenLogi

Natural scrolling enabled in GNOME

Problem

After OpenLogi creates its virtual mouse devices, scrolling becomes traditional even though natural scrolling is enabled in GNOME. This could only be fixed by CLI direct intervention, as described below

And a correlated situation is, when configuring the scrolling inversion via CLI, the inversion also applies to the tilting action of the wheel. In other words, when the inversion is active via CLI, the wheel tilting to left makes the content of focused application scroll to the right, and vice-versa. The prefered output would be to isolate the vertical scrolling from horizontal scrolling so that we could configure them separately.

### Steps to reproduce

The physical MX Ergo S correctly reports:

libinput Natural Scrolling Enabled: 1

but OpenLogi's virtual mouse devices report:

libinput Natural Scrolling Enabled: 0

Example:

MX Ergo S Mouse id=11
OpenLogi virtual mouse id=14
OpenLogi virtual mouse id=15

Physical device:

$ xinput list-props 11
libinput Natural Scrolling Enabled (...): 1

OpenLogi virtual devices:

$ xinput list-props 14
libinput Natural Scrolling Enabled (...): 0

$ xinput list-props 15
libinput Natural Scrolling Enabled (...): 0

The MX Ergo S does not expose native HID++ scroll inversion support in OpenLogi, so there is no scroll-direction option available in the OpenLogi UI.

Workaround

Setting natural scrolling directly on the OpenLogi virtual devices via CLI fixes the issue immediately:

Bash
$ xinput set-prop 14 "libinput Natural Scrolling Enabled" 1
xinput set-prop 15 "libinput Natural Scrolling Enabled" 1

A persistent X11 workaround is:

$ sudo mkdir -p /etc/X11/xorg.conf.d
sudo nano /etc/X11/xorg.conf.d/90-openlogi-natural-scroll.conf

and in the file insert:

Section "InputClass"
Identifier "OpenLogi natural scrolling"
MatchProduct "OpenLogi virtual mouse"
MatchIsPointer "on"
Driver "libinput"
Option "NaturalScrolling" "true"
EndSection

Expected behavior

OpenLogi virtual mouse devices should inherit or preserve the desktop environment's natural-scrolling setting, or OpenLogi should provide a software scroll-inversion fallback for devices that do not support native HID++ inversion.

Actual behavior

OpenLogi virtual mouse devices start with natural scrolling disabled, overriding the effective behavior of the physical mouse.

Below is a printscreen of the OpenLogi interface showing the impossibility of setting scroll inversion on the GUI.

Image

### 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: Linux (x86_64)
- Locale: pt-BR (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 (2)**
- MX Ergo S — trackball (codename: MX Ergo S)
- Connection: Bluetooth (direct) · Online: yes · Battery: 45% (discharging, good)
- Capabilities: buttons=yes, pointer=yes, lighting=no
- DPI: 600 dpi (range 100–4000, 79 steps)
- Model: 0b03e (model-ids: b03e/0000/0000, ext-model: 00)
- Transports: BTLE
- Render: mx_ergo_s · direct
- C922 Pro Stream Webcam — camera
- Connection: unknown · Online: yes · Battery: n/a
- Capabilities: not probed
- Model: 085c
- Render: ⚠️ none (silhouette) · Slot 0
```

### `openlogi list` output

```text
$ openlogi list  ✔  12:19:56
(inventory read from the running agent)
MX Ergo S (—, vid=046d pid=b03e)
└─ slot 255 ● MX Ergo S (trackball, wpid=?, battery=45% good (discharging))
model_ids=[b03e,0000,0000] ext=00 serial=2621ZA621128 unit_id=26e472dc transports=btle

Cameras (1 Logitech UVC)
└─ ● C922 Pro Stream Webcam (camera, vid=046d pid=085c, up to 2304x1536@60, id=/dev/v4l/by-id/usb-046d_C922_Pro_Stream_Webcam_C8C03CCF-video-index0)
```

### Logs

```shell
$ OPENLOGI_LOG=debug openlogi list  ✔  12:19:59
2026-09-11T15:20:58.680528Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680484284Z otel.kind="client" otel.name=Agent.protocol_version rpc.trace_id=00}: tarpc::client: SendRequest
2026-09-11T15:20:58.680617Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680484284Z otel.kind="client" otel.name=Agent.protocol_version rpc.trace_id=00}: tarpc::client: ReceiveResponse
2026-09-11T15:20:58.680642Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680636420Z otel.kind="client" otel.name=Agent.declare_client rpc.trace_id=00}: tarpc::client: SendRequest
2026-09-11T15:20:58.680690Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680636420Z otel.kind="client" otel.name=Agent.declare_client rpc.trace_id=00}: tarpc::client: ReceiveResponse
2026-09-11T15:20:58.680704Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680700099Z otel.kind="client" otel.name=Agent.snapshot rpc.trace_id=00}: tarpc::client: SendRequest
2026-09-11T15:20:58.680763Z DEBUG RPC{rpc.deadline=2026-09-11T15:21:08.680700099Z otel.kind="client" otel.name=Agent.snapshot rpc.trace_id=00}: tarpc::client: ReceiveResponse
(inventory read from the running agent)
MX Ergo S (—, vid=046d pid=b03e)
└─ slot 255 ● MX Ergo S (trackball, wpid=?, battery=45% good (discharging))
model_ids=[b03e,0000,0000] ext=00 serial=2621ZA621128 unit_id=26e472dc transports=btle

Cameras (1 Logitech UVC)
└─ ● C922 Pro Stream Webcam (camera, vid=046d pid=085c, up to 2304x1536@60, id=/dev/v4l/by-id/usb-046d_C922_Pro_Stream_Webcam_C8C03CCF-video-index0)
```

### macOS permissions (if applicable)

- [ ] 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

No source file or test is named. Start by tracing how OpenLogi creates its virtual mouse devices on Linux/X11 and how scrolling settings are applied; reproduce the reported xinput properties and compare vertical and horizontal wheel behavior. Done means natural scrolling follows the desktop setting and vertical and horizontal scrolling can be controlled independently.

Written by the indexing model from the issue text.

Assessment

Tech stack
linux, rust
Domain
desktop-dev, operating-systems
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.