web-dev-qa-db-ja.com

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

私は週末にこれに苦労し、マウスボタンを再マップする必要があります。

30
zerobandwidth

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からのレポートのマウスの既知の名前に対してxinputingによって実行され、次にsedを使用して、レポートのそのid=xxxトークンからID番号を抽出します。この値は、xinput set-button-mapディレクティブで使用され、再マッピングが実行されます。上記の例で唯一の変更は、ボタン#9がボタン#2を模倣するように再マッピングされることです。他のすべてはデフォルト設定のままです。

Update: @Lokasennaが指摘しているように 以下 、デバイスがマウスとキーボードの両方として自身を報告する場合、結果の数を制限する必要があるかもしれません-m 1を使用したgrep

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

this answer も参照してください。

xinputxbindkeys、およびxautomationを含む)が必要です。 xte)このタスク用にインストールされています。

xinput listxinput testを使用して、マウスのデバイスIDと割り当てたいボタンの番号を見つけます。私の場合、下側のボタン(#8)を左のボタン(#1)のダブルクリックにマップしたかったのです。

~/.xbindkeysrcを作成または編集します。このファイルの形式は、一連のペアの行です。最初の行は、イベントに対して実行されるコマンドです。 2行目はイベントの説明です。 xtexautomationコンポーネントを使用して、イベントを入力ハンドラーに直接送信します。

ボタンが離されたときにダブルクリックイベントを作成するために、次を追加しました。

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

この構成は、ボタン#1の2回のマウスクリックのシーケンスをボタン#8のリリースにマップします。 (理論的には、anyコマンドをマウスボタンにマッピングできると思いますが、これが最も一般的なケースです。他の実用的な例については this answer を参照してください。)

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
47
zerobandwidth

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

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を使用して、一般的なアプローチで起動を実行できます。

5

zerobandwidth's great answer を使用する場合、LogitechのMX Ergoなどの一部のデバイスは、pointerkeyboardデバイス:

⎡ 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
3
Lokasenna

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

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

1
w-sky

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

1
atr15

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

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

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

0
Atom