USBキーボード繰り返し速度の自動設定

USBキーボード繰り返し速度の自動設定

USBキーボードをラップトップに接続することがよくありますが、接続するとデフォルトの繰り返し速度は望みどおりに設定されません。udevルールを追加してスクリプトを使用して変更してみました。

`ACTION=="add", ATTRS{name}=="Dell Dell Multimedia Pro Keyboard", RUN+="set-keyboard.sh"`

set-keyboard.shスクリプトで呼び出す

xset -display :0 r rate 500 50; xset -display :0 b off

問題は、これはUSBキーボードの繰り返し速度とビープ音が設定されるのではなく、ラップトップ内蔵キーボードの繰り返し速度とビープ音が設定されることです。 (つまり、xset q内蔵キーボードで入力すると正しい設定が表示されますが、xset qUSBキーボードで入力するとまだ間違った速度に設定されています。)

どのキーボードを設定するかを知る方法はありますかxset?それともこの問題を解決する別の方法がありますか?

答え1

もう少し探索したところで見つかったhttps://bugzilla.redhat.com/show_bug.cgi?id=601853問題は、udevの実行後にxorgがキーボードの速度をリセットすることです。したがって、私のudevスクリプトが確実に実行されていても、そのタスクはxorgによってすぐにキャンセルされます。

ただし、そのページには修正もあります。 optionsでstartxを実行すると、startx -- -ardelay 500 -arinterval 20新しいキーボードが接続されていても設定が保持されます。

答え2

このコマンドを試して、USBキーボードのudev IDを確認できます。次のコマンドを実行してキーボードを接続します。

$ udevadm monitor --udev --subsystem-match=usb

例 - モニター

私は古いSun Microsystems USBキーボードを持っています。プラグを抜いて再接続すると、次のudevメッセージが表示されます。

$ udevadm monitor --udev --subsystem-match=usb
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing

UDEV  [1375655040.466080] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655040.557791] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV  [1375655044.586242] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
UDEV  [1375655044.589087] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655049.880514] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
UDEV  [1375655049.905175] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)

したがって、ルールに入れることができるudev IDは、上記の出力のこの部分を利用します/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2

はい - エクスポート

udev DB全体をエクスポートして手動でスキャンすることもできます。

$ udevadm info --export-db
...
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
N: bus/usb/002/009
S: char/189:136
E: UDEV_LOG=3
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
E: SUBSYSTEM=usb
E: DEVNAME=bus/usb/002/009
E: ID_VENDOR=0430
E: ID_VENDOR_ENC=0430
E: ID_VENDOR_ID=0430
E: ID_MODEL=0005
E: ID_MODEL_ENC=0005
E: ID_MODEL_ID=0005
E: ID_REVISION=0102
E: ID_SERIAL=0430_0005
E: ID_BUS=usb
E: ID_USB_INTERFACES=:030101:
E: MAJOR=189
E: MINOR=136
E: DEVTYPE=usb_device
E: DRIVER=usb
E: DEVICE=/proc/bus/usb/002/009
E: PRODUCT=430/5/102
E: TYPE=0/0/0
E: BUSNUM=002
E: DEVNUM=009
E: DEVLINKS=/dev/char/189:136
...

そして、udevルールで上記の出力の他のユニークな機能を活用してください。

引用する

答え3

この問題を解決するために作成したhttps://github.com/SFTtech/xautocfg

新しいキーボードが接続されると、Xサーバーからイベントを受け取ります。その後、キーの繰り返し速度や遅延設定などの設定をキーボードに適用できます。

root権限は必要なく、起動オプションを編集し-ardelay 200 -arinterval 20たり、ハッキングされたudevルールを使用する必要もありません。xautocfgユーザー(好ましくはシステムユーザーとして提供)で実行し、デバイス構成を更新します。

答え4

だから1年間のオンライン検索の最後についに今日働くようになりました。

源泉:https://newbedev.com/udev-rule-to-auto-load-keyboard-layout-when-usb-keyboard-plugged-in

@TomYanがすでに述べたように、xsetこれはX11プログラムです。したがってDISPLAY、env変数をXAUTHORITYハードコードする必要があります。

デフォルトでは、回避策は短い遅延時間を置いてバックグラウンドでスクリプトを実行することです。したがって、udevはxsetキーボードの前にキーボードを有効にできます。上記のソリューションでは、udevはバックグラウンドで2番目のスクリプトを呼び出すスクリプトを呼び出し、xset実際には単一のスクリプトに短縮できます。

Keyboard.sh設定

#!/usr/bin/env bash

(
    sleep 1

    DISPLAY=":0.0"
    XAUTHORITY="/home/your-profile/.Xauthority"
    export DISPLAY XAUTHORITY

    xset r rate 250 50
) &

関連情報