起動時にマウスのボタンを自動的に再マップするにはどうすればよいですか?


回答:


47

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つしかありませんが、xinput16を報告しています。

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

マウスボタンを任意の機能にマッピングする

この回答も参照してください。

あなたは必要になりますxinputxbindkeysxautomation(を含む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のリリースにマップします。(理論的には、任意のコマンドをマウスボタンにマッピングできると思いますが、これは最も一般的なケースです。他の実用的な例については、この回答を参照してください。)

16.04 Ubuntuの更新

システムに複数のマウスが接続されているユーザーの場合、デバイスの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

7
情報のおかげで。awkは、デバイス内の単語の数に基づいて変更する必要があるように見えます。私が使用したsed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
-jbo5112

xinputテストによると、サムキーは3つの異なるキーを押します-.xbindkeysrcでそれらをすべてバインドする方法は?
axltop

@ jbo5112私は職場のラップトップで複数のマウスを使い始めたばかりで、コメントを再検討する正当な理由がありました。私の例では、古いawkステートメントをあなたのsedステートメントに置き換えました。改善してくれてありがとう!
ゼロ帯域幅

2
set-button-mapでidを使用する必要はありません。例: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回なのでしょうか?このマウスを取り外すと両方が消え、接続すると再び表示されます。
w-sky

6

このための短い手順は次のとおりです。

というユーティリティがありますxinputxinput 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


これで私の水の流出問題が解決しました。ラップトップのタッチパッドの下に左/右クリックボタンがあります。私は水をこぼし、今では両方のボタンがOSにミドルクリック信号を送信します(「keymon」アプリを使用してこれを発見しました)。私はあなたの方法を使用して、中クリックから左クリックに再マッピングしました。そのため、少なくとも左クリックを楽しむことができます。私はミドルクリックを使用しないので、これは私にとって完璧に機能します:)簡単な指示をありがとう。入力デバイスIDは11だったので、「xinput --set-button-map 11 1 1 3」を実行しましたThanks !!
Vahid Pazirandeh

3

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

素晴らしいヒント; 回答を編集して、それを含めました。ありがとう!
ゼロ帯域幅

1

Ubuntu Software CenterからダウンロードしたEasystroke Gesture Recognitionを使用して、Logitechマウスの中央ボタンのマッピングを「Return」に変更することができました。編集:アプリケーションで、[アクションの追加]を選択し、名前を付け、キーの種類を選択し、[詳細]をクリックしてEnterキーを押し、[ストロークの記録]を押します。


1
AskUbuntuへようこそ。答えを詳しく説明する必要があります。
デビッド

OK、上記の編集をご覧ください。
atr15

良いキャッチ。しかし、あなたが説明したことはあなたが指示したように変わりません。実際には、中央のボタンはそのアプリを「ジェスチャー認識モード」にするデフォルトのボタンです:それを押すと、アプリはあなたが行っているジェスチャーを認識し始めます。ただし、そのアプリにはマウスボタンIDを表示するモジュールがあるため、+ 1です。これは、使用xinput時に表示されないボタンで使用する場合に役立ちますxinput list <devID>
1111161171159459134

1
ああ、これは1年後です-あなたの答えは+1
1111161171159459134

1

12.04より前は、標準リポジトリに「btnx」と呼ばれる簡単なグラフィカルツールがあり、システム構成に「ボタンプロパティ」として追加されていました。悲しいことに、それは落とされました。現在14.04、16.04、18.04に維持されている「信頼できない」PPAはこちら:https : //launchpad.net/~oliverstar/+archive/ubuntu/ppahttps://launchpad.net/ubuntu/xenial/+sourceにあります) / btnx

システム設定とは統合されませんが、安価な5ボタンマウスを搭載したラップトップでは非常にうまく機能します。キーストロークとコマンドにも再マッピングでき、構成は他の方法よりもはるかに簡単です!


ツールがバックグラウンドで同じ変更を行っているのではないかと思います。^ _ ^
ゼロ帯域幅

0

HP elitebook 2570p、Ubuntu 18.04.2を使用しています。ここには私にとって役に立たないトラックポイントがあり、スペースの下に2つの役に立たないトラックポイントボタンがあります

タッチパッドの下にあるので、これらのキーは使用しません。これらのボタンをleft = back_button(Alt_L + Left)、右ボタン= middle_mouse_buttonに再マップしたいと思います。「xinput」のトラックポイントはid = 11で、左ボタンは1、右ボタンは3です。

誰かが私に端末にコピーするための正しいコードを書くことができますか?私はxbindkeysrcと組み合わせていますが、それは両方の(トラックポイントとタッチパッド)ボタンにアクションを設定します


<code> echo xinput set-button-map 11 8 1 2 >>〜/ .xsessionrc </ code>これにより、タッチポイントボタン(id 11)が左を8番目のボタンにし、中央を左クリック(1以外)、右をミッドデルとしてクリックし、「code」echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L'&amp; \ "\ nb:8" >>〜/ .xbindkeysrc 'code'ボタン番号8(b:8)をAlt_L + Left =>戻る:)に設定します。2つのマウスボタンが便利になりました
Atom
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.