回答:
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
ます。マウスには別の名前が付けられます。それを理解することは、読者の練習として残されています。
このセッションでデバイスの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(ミドル)にマップしたいことがわかりました。
マウスの名前と変更するボタンがわかったので、起動時にボタンの再マッピングを実行するために~/.xsessionrc
呼び出すスクリプトを作成できますxinput
。以下は私の完全なスクリプトです。
# 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
ここの最初の行は、によって報告されたマウスのIDと等しい一時的なセッション変数を設定しxinput
ます。これはgrep
、レポートのマウスの既知の名前をから取得してからxinput
、レポートのsed
そのid=xxx
トークンからID番号を抽出することによって行われます。この値はxinput set-button-map
、再マッピングを実行するディレクティブで使用されます。上記の例で唯一の変更は、ボタン#9がボタン#2を模倣するように再マッピングされることです。他のすべてはデフォルト設定のままです。
更新:以下で@Lokasennaが指摘しているように、デバイスがマウスとキーボードの両方として自身を報告する場合、grep
使用の結果カウントを制限する必要があります-m 1
。
この回答も参照してください。
あなたは必要になります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のリリースにマップします。(理論的には、任意のコマンドをマウスボタンにマッピングできると思いますが、これは最も一般的なケースです。他の実用的な例については、この回答を参照してください。)
システムに複数のマウスが接続されているユーザーの場合、デバイスの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
awk
ステートメントをあなたのsed
ステートメントに置き換えました。改善してくれてありがとう!
xinput set-button-map "Logitech Trackball" 1 3 3
xinput
このように、二回私のマウスを示してい:↳USB OPTICAL MOUSEのid = 12 [スレーブポインタ(2)]↳USB光学式マウスID = 13 [スレーブポインタ(2)]でコマンドをキャッチするだけID 13 xinput test
。スクリプトは常に最初のIDをキャッチします。しかし、なぜそれが2回なのでしょうか?このマウスを取り外すと両方が消え、接続すると再び表示されます。
このための短い手順は次のとおりです。
というユーティリティがあります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
最後に、CLIからあなたがそれをしたい場合は、GUIから手動でStatrtupアプリケーションにこれを追加したり、下に置くテキストあなたの中のファイルINTI(あなたへの転換路)が~/.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の優れた答えを使用すると、LogitechのMX Ergoなどの一部のデバイスは、ポインターとキーボードデバイスの両方として表示されます。
⎡ 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
Ubuntu Software CenterからダウンロードしたEasystroke Gesture Recognitionを使用して、Logitechマウスの中央ボタンのマッピングを「Return」に変更することができました。編集:アプリケーションで、[アクションの追加]を選択し、名前を付け、キーの種類を選択し、[詳細]をクリックしてEnterキーを押し、[ストロークの記録]を押します。
xinput
時に表示されないボタンで使用する場合に役立ちますxinput list <devID>
。
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ボタンマウスを搭載したラップトップでは非常にうまく機能します。キーストロークとコマンドにも再マッピングでき、構成は他の方法よりもはるかに簡単です!
HP elitebook 2570p、Ubuntu 18.04.2を使用しています。ここには私にとって役に立たないトラックポイントがあり、スペースの下に2つの役に立たないトラックポイントボタンがあります
タッチパッドの下にあるので、これらのキーは使用しません。これらのボタンをleft = back_button(Alt_L + Left)、右ボタン= middle_mouse_buttonに再マップしたいと思います。「xinput」のトラックポイントはid = 11で、左ボタンは1、右ボタンは3です。
誰かが私に端末にコピーするための正しいコードを書くことができますか?私はxbindkeysrcと組み合わせていますが、それは両方の(トラックポイントとタッチパッド)ボタンにアクションを設定します
sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'