Этот ответпоказать командные строки для смены основной и дополнительной кнопки мыши. Однако я хотел бы, чтобы скрипт автоматически менял кнопки мыши каждый раз при запуске. Может ли кто-нибудь подсказать мне, как это сделать, я почти ничего не знаю о скриптах 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 для выбора (виртуальный указатель xquartz), в то время как в другой есть три возможности. Если вы прочитаете это, вы увидите, что приведенные здесь примеры не являются надуманными:
- Как изменить назначение клавиш мыши?
- «xinput list» отображает одно и то же устройство дважды, и идентификаторы устройств меняются: как использовать «set-prop» в скрипте?
Учитывая вариации (и неопределенностьдокументация дляxinput
), вы, вероятно, не сможете автоматизировать часть получения идентификатора устройства мыши.
Предположим, что вы выбрали пригодный для использования идентификатор, и для обсуждения назовем его «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 =>> left
скрипт 3 =>> right
выше просто считывает текущее сопоставление и меняет местами первое и третье значения, а затем устанавливает новое сопоставление.
решение4
Если вам нужно переключить состояние устройства (а изменение/отмена обратного порядка клавиш мыши является таким состоянием), вам либо придется запросить у устройства текущее состояние, либо сохранить состояние в каком-либо файле.
Поскольку я не смог найти xinput
способ запросить у мыши сопоставление кнопок, вам, вероятно, следует сохранить состояние в файле, например ~/.config/mousebuttons
. Ваш скрипт должен записать 'reverse' в файл при выполнении:
xinput set-button-map 12 3 2 1 и записать «normal» в этот файл при выполнении:
xinput set-button-map 12 2 3 Фактическое действие, которое необходимо выполнить, зависит от чтения файла: выполните первый шаг, если содержимое файла при запуске скрипта равно normal
(или файл не существует), и выполните второй шаг, если содержимое равно reverse
.
Содержимое файла переключается с reverse
на normal
при каждом вызове. Ваше фактическое состояние может не отражать содержимое файла, например, после перезагрузки, поэтому выведите на экран новое состояние для визуального напоминания. Если файл не синхронизирован с состоянием, один вызов вашего скрипта снова его синхронизирует.