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

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

この回答プライマリマウスボタンとセカンダリマウスボタンを交換するためのコマンドラインを表示します。しかし、実行するたびにマウスボタンを自動的に置き換えるスクリプトを持っていると思います。誰かが私にこれを行う方法についてのヒントを与えることができますか?私は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/テストの結果です:

$ 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)]

したがって、あるシステムには1つの選択可能なIDがあり(xquartz仮想ポインタ)、他のシステムには3つの可能性があります。この内容を注意深く読むと、ここに引用された例は人為的なものではないことがわかります。

変更(およびあいまいさ)を考慮して出荷書類ビーチxinput)、マウスデバイスIDを取得する部分を自動化できない場合があります。

使用可能な識別子の1つを選択するとし、説明のためにこれを「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 =>> leftご覧のように、私の場合、3 =>> right上記のスクリプトは現在のマッピングを読み取り、最初と3番目の値を変更して新しいマッピングを設定します。

答え4

デバイスの状態を切り替える必要がある場合(マウスキーの順序を反転または反転することがこれらの状態です)、デバイスの現在の状態を照会したり、一部のファイルで状態を維持したりする必要があります。

xinputマウスにボタンマッピングを要求する方法があるかどうかが見つからないため、ステータスをファイル(たとえば)に保存する必要があります~/.config/mousebuttons。スクリプトは実行時にファイルに「reverse」を書き込む必要があります。

xinput set-button-map 12 3 2 1 実行時にファイルに「正常に」書き込まれます。

xinput set-button-map 12 2 3 実際に実行される操作は、ファイルの読み込みによって異なります。スクリプトの起動時にファイルの内容がある場合、またはファイルが存在しない場合はnormal最初のステップが実行され、内容が次の場合は2番目のステップが実行されますreverse

呼び出すたびにファイルの内容が反転しますreversenormal再起動後など、実際の状態がファイルの内容を反映していない可能性があるため、ビジュアル通知で新しい状態を画面に印刷します。ファイルが状態と同期していない場合は、スクリプトを一度だけ呼び出して再同期します。

関連情報