xmodmap automático para teclados bluetooth no Linux

/etc/udev/rules.d/50-bluetooth.rules

ACTION=="add", SUBSYSTEM=="input", ATTRS{uniq}=="<keyboard-mac-address>", RUN+="/home/cleber/bin/on-bt-keyboard-connected.sh"

Preste atenção ao <keyboard-mac-address>. Você pode vê-lo usando o comando bluetoothctl:

$ bluetoothctl
[prompt] devices
Device F4:73:xx:xx:xx:xx Keyboard K380
Device 2E:D6:xx:xx:xx:xx Philips TAT1215

bin/on-bt-keyboard-connected.sh

#!/bin/bash

export DISPLAY=:0.0

(
    sleep 2.5
    su -c 'xmodmap /home/cleber/.Xmodmap' cleber
    # su -c 'command' user
) &

O sleep é necessário (pelo que entendi) porque o Xorg demora um pouco para “carregar” o teclado depois que o mesmo é detectado pelo udev.

~/.Xmodmap

No meu caso, eu mapeio o CTRL para a tecla Caps Lock, enquanto o Caps Lock mesmo vai parar na right-CTRL.

$ cat ~/.Xmodmap 
remove Lock = Caps_Lock
keysym Caps_Lock = Control_L
add Control = Control_L
remove Control = Control_R
add Lock = Control_R