~My hideous~ Humble, performant key remapping C++ code that should work on Linux for any input device that emits keys.
dwm
)Basically any OS that works with libevdev
(linux with kernel newer than 2.6.36), no matter what desktop environment, or even if any DE is used (yes, it works the same in X server instead of xmodmap
, but also in plain terminal without graphical environment).
For building, meson
(and ninja
), and make
.
At runtime, the https://github.com/jbeder/yaml-cpp
YAML library.
$ git clone "https://github.com/maricn/interception-vimproved"
$ cd interception-vimproved
$ sudo make install
Use it with a job specification for udevmon
(from Interception Tools). I install the binary to /opt/interception/interception-vimproved
and use it like the following on Arch linux on Thinkpad x1c gen7.
- JOB: "intercept -g $DEVNODE | interception-vimproved | uinput -d $DEVNODE"
DEVICE:
NAME: ".*((k|K)(eyboard|EYBOARD)|TADA68).*"
That matches any udev devices containing keyboard in the name (or my external TADA68 keyboard).
Alternatively, you can run it with udevmon
binary straight, just make sure to be negatively nice (nice -n -20 udevmon -c /etc/interception-vimproved/config.yaml
) so your input is always available.
If you want to customize the functionality, you can take a look at the config.yaml
.
The configuration file is copied to /etc/interception-vimproved/config.yaml
when invoking sudo make install
.
You can configure that file and add its path as an argument to interception-vimproved
when run by updating your /etc/interception/udevmon.yaml
:
...
- JOB:
- |
intercept -g $DEVNODE \
| interception-vimproved /etc/interception-vimproved/config.yaml \
| uinput -d $DEVNODE
...
In case you want to edit the source code, kill the udevmon
daemon, and manually try the following to avoid getting stuck with broken input. Trust me, you can get yourself in a dead end situation easily.
# sleep buys you some time to focus away from terminal to your playground, also you'll probably need to add a sudo
sleep 1 && timeout 10 udevmon -c /etc/interception-vimproved/config.yaml
libevdev
based solution.stdout
, and on the other side, it receives events from stdin
and writes them to virtual input device.intercept
and uinput
(intercept | interception-vimproved | uinput
). It interprets input from intercept
and maps it to desired events which are then passed to uinput
for emitting.Kudos to @dceluis and @exprpapi for their contributions.