用于交换鼠标主按钮和辅助按钮的脚本

用于交换鼠标主按钮和辅助按钮的脚本

这个答案显示交换鼠标主按钮和辅助按钮的命令行。但是,我希望有一个脚本在每次执行时自动交换鼠标按钮。有人可以提示我如何执行此操作,我对 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您的实际状态可能不会反映文件的内容,例如重新启动后,因此将新状态打印到屏幕上以进行视觉提醒。如果文件与状态不同步,只需调用一次脚本即可再次同步。

相关内容