本文を読み飛ばす

udev: Bluetooth Keyboardが接続されたらxmodmapする

  1. udev に bluetooth keyboard が接続された時の rule を追加 \ (rule から、 shell script を起動する)

  2. 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

Docutils System Messages

コメント

Comments powered by Disqus
宣伝: