udev: Bluetooth Keyboardが接続されたらxmodmapする
udev に bluetooth keyboard が接続された時の rule を追加 \ (rule から、 shell script を起動する)
xmodmap を起動する shell script を作る
考察
-
udevでは、 userがroot
XWindowにログイン中のユーザ調べて 全員に sudo で何か渡した方がいいのかも (Linuxの通知システムにいいのがあるのかもしれないけど...
スクリプト内で HOME などの環境変数は使えないです。
-
今回のruleでは、何回も script が実行される。 \ 下のような grep で対処したけど、ほんとは rule に書くのがいいんでしょう:
elif echo $1 | grep -v -e 'hidraw[0-9]$' > /dev/null; then
出来上がった設定ファイルの例は本文をみてください。
1. /etc/udev/rules.d/50-slimbt.rules
udevを変更する:
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{address}=="yo:ur:ke:yb:oa:rd" RUN+="/opt/bin/tablet-keyboard-setup.sh %p"
ファイル準備したら、動くかどうか確認する:
$ sudo udevadm control --reload $ udevadm test --action=add /sys/class/input/input7
ログ内に RUN "script name" があれば OK
ATTRS{?}を調べるには以下のコマンドを使ったりする:
$ sudo udevadm info /sys/class/input/input8 P: /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/bluetooth/hci0/hci0:39/0005:04E8:7021.0004/input/input8 E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/bluetooth/hci0/hci0:39/0005:04E8:7021.0004/input/input8 E: EV=120013 E: ID_FOR_SEAT=input-pci-0000_00_14_0-usb-0_2_1_0 E: ID_INPUT=1 E: ID_INPUT_KEY=1 E: ID_INPUT_KEYBOARD=1 E: ID_PATH=pci-0000:00:14.0-usb-0:2:1.0 E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1_0 E: KEY=20 0 0 0 0 0 1000002008007 ff9f387ad9405fff febeffdfffefffff fffffffffffffffe E: LED=1f E: MODALIAS=input:b0005v04E8p7021e0100-e0,1,4,11,14,k71,72,73,74,75,77,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8E,96,98,9B,9C,9E,9F,A1,A3,A4,A5,A6,AB,AC,AD,B0,B1,B2,B3,B4,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,CF,D9,F0,245,ram4,l0,1,2,3,4,sfw E: MSC=10 E: NAME="Bluetooth Keyboard" E: PHYS="nn:nn:nn:nn:nn:nn" E: PRODUCT=5/4e8/7021/100 E: PROP=0 E: SUBSYSTEM=input E: TAGS=:seat: E: UNIQ="nn:nn:nn:nn:nn:nn" E: USEC_INITIALIZED=20105787265
UNIQとaddressがkeyword違うけど...どうやって調べたのかな...
2. keyboard.sh - script for udev |{{{1|
udev から起動される script の例 (core):
export HOME=/home/user export DISPLAY=:0 export XAUTHORITY=$HOME/.Xauthority lxkeymap -a if xinput list | grep "Bluetooth Keyboard" > /dev/null; then xmodmap $HOME/.Xmodmaprc.btslim fi
udev から起動される script の例 (final):
#! /bin/bash log=/tmp/$(basename $0).log function log0() { chmod 666 $log; echo "$*" | tee -a $log } if [ "x$1" = x ]; then : elif echo $1 | grep -v -e 'hidraw[0-9]$' > /dev/null; then log0 "$(LANG=C date) $0:$HOME ignored with $*" exit 0 fi log0 "$(LANG=C date) $0:$HOME launched with $*" export HOME=/home/user export DISPLAY=:0 export XAUTHORITY=$HOME/.Xauthority loop=2 while [ $loop -gt 0 ]; do log0 "loop $loop" if xinput list | tee -a $log | grep -i -e 'keyboard' > /dev/null; then break fi log0 "xinput was not ready, try again..." loop=$((loop - 1)) sleep 2 done if [ $loop -le 0 ]; then log0 "xinput is not initialized" exit 1 fi lxkeymap -a if xinput list | grep "Microsoft Wedge Mobile Keyboard" > /dev/null; then log0 "xmodmap mswedge" xmodmap $HOME/.Xmodmaprc.mswedge elif xinput list | grep "Bluetooth Keyboard" > /dev/null; then log0 "xmodmap btslim" xmodmap $HOME/.Xmodmaprc.btslim elif xinput list | grep "GASIA USB Keyboard" > /dev/null; then log0 "xmodmap gasia" xmodmap $HOME/.Xmodmaprc.gasia fi
コメント
Comments powered by Disqus