私は週末にこれに苦労し、マウスボタンを再マップする必要があります。
9個のボタンがあるLogitechマウスがあり、「中央ボタン」(#2)を押すにはスクロールホイールをクリックする必要があります。私はこれが嫌いです。なぜなら、私は不器用で、通常、ホイールをクリックしようとすると、今いるウィンドウをスクロールしてしまうからです。そこで、私は自動的に上部のボタン(この場合は#9)を中央のボタン(#2)に再マップしたいと思いました。また、左下のボタン(#1)のダブルクリックを実行するように、下側のボタン(#8)をマップしたいと思いました。
私の目的は具体的でしたが、以下の解決策は、起動時にマウスボタンを自動的に再マッピングするあらゆる状況に一般化できます。
このタスクには、xinput
をインストールする必要があります。これは、.xsessionrc
ファイルで完全に実行できます。まず、xinput
を使用して、マウスに割り当てられている名前を検出します。これは、入力デバイスIDに関連付けられます。以下は私のラップトップからの出力例です。
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Laser Mouse id=11 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
私のマウスは自分自身をLogitech USB Laser Mouse
と呼び、id=11
として表示されます。マウスには別の名前が付けられます。それを理解することは、読者の練習として残されています。
thisセッションでデバイスのIDがまだわかっている間に、xinput list
を使用して、マウスが持っていると入力ハンドラーが考えるボタンの数を調べます。 deviceID
。これは、デバイスに表示されるボタンの数と異なる場合があります。
Logitech USB Laser Mouse id=11 [slave pointer (2)]
Reporting 7 classes:
Class originated from: 11. Type: XIButtonClass
Buttons supported: 16
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
私のマウスでは、明らかな物理ボタンは9つしかありませんが、xinput
は16を報告します。
USBの性質を考えると、このIDは再起動するたびに変更される可能性があるため、一度発見したIDに静的にキー設定されたものをスクリプト化するだけでは不十分です。起動時にこれを動的に解析し、現在のIDに基づいて再マップを実行する必要があります。
名前がわかったので、xinput test
を使用して、どのキーを再マップするかを判断できます。インデックスを取得するために、マップ元およびマップ先のマウスボタンを押します。 (参照用に、1、2、および3の「常に」(つまり、通常)は、3ボタンマウスの左、中央、および右のボタンを指します。一般的な再マップはこれらを逆にしてマウスを左利きにします。 )
button press 2
button release 2
button press 9
button release 9
この場合、ボタン#9(サイド、トップ)をボタン#2(ミドル)にマップしたいことがわかりました。
マウスの名前と変更するボタンがわかったので、xinput
を呼び出して起動時にボタンの再マッピングを実行する~/.xsessionrc
スクリプトを作成できます。以下は私の完全なスクリプトです。
# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
ここの最初の行は、xinput
によって報告されるマウスのIDと等しい一時セッション変数を設定します。これは、grep
からのレポートのマウスの既知の名前に対してxinput
ingによって実行され、次にsed
を使用して、レポートのそのid=xxx
トークンからID番号を抽出します。この値は、xinput set-button-map
ディレクティブで使用され、再マッピングが実行されます。上記の例で唯一の変更は、ボタン#9がボタン#2を模倣するように再マッピングされることです。他のすべてはデフォルト設定のままです。
Update: @Lokasennaが指摘しているように 以下 、デバイスがマウスとキーボードの両方として自身を報告する場合、結果の数を制限する必要があるかもしれません-m 1
を使用したgrep
。
this answer も参照してください。
xinput
、xbindkeys
、およびxautomation
(を含む)が必要です。 xte
)このタスク用にインストールされています。
xinput list
とxinput test
を使用して、マウスのデバイスIDと割り当てたいボタンの番号を見つけます。私の場合、下側のボタン(#8)を左のボタン(#1)のダブルクリックにマップしたかったのです。
~/.xbindkeysrc
を作成または編集します。このファイルの形式は、一連のペアの行です。最初の行は、イベントに対して実行されるコマンドです。 2行目はイベントの説明です。 xte
のxautomation
コンポーネントを使用して、イベントを入力ハンドラーに直接送信します。
ボタンが離されたときにダブルクリックイベントを作成するために、次を追加しました。
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
この構成は、ボタン#1の2回のマウスクリックのシーケンスをボタン#8のリリースにマップします。 (理論的には、anyコマンドをマウスボタンにマッピングできると思いますが、これが最も一般的なケースです。他の実用的な例については this answer を参照してください。)
システムに複数のマウスが接続されているユーザーの場合、デバイスのIDも渡す必要があります。これはすべてのユーザーに適用されるわけではなく、Unityを使用したUbuntu 16.04で発見されました。
xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Kensington Kensington Expert Mouse id=9 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=13 [slave pointer (2)]
⎜ ↳ TPPS/2 IBM TrackPoint id=14 [slave pointer (2)]
次に、コマンド出力からid =値(この例ではid = 9)を参照して、.xbindkeysrcファイルを変更します。
"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
このための短い手順は次のとおりです。
xinput
というユーティリティがあります。 xinput list
または単にxinput
は、すべてのX入力デバイスとそれらのIDを表示します。ここで、再マップするマウスのIDを見つけます。
21であるセットアップからIDを例として使用し、xinput --get-button-map 21
が出力されます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ここで、たとえば、単に実行する左右のボタンを交換する場合
xinput --set-button-map 21 3 2 1
これで、再マッピングが完了しました。
起動時に実行するには、これをファイルに入れるだけです:
echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh
実行許可を与える
chmod +x leftmouseremap.sh
最後に、これをGUIから手動でStatrtup Applicationに追加するか、CLIから必要な場合は、~/.config/autostart
のファイルに以下のテキストを入力します(パスを変更します)。これが私の(less .config/autostart/leftmouseremap.sh.desktop
)です。
[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=
KDEの場合、パスは~/.kde/Autosart
のようになります。他のデスクトップマネージャーの場合、これは見た目が異なる場合があることに注意してください。または、/etc/rc.local
を使用して、一般的なアプローチで起動を実行できます。
zerobandwidth's great answer を使用する場合、LogitechのMX Ergoなどの一部のデバイスは、pointerとkeyboardデバイス:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech MX Ergo id=10 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=14 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
...
↳ Logitech MX Ergo id=15 [slave keyboard (3)]
その結果、grep "Logitech MX Ergo"
は2つの値を返すことになります。後者は、マッピング文字列の最初のアイテムとして含まれてしまい、すべてのマウスボタンを台無しにします。
修正は簡単です-grep
の最大カウント引数-m 1
を使用するだけです:
my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput --set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16
12.04より前の標準リポジトリには「btnx」と呼ばれる簡単なグラフィカルツールがあり、これはシステム構成に「ボタンプロパティ」として追加されました。悲しいことに、それは落とされました。現在14.04、16.04、18.04に維持されている「信頼できない」PPAは次のとおりです。 https://launchpad.net/~oliverstar/+archive/ubuntu/ppa ( https://launchpad.net/ubuntu/xenial/+source/btnx にあります)
システム設定とは統合されませんが、安価な5ボタンマウスを搭載したラップトップでは非常にうまく機能します。キーストロークとコマンドにも再マッピングでき、構成は他の方法よりもはるかに簡単です!
Ubuntu Software CenterからダウンロードしたEasystroke Gesture Recognitionを使用して、Logitechマウスの中央ボタンのマッピングを「Return」に変更することができました。編集:アプリケーションで、[アクションの追加]、[名前]、キーの種類を選択し、[詳細]をクリックしてEnterキーを押し、[ストロークの記録]を押します。
HP elitebook 2570p、Ubuntu 18.04.2を使用しています。ここには私にとって役に立たないトラックポイントがあり、スペースの下に2つの役に立たないトラックポイントボタンがあります
タッチパッドの下にあるので、これらのキーは使用しません。これらのボタンをleft = back_button(Alt_L + Left)、右ボタン= middle_mouse_buttonに再マッピングしたいと思います。 「xinput」のトラックポイントはid = 11で、左ボタンは1、右ボタンは3です。
誰かが私に端末にコピーするための正しいコードを書くことができますか?私はxbindkeysrcと組み合わせていますが、それは両方の(トラックポイントとタッチパッド)ボタンにアクションを設定します