| Crates.io | kb-layout-daemon |
| lib.rs | kb-layout-daemon |
| version | 0.2.2 |
| created_at | 2026-01-18 23:46:47.854929+00 |
| updated_at | 2026-01-20 17:32:33.678817+00 |
| description | Auto-switch keyboard layout based on which physical keyboard is used |
| homepage | https://github.com/aydiler/kb-layout-daemon |
| repository | https://github.com/aydiler/kb-layout-daemon |
| max_upload_size | |
| id | 2053322 |
| size | 83,983 |
A lightweight daemon that automatically switches keyboard layout based on which physical keyboard you're typing on.
Perfect for users with multiple keyboards who want different layouts for each (e.g., English on one keyboard, German on another).
input groupgit clone https://github.com/aydiler/kb-layout-daemon
cd kb-layout-daemon
cargo build --release
sudo cp target/release/kb-layout-daemon /usr/local/bin/
yay -S kb-layout-daemon-git
cargo install kb-layout-daemon
Add yourself to the input group:
sudo usermod -aG input $USER
Then log out and back in.
Create config file at ~/.config/kb-layout-daemon/config.toml:
# Mode: "grab" (correct first key) or "passive" (zero latency)
mode = "grab"
[[keyboards]]
name = "Lofree"
layout_index = 1
layout_name = "English (US)"
[[keyboards]]
name = "CHERRY"
layout_index = 0
layout_name = "German"
The layout_index corresponds to the order in KDE's keyboard layout settings (0-based).
Install the systemd service:
mkdir -p ~/.config/systemd/user
cp kb-layout-daemon.service ~/.config/systemd/user/
systemctl --user enable --now kb-layout-daemon
A panel widget is included to toggle between Grab and Passive modes.
KB Layout Mode Toggle on KDE Store
Or install manually:
cp -r widget ~/.local/share/plasma/plasmoids/org.kblayout.toggle
Then right-click your panel → "Add Widgets" → search for "KB Layout Mode" → drag to panel.
Click to toggle between modes.
Control the daemon via D-Bus at org.kblayout.Daemon:
# Get current mode
dbus-send --session --print-reply --dest=org.kblayout.Daemon \
/org/kblayout/Daemon org.kblayout.Daemon.GetMode
# Set mode
dbus-send --session --print-reply --dest=org.kblayout.Daemon \
/org/kblayout/Daemon org.kblayout.Daemon.SetMode string:"passive"
# Toggle mode
dbus-send --session --print-reply --dest=org.kblayout.Daemon \
/org/kblayout/Daemon org.kblayout.Daemon.ToggleMode
The config file uses TOML format:
| Field | Description |
|---|---|
mode |
Initial mode: "grab" or "passive" (default: "grab") |
Each [[keyboards]] section defines a keyboard to monitor:
| Field | Description |
|---|---|
name |
Substring to match in the device name (case-insensitive) |
layout_index |
KDE layout index (0-based, matches order in System Settings) |
layout_name |
Human-readable name for logging |
To find your keyboard names:
cat /proc/bus/input/devices | grep -A 4 "Name="
/dev/input/event* for keyboards matching configured namesorg.kde.keyboardGrab mode: Grabs exclusive access to keyboards, intercepts all input, switches layout, then forwards events through a virtual keyboard. This ensures the first keystroke uses the correct layout.
Passive mode: Monitors keyboards without grabbing. Layout switches after detecting a keypress, so the first key may use the old layout. Zero added latency.
"No keyboards found"
input group: groups | grep inputLayout not switching
layout_index matches your KDE layout orderjournalctl --user -u kb-layout-daemon -fKeys not working in Grab mode
dbus-send --session --print-reply --dest=org.kblayout.Daemon /org/kblayout/Daemon org.kblayout.Daemon.SetMode string:"passive"MIT