[Bug]: Linux (Ubuntu 24.04)/X11: OpenLogi virtual mouse ignores GNOME natural scrolling setting
- 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.
### 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