OpenLogi

Keyboards

Remap a Logitech keyboard's F-row over HID++, remap any keyboard's function keys through the OS hook, and control Fn-lock and host switching.

OpenLogi treats keyboards as first-class devices: it remaps the F-row, controls Fn-lock and backlighting over HID++, and can drag paired mice along when the keyboard switches hosts.

There are two ways to remap keys, and they are independent:

HID++ F-row keysFunction-key remapper
ScopeOne Logitech keyboardAny keyboard attached to the machine
PathHID++ 0x1b04 control diversionOS keyboard hook
Config[devices.<key>.bindings][keyboard.bindings]
Edited inconfig.tomlthe GUI's Keys tab
PlatformsmacOS, Linux, WindowsmacOS, Windows

HID++ F-row keys

A Logitech keyboard's media / shortcut row can be diverted key by key over HID++, so a press dispatches an OpenLogi action instead of its printed function. OpenLogi models nine Signature-series controls:

Button nameSignature F-row position0x1b04 control ID
KeySearchF40x00d4
KeyDictationF50x0103
KeyEmojiF60x0108
KeyScreenCaptureF70x010a
KeyMicMuteF80x011c
KeyPlayPauseF90x00e5
KeyMuteF100x00e7
KeyVolumeDownF110x00e8
KeyVolumeUpF120x00e9

Only keys that carry a binding are diverted; an unbound key keeps its native firmware function and OpenLogi never touches it. A key the device doesn't expose is skipped with a log line, so a partially-supported keyboard degrades key by key instead of failing as a whole.

[devices."receiver:aabbccdd:slot:2".bindings]
KeySearch = "MissionControl"
KeyScreenCapture = "CaptureRegion"
KeyMicMute = { CustomShortcut = "Cmd+Shift+M" }

Diversion works on the key's control — the printed media function — so it fires while Fn-lock is off, or via Fn+key while it is on. The plain F1–F12 codes of an Fn-locked row travel the ordinary HID keyboard interface and never reach 0x1b04; remap those with the function-key remapper below.

Function-key remapper

The Keys tab remaps function keys on any keyboard through the OS hook: the keyboard photo sits beside a row of callout bubbles, and clicking a key selects it and slides in the action panel (the same catalog as the mouse picker, plus the Power User section).

Bindings are global rather than per device, and live under [keyboard.bindings] in config.toml. Triggers are written [modifier+]…key, with modifiers shift, control (ctrl), option (alt), command (cmd) and keys esc, f1f19:

[keyboard.bindings]
f1 = "MissionControl"
"shift+f2" = "ShowDesktop"
"cmd+f5" = { CustomShortcut = "Cmd+Shift+P" }

Fn-lock

fn_lock flips the F-row between its printed media functions and plain F1–F12, over HID++ fn-inversion (0x40a2, or 0x40a3 on multi-host keyboards):

[devices."receiver:aabbccdd:slot:2"]
fn_lock = true    # F-row sends F1–F12 without holding Fn

true locks the row to F1–F12, false restores the printed functions, and leaving the key out means "don't touch what the keyboard is already doing". The state lives in device RAM per host, so the agent re-applies your choice each time the keyboard reconnects. There is no GUI control for it yet.

Host switching

A multi-host (Easy-Switch) keyboard can pull mice along when it changes host. List the target devices' physical keys on the keyboard's entry:

[devices."receiver:aabbccdd:slot:2"]
host_switch_targets = ["receiver:aabbccdd:slot:1"]

Pressing one of the keyboard's host keys switches every listed target first, then lets the keyboard leave. Both devices must already be paired on corresponding channels, and every target has to expose the HID++ host-switch features (0x1814 changeHost / 0x1815 hostsInfo). Because the relationship is keyboard-initiated, configure it on each computer the switch may start from.

Lighting

Keyboard backlight and RGB are covered in Keyboard lighting: static per-key colour over 0x8070 / 0x8081, and monochrome backlight levels over 0x1982.

Status: F-row diversion, Fn-lock, and host switching ride HID++ and work on macOS, Linux, and Windows. The function-key remapper needs OS keyboard events, which the hook delivers on macOS and Windows; Linux key capture is not wired up yet.

On this page