web-dev-qa-db-ja.com

xinputによる変更はランダムにデフォルトに戻ります

ELANタッチスクリーンとDell 750-AAHCアクティブスタイラスを備えたラップトップでKubuntu 16.04(xenial)を使用しています。スタイラスのボタンの1つはマウスの中央ボタンとして動作しますが、代わりに右ボタンにしたいです。

私はこれを達成することができます

$ xinput set-button-map "ELAN Touchscreen Pen" 1 3 2

(つまり、右ボタンに対応する必要があるボタン3の機能を物理ボタン2にマッピングします)。

これは私が望むことをしますが、変更は永続的ではありません。

~/.xsessionrcにコマンドを追加しました( この投稿の回答 による)。したがって、再起動すると自動的に実行されますが、ボタンマッピングは「ランダムに」デフォルトに戻ります。しばらくは期待どおりに動作しましたが、突然動作しないことに気づいたので、

$ xinput get-button-map "ELAN Touchscreen Pen"
1 2 3 4 5

手動で再マッピングする必要があります。

私は、いくつかの「疑わしい」ことを試みて、復帰の原因を調べましたが、それを理解できませんでした。それは原因ではありません

  • ラップトップをサスペンドするか、画面をオフにする
  • 画面を回転させる(入力行列を変換するために回転でxinputが使用されるため、これは疑わしい)
  • タッチスクリーン、タッチパッド、またはスタイラス入力のオン/オフの切り替え(xinputでも)。

重要な更新

この問題はスタイラス固有のものではないことを発見しました。画面の指タッチ機能(「ELANタッチスクリーン」)を無効にしました。

$ xinput disable "ELAN Touchscreen"

そして、私はちょうどそれがそれ自体で戻ってきたことを発見しました(そしてスタイラスの右クリックが再び元に戻りました)。したがって、この未知の理由により、すべてのxinputの変更がデフォルトに戻るようです。

更新2

これが再び起こったときに、/var/log/syslogに疑わしいエントリがいくつか見つかりました。タイムスタンプは、私が実際にしばらくラップトップを使用していなかった時間にあったので、おそらく省エネ機能が有効になりました(9分に「薄暗い画面」があり、10分に「スイッチを切る」。エネルギーを実験します。それに応じて保存および更新)。

以下のパターンは実際には何度も繰り返されますが、各ブロックの違いはわずか数秒です。

usb 1-8: USB disconnect, device number 18
usb 1-8: new full-speed USB device number 19 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7548
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7549
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EE/input/input7552
hid-multitouch 0003:04F3:2073.04EE: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0

各ブロックでは、増加するいくつかの数字を除いて、ほとんどすべてが同じです。比較のための次のブロックは次のとおりです。

usb 1-8: USB disconnect, device number 19
usb 1-8: new full-speed USB device number 20 using xhci_hcd
usb 1-8: New USB device found, idVendor=04f3, idProduct=2073
usb 1-8: New USB device strings: Mfr=4, Product=14, SerialNumber=0
usb 1-8: Product: Touchscreen
usb 1-8: Manufacturer: ELAN
input: ELAN Touchscreen Pen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7554
input: ELAN Touchscreen as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7555
input: ELAN Touchscreen Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/0003:04F3:2073.04EF/input/input7558
hid-mul iTouch 0003:04F3:2073.04EF: input,hiddev0,hidraw0: USB HID v1.10 Keyboard [ELAN Touchscreen] on usb-0000:00:14.0-8/input0

デバイス番号は128で折り返します。

システム

  • KDEプラズマ5.5.5
  • Qt 5.5.1
  • カーネル4.13.0-32-generic#35〜16.04.1-Ubuntu 64ビット
  • xinputバージョン1.6.2

    サーバー上のXIバージョン:2.3

  • X.Org X Server 1.19.5

    リリース日:2017-10-12

    Xプロトコルバージョン11、リビジョン0

4
Ratler

これはバグのようです(タッチスクリーンデバイスがランダムに切断され、新しいデバイスとして再接続されるため、すべての設定がデフォルトにリセットされるという副作用があります)。

回避策として、実行する独自のudevルール( ダニエルドレイクによるこれらの提案 に基づくファイル名)を作成できますタッチスクリーンが再接続するたびにxinputの変更を再適用するスクリプト:

Sudo nano /etc/udev/rules.d/10-custom-elan.rules

"idVendor"および "idProduct"情報(syslog)。 absolute pathto "elan.sh"を使用する必要があります。

ATTRS{idVendor}=="04f3", ATTRS{idProduct}=="2073", RUN+="/home/username/elan.sh"

(おおよそ「 "指定された属性に一致するデバイスが見つかった場合、指定されたスクリプトを実行する」に変換されます)。

次に、実行する実際のスクリプトを作成しますxinput

nano /home/username/elan.sh 

次の行で:

#!/usr/bin/env bash

#These lines allow the script to be called by udev rules
export DISPLAY=":0"
export XAUTHORITY="/home/username/.Xauthority"

#Command to remap buttons
xinput set-button-map "ELAN Touchscreen Pen" 1 3 2 4 5

そしてもちろん、それを実行可能にします:

chmod +x /home/username/elan.sh

export行がないと、スクリプトはユーザー(アクティブユーザー)から直接呼び出された場合は機能しますが、udev(ルートユーザー)から呼び出された場合は機能しません。詳細は this および this answerにありますが、簡単な要約を次に示します。

ユーザーのデスクトップでグラフィカルプログラムを起動するには、アドレス(ユーザーのデスクトップが表示されているもの)と承認の2つが必要です。ユーザーがログインすると、ログインマネージャーはCookieを生成してXサーバーへの接続を承認し、Cookieをサーバーに追加して、$ HOME/.Xauthorityに書き込むことでユーザーに渡します。その場合、rootユーザーは、ユーザーが使用するディスプレイを把握し、Xauthority Cookieにアクセスすることで接続できる必要があります。これはexport行が達成するものです。

:ディスプレイ番号がハードコードされているという事実は、状況によっては問題を引き起こす可能性がありますが、この使用シナリオでは(個人のラップトップの単一ユーザー)おそらく大丈夫でしょう。

1
stumblebee