Скрипт для замены основных и дополнительных кнопок мыши

Скрипт для замены основных и дополнительных кнопок мыши

Этот ответпоказать командные строки для смены основной и дополнительной кнопки мыши. Однако я хотел бы, чтобы скрипт автоматически менял кнопки мыши каждый раз при запуске. Может ли кто-нибудь подсказать мне, как это сделать, я почти ничего не знаю о скриптах 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), вы, вероятно, не сможете автоматизировать часть получения идентификатора устройства мыши.

Предположим, что вы выбрали пригодный для использования идентификатор, и для обсуждения назовем его «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при каждом вызове. Ваше фактическое состояние может не отражать содержимое файла, например, после перезагрузки, поэтому выведите на экран новое состояние для визуального напоминания. Если файл не синхронизирован с состоянием, один вызов вашего скрипта снова его синхронизирует.

Связанный контент