No Description
Travis Burtrum f15edf8315 Tweak keyboard device finding 9 months ago
src Tweak keyboard device finding 9 months ago
systemd Add sample systemd service 11 months ago
.gitignore Initial commit 2 years ago
Cargo.toml First go at working inotify support 11 months ago Final tweaks before release 1 year ago Update readme 11 months ago
keymap.orig.toml Implement config and keymap, first working version without keymap switching and hardcoded to 1 layout 1 year ago
keymap.toml Final tweaks before release 1 year ago
notes.txt Send SYN_REPORT with shift modifying keys to make libinput happy 10 months ago


uinput level keyboard mapper for linux, with advanced caps lock and shift swapping behavior

This is the only keymapper I am aware of capable of implementing this layout:
Unix Programmer's Dvorak

The Problem

If you ever have mapped keys on linux, you know that there is the console keymap (loadkeys) and the X keymap (setxkbmap), also things like SDL and Virtualbox grab the input directly and respect no maps. Lastly I want to revert to QWERTY when holding ctrl so ctrl+c works just like normal, without remapping all programs to ctrl+j. Linux keymaps cannot do this either.

The Solution

  1. Grab a keyboard device directly so only we can read events from it.
  2. Create a new keyboard input device with uinput, this looks identical to any other keyboard device to anything running on the box.
  3. Read input_events from the real device, map them, send them to our created device.

This solution is what rusty-keys implements, it works in ttys, in X, in virtualbox even running windows or whatever, on SDL games, it will work literally everywhere, because rusty-keys just creates a regular keyboard.

How to run

When ran, it will read a keymap.toml configuration file, refer to example and tweak to suit.

Usage: rusty-keys [options] [device_files...]

    -h, --help          prints this help message
    -v, --version       prints the version
    -c, --config FILE   specify the keymap config file to use (default:

when ran without specifying input devices, it maps all currently connected keyboards, and watches /dev/input/ with inotify and starts mapping any new keyboards that are plugged in forever, until you kill it: rusty-keys

or you can specify one or multiple input devices, and it will run until all are disconnected, then stop:
rusty-keys /dev/input/event0 or rusty-keys /dev/input/event0 /dev/input/event2

An example systemd service is in systemd/rusty-keys.service, enable it to have mapped keyboards all the time.

How to install


AGPLv3 for now, message me if you have a problem with this


Technically this is a re-implementation of a previous python program I had been using for 3 years previously.