Remap buttons
Reassign your Logitech mouse’s reprogrammable buttons from the GUI’s interactive
diagram: click a button hotspot — or its label card — and pick from 41 built-in
actions, from Copy/Paste to MissionControl, media keys, real mouse
button 4/5 (MouseBack/MouseForward), or CycleDpiPresets. Left and right
clicks always pass through; everything else can be remapped, scoped per app, and
saved to your TOML config.
From the GUI
Select the mouse in the device carousel. Its detail panel shows an interactive diagram of the mouse — the device’s own artwork when OpenLogi has it, or a synthetic silhouette otherwise — with a hotspot dot over each reprogrammable button and a leader line out to a label card on the side.
- Hotspot dot or label card — two entry points into the same flow. Hovering highlights the button; the label card reads the current binding, or Unbound if there’s none. Clicking either opens a small popover.
- Action picker — a scrollable list of the catalog grouped by category (Mouse, Editing, Browser, Navigation, System, Media, DPI, Scroll). The current binding is checked. Clicking a row commits it and closes the popover. Picking None captures the input but does nothing.
- Gesture menu — the gesture button opens a two-level menu instead: one submenu per direction (Up, Down, Left, Right, Click), each with the full action catalog. Bindings are saved per direction.
- Gesture button selector — a single-select row above the diagram chooses which physical button owns the gesture role: the thumb pad, middle, back, or forward — or Off. Picking a button demotes the previous owner; this is something Options+ doesn’t offer (it pins gestures to the thumb pad).
How buttons are captured
Capture is split across two paths, both ending in the same action dispatcher:
- The OS hook — a CGEventTap on macOS, evdev/uinput on Linux, a
WH_MOUSE_LLhook on Windows — owns the side buttons: Back, Forward, and the middle click. On macOS it needs Accessibility permission; on Linux, the udev rules from the package. - HID++
0x1b04reprogControlsV4 diverts the gesture button (read as raw swipe travel) and the DpiToggle (mode-shift) button. The thumb wheel diverts over0x2150thumbwheel when its sensitivity leaves the default, or when its click or a rotation direction is rebound.
A gesture is told apart from a click by hold and travel: held past 160 ms with at least 50 raw-XY units of travel on the dominant axis commits a directional swipe; a quick tap fires the Click gesture on release.
Custom keyboard chords (CustomShortcut) aren’t in the GUI’s action picker
yet — the catalog excludes them. To bind a key combo to a button today,
hand-edit config.toml while OpenLogi is quit.
In the config
Bindings persist per device as plain TOML keyed by the device’s HID++
config_key. Action names serialize verbatim, so they read the same as the
picker:
[devices.2b042.bindings]
Back = "BrowserBack"
Forward = "BrowserForward"
MiddleClick = "MissionControl"
# The gesture button binds per direction; Click is the plain press.
[devices.2b042.bindings.GestureButton]
Left = "PrevTab"
Right = "NextTab"
Click = "PlayPause"The same keys can live under per_app_bindings."<bundle.id>" to win only while a
given app is frontmost. See Configuration for the full
button and action vocabulary, and Per-app profiles for the
overlay rules.
Quit Logi Options+ first so OpenLogi can own the device. On macOS the event tap needs Accessibility permission to remap the side buttons; the HID++ paths (gesture, DpiToggle, thumb wheel) don’t. Bindings are saved per device, so with no device selected they’re held in memory only until one is.
Status: macOS + Linux shipping — the OS hook owns the side Back /
Forward (and middle) buttons; mode-shift and thumb-wheel capture are
configurable but hardware capture is still landing, and gesture-button
per-direction bindings are configurable with hardware capture pending. Windows
is an untested preview. See the roadmap for what’s wired
up and 0x1b04 reprogControlsV4 for the protocol detail.