web-dev-qa-db-ja.com

xinputコマンドを永続的にする方法

Linux Mint 18.1を使用して、 'xinput'(以下のコマンド)を使用して、いくつかのマウスとキーボードのキーを再マップしました。マウスを取り外して再接続すると、xinputコマンドを手動で再実行する必要があります。

それらを~/.xsessionrcに追加するのが正しいことだと私は読んだ。ご覧のとおり、私はそれを実行しました。私も~/.xinputrcを試しました。起動時に1回実行されますが、マウスを切断して再接続するか、コンピューターをスリープ状態にすると、xinputコマンドを手動で再実行する必要があります。

これらのコマンドを常にアクティブに保つ正しい方法を知っている人はいますか?例えば。どうすればデバイスの切断/再接続後も永続化できますか?

davidparks21@ghostmint ~ $ cat .xsessionrc
# Map mouse button 8 (top right) to button 2 (top left) and vice versa
xinput --set-button-map 10 1 8 3 4 5 6 7 2 9 10 11 12

# Fix numeric keypad for shift-home and shift-end
setxkbmap -option numpad:Microsoft
5
David Parks

このスクリプトを実行すると、USBデバイスを接続または取り外した後、コードが実行されます。

while true; do state=$(lsusb) && sleep 2 && [[ $state != $(lsusb) ]] && echo "Change detected, replace echo with your command"; done
1
Nir Vana

これが私の最終的な解決策です。Nirの回答で、非常にありそうもない、無関係な競合状態を修正しました。また、マウスが外されているとキーを再マッピングできない(外されている間はエラーメッセージが表示されない)ことにも対処します。

~/.xinitrcに追加しました:

# Map mouse button 8 (top right) to button 2 (top left) and vice versa, run when changes to the mouse occur
while true; do
        NEW_MOUSEID=$(xinput | grep "Expert Mouse" | grep -o -E '[0-9]+' | head -n 1)
        if [ "$MOUSEID" != "$NEW_MOUSEID" ]; then
                MOUSEID=$NEW_MOUSEID
                if [ "$MOUSEID" != "" ]; then
                        xinput --set-button-map $MOUSEID 1 8 3 4 5 6 7 2 9 10 11 12
                fi
        fi
        sleep 2
done &

lsusbの代わりにxinputから解析されたマウスIDをトリガーとして使用しましたが、同じ効果があります。

Xinputコマンドの後のパイプは、マウスのIDを解析するだけであることに注意してください。これはcanが変更されます。追加のNEW/OLDマウスIDは、競合状態の可能性を回避するための肛門でした。

提案してくれた@Nirに感謝します。

1
David Parks