用於交換滑鼠主按鈕和輔助按鈕的腳本

用於交換滑鼠主按鈕和輔助按鈕的腳本

這個答案顯示交換滑鼠主按鈕和輔助按鈕的命令列。但是,我希望有一個腳本在每次執行時自動交換滑鼠按鈕。有人可以提示我如何執行此操作,我對 bash 腳本幾乎一無所知。

答案1

xinput list不提供on的輸出你的系統中,沒有人可以提供您可以直接使用的答案。這是因為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 可供選擇(xquartz 虛擬指標),而在另一個系統上則有三種可能性。如果你仔細閱讀這些內容,你會發現這裡引用的例子並不是做作的:

鑑於變化(和模糊的文檔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!」可能的安排)

假設您有最簡單的配置(和解釋),您可以在腳本中執行以下操作:

#!/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

此腳本接受一個參數(滑鼠裝置的識別碼)。對於給定的範例(並將腳本命名為“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上面的腳本只是讀取當前映射並交換第一個和第三個值,然後設定新的映射。

答案4

如果您需要切換裝置的狀態(並且反轉/取消反轉滑鼠鍵的順序就是這樣的狀態),您要么必須能夠查詢裝置的當前狀態,要么將狀態保留在某個檔案中。

由於我找不到是否xinput有辦法向滑鼠詢問按鈕映射,因此您可能應該將狀態存儲在文件中,例如~/.config/mousebuttons.您的腳本在執行時應向檔案寫入「reverse」:

xinput set-button-map 12 3 2 1 並在執行時將「正常」寫入該檔案:

xinput set-button-map 12 2 3 實際執行的操作取決於讀取檔案:如果腳本啟動時檔案內容為normal(或檔案不存在),則執行第一步,如果內容為,則執行第二步是reverse

每次呼叫時文件內容都會翻轉reversenormal您的實際狀態可能不會反映文件的內容,例如重新啟動後,因此將新狀態列印到螢幕上以進行視覺提醒。如果檔案與狀態不同步,只需呼叫一次腳本即可再次同步。

相關內容