マウスのプライマリボタンとセカンダリボタンを交換するスクリプト

マウスのプライマリボタンとセカンダリボタンを交換するスクリプト

この答えマウスのプライマリ ボタンとセカンダリ ボタンを交換するコマンド ラインを表示します。ただし、スクリプトを実行するたびにマウス ボタンを自動的に交換したいです。これを行う方法について誰かヒントをいただけませんか。私は bash スクリプトについてほとんど何も知りません。

答え1

出力を提供しxinput listないあなたのシステムでは、直接使用できる答えを誰も提供できません。これは、xinput図に示されているものとは異なるデバイスを表示できるためです。ターミナルからマウスボタンを左利き用に切り替えるにはどうすればよいですか?

たとえば、OSX での出力は次のようになります。

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ xquartz virtual pointer                   id=6    [slave  pointer  (2)]
⎜   ↳ pen                                       id=8    [slave  pointer  (2)]
⎜   ↳ cursor                                    id=9    [slave  pointer  (2)]
⎜   ↳ eraser                                    id=10   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ xquartz virtual keyboard                  id=7    [slave  keyboard (3)]

私の Debian/testing での出力は次のとおりです。

$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ VMware VMware Virtual USB Mouse           id=7    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=9    [slave  pointer  (2)]
⎜   ↳ VirtualPS/2 VMware VMMouse                id=10   [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)]
    ↳ AT Translated Set 2 keyboard              id=8    [slave  keyboard (3)]

つまり、あるシステムでは選択できる ID は 1 つ (xquartz 仮想ポインタ) ですが、別のシステムでは 3 つの可能性があります。これらを読んでいくと、ここで引用されている例が不自然なものではないことがわかります。

変動(そして曖昧さ)を考慮するとドキュメントxinput) の場合、マウス デバイスの ID を取得する部分を自動化することはできない可能性があります。

使用可能な識別子を選択したと仮定し、議論のためにそれを「12」と呼ぶことにします。スクリプトは、次の出力を読み取ることができます。

xinput get-button-map 12

を配列に変換します。一部のスクリプト言語では配列が提供されています (例: ) bash。ただし、いくつか落とし穴があります。

  • 私の OSX システムでは、リスト「1 2 3」が返されますが、Debian システムではリスト「1 2 3 4 5 6 7 8 9 10 11 12」が返されます。
  • 追加のボタンが何か意味があるかどうかを推測する必要があり、
  • 3 つのボタン番号の割り当てでも、左/中央/右が明確でない場合があります。

次に、キーを切り替えるスクリプトは、その状態をどこかに保存する必要があります。たとえば、ホームディレクトリのファイルに保存します。それを管理するスクリプトは、

  • 現在のボタンでファイルを初期化する
  • ボタンを切り替えるスキームに従って更新します (3 つの場合は「3!」の可能な配置があります)

最も単純な構成 (および解釈) があると仮定すると、スクリプトで次のような操作を実行できます。

#!/bin/sh
id=$1
cfg=$HOME/.mousebuttons
[ -f "$cfg" ] || xinput get-button-map $id | awk ' { printf "normal: %s\n", $0; }' >$cfg
mode=$(awk '{print $1;}' <$cfg)
# read and toggle
list=$(awk '{printf "%d %d %d\n", $3, $2, $4; }' <$cfg)
if [ "x$mode" = "xnormal" ]
then
    mode=reverse
else
    mode=normal
fi
# update the configuration
echo "$mode $list" | awk '{ printf "%s %d %d %d\n", $1, $2, $3, $4; }' >$cfg
xinput set-button-map $id $list
# show result
xinput get-button-map $id

スクリプトは 1 つのパラメータ (マウス デバイスの識別子) を受け入れます。指定された例 (スクリプトに「toggle-buttons」という名前を付け、実行可能にして に配置する$PATH) の場合:

toggle-buttons 12

仕事はできるはずです。

答え2

他の回答は、マウスのプライマリボタン (1 と 3) を交換するという単純なタスクに対して過度に複雑であるように思われる場合があるため、これに対して独自の解決策を追加します。

#!/bin/bash                                                                                           
set -e

# To get the name of a devices, do "xinput list --name-only"                                          
DEVICE_NAME="PixArt Microsoft USB Optical Mouse"

current_button_map=$(xinput get-button-map "$DEVICE_NAME")

if [[ $current_button_map =~ "1 2 3" ]]; then
    echo "Making the mouse a lefty"
    xinput set-button-map "$DEVICE_NAME" 3 2 1
else
    echo "Making the mouse a righty"
    xinput set-button-map "$DEVICE_NAME" 1 2 3
fi

答え3

私は次のようにします:

#!/bin/sh

mxid=$(xinput --list --short | awk '/Razer/{gsub(/.*id=/, "");gsub(/[[:blank:]].*/, "");print}')
bmap=$(xinput get-button-map $mxid)
nmap=$(awk '{s=$1;$1=$3;$3=s};1' <<<$bmap)
xinput set-button-map $mxid $nmap

これは、マウスの「名前」(私の場合はRazer)を知っていて、 で取得するデフォルトのボタン マッピング(つまり、どのボタンが左でどのボタンが右で、それらを入れ替えることができるか)を知っていることを前提としていますxinput list $mxid

Button labels: "Button Left" "Button Middle" "Button Right"....

そしてxinput get-button-map $mxid

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

ご覧のとおり、私の場合1 =>> left3 =>> right上記のスクリプトは現在のマッピングを読み取り、最初の値と 3 番目の値を交換して、新しいマッピングを設定するだけです。

答え4

デバイスの状態を切り替える必要がある場合 (マウス キーの順序を反転/反転解除することがそのような状態である場合)、デバイスの現在の状態を照会するか、状態を何らかのファイルに保持できる必要があります。

xinputマウスにボタン マッピングを問い合わせる方法があるかどうかはわかりませんでしたが、たとえば というファイルに状態を保存する方がよいでしょう~/.config/mousebuttons。スクリプトは実行時にファイルに 'reverse' を書き込む必要があります。

xinput set-button-map 12 3 2 1 を実行し、そのファイルに 'normal' を書き込みます。

xinput set-button-map 12 2 3 実際に実行されるアクションは、ファイルの読み取り内容によって異なります。スクリプトの開始時にファイルの内容が である場合normal(またはファイルが存在しない場合) は最初の手順を実行し、内容が である場合は 2 番目の手順を実行しますreverse

ファイルの内容は、呼び出されるたびに から に切り替わりますreversenormal再起動後など、実際の状態がファイルの内容を反映していない可能性があります。そのため、新しい状態も画面に出力して、視覚的なリマインダーとして確認してください。ファイルが状態と同期していない場合は、スクリプトを 1 回呼び出すだけで、再び同期されます。

関連情報