Intercepting Bluetooth Keyboard Events

2 min 298 words
Peter Tillemans Profile picture

Intercepting Bluetooth Keyboard Events

I like keyboards and I like custom keyboards. However many do not allow sufficient configuration to let a key be Ctrl on hold and Esc on top. Notably the HHKB.

USB devices are nicely listed in /dev/input/by-id/ folder but on my system the event device is anonymously placed in /dev/input/.

Figuring out the name

❯ for dev in /dev/input/*; do udevadm info --attribute-walk $dev; done | grep -A10 -B10 Keyboard
Unknown device "/dev/input/by-id": No such device
Unknown device "/dev/input/by-path": No such device
    ATTRS{capabilities/led}=="1f"
    ATTRS{capabilities/msc}=="10"
    ATTRS{capabilities/rel}=="0"
    ATTRS{capabilities/snd}=="0"
    ATTRS{capabilities/sw}=="0"
    ATTRS{id/bustype}=="0005"
    ATTRS{id/product}=="0021"
    ATTRS{id/vendor}=="04fe"
    ATTRS{id/version}=="0001"
    ATTRS{inhibited}=="0"
    ATTRS{name}=="HHKB-Hybrid_1 Keyboard"
    ATTRS{phys}=="04:33:c2:f4:e9:70"
    ATTRS{power/control}=="auto"
    ATTRS{power/runtime_active_time}=="0"
    ATTRS{power/runtime_status}=="unsupported"
    ATTRS{power/runtime_suspended_time}=="0"
    ATTRS{properties}=="0"
    ATTRS{uniq}=="cb:7a:7c:03:2d:f2"

for other keyboards a bit of finagling for searching with grep might be needed or pipe into less and scroll till you find it.

Now I can add it to my */etc/interception/udevmon.d/ctrl_tap_esc.yaml :

- JOB: "intercept -g $DEVNODE | dual-function-keys -c /etc/interception/dual-function-keys.yaml | uinput -d $DEVNODE"
  DEVICE:
    NAME: "PFU Limited HHKB-Hybrid"
    EVENTS: 
      EV_KEY: [KEY_LEFTCTRL]
- JOB: "intercept -g $DEVNODE | dual-function-keys -c /etc/interception/dual-function-keys.yaml | uinput -d $DEVNODE"
  DEVICE:
    NAME: "PFU Limited HHKB-Hybrid Keyboard"
    EVENTS: 
      EV_KEY: [KEY_LEFTCTRL]
- JOB: "intercept -g $DEVNODE | dual-function-keys -c /etc/interception/dual-function-keys.yaml | uinput -d $DEVNODE"
  DEVICE:
    NAME: "HHKB-Hybrid_1 Keyboard"
    EVENTS: 
      EV_KEY: [KEY_LEFTCTRL]

The first 2 are for USB but that is still a work in progress