Как автоматически переназначить кнопки мыши при запуске?

17

Я боролся с этим в выходные, и мне нужно переделать мыши.

    
задан zerobandwidth 07.07.2014 в 13:13
источник

3 ответа

31

У меня есть мышца Logitech с 9 кнопками, а нажатие «средней кнопки» (№ 2) включает в себя щелчок по колесу прокрутки. Мне это не нравится, потому что я неуклюжий и, как правило, прокручиваю окно, в котором я нахожусь, когда я пытаюсь щелкнуть колесо. Поэтому я хотел автоматически переназначить верхнюю боковую кнопку (# 9 в этом случае) на среднюю кнопку (# 2). Я также хотел отобразить нижнюю боковую кнопку (# 8), чтобы она выполняла двойной щелчок левой кнопки (# 1).

Хотя мои цели были конкретными, приведенные ниже решения можно обобщить на любую ситуацию, в которой вы хотите автоматически переназначить кнопки мыши при запуске.

Отображение кнопок мыши на других кнопках мыши

Для этой задачи вам понадобится xinput . Это можно сделать полностью в файле .xsessionrc . Во-первых, используйте xinput , чтобы узнать имя, присвоенное вашей мыши, которое затем соотносится с идентификатором устройства ввода. Ниже приведен пример вывода моего ноутбука:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Laser Mouse              id=11   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard           id=5    [slave  keyboard (3)]

Моя мышь называет себя Logitech USB Laser Mouse и отображается как id=11 . У вашей мыши будет другое имя; полагая, что выход оставлен в качестве упражнения для читателя.

Пока вы все еще знаете идентификатор устройства в сеансе this , узнайте, сколько кнопок, которые обработчик ввода считает мышью, используя xinput list deviceID . Это может отличаться от количества кнопок, которые отображаются на устройстве.

Logitech USB Laser Mouse                    id=11   [slave  pointer  (2)]
    Reporting 7 classes:
        Class originated from: 11. Type: XIButtonClass
        Buttons supported: 16
        Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"

С моей мышью есть только 9 очевидных физических кнопок, но xinput сообщает 16.

Учитывая природу USB, этот идентификатор может меняться каждый раз, когда вы перезагружаетесь, поэтому недостаточно сценариев, которые статически привязаны к идентификатору, который вы открываете один раз. Вам придется динамически анализировать это при запуске и выполнять свою повторную карту на основе текущего идентификатора.

Теперь, когда вы знаете его имя, вы можете использовать xinput test , чтобы выяснить, какой ключ переназначить. Нажимайте кнопки мыши, на которые вы хотите отобразить карту, и, чтобы получить их индексы. (Для справки, 1, 2 и 3 «всегда» (т. Е. Обычно) относятся к левой, средней и правой кнопкам 3-кнопочной мыши. Общая ре-карта меняет их, чтобы сделать мышь левой. )

button press   2
button release 2
button press   9
button release 9

В этом случае я обнаружил, что хочу отобразить кнопку # 9 (сторона, сверху) на кнопку # 2 (средняя).

Теперь, когда вы знаете, как вызывается ваша мышь, и какие кнопки вы хотите изменить, вы можете написать скрипт ~/.xsessionrc , который вызывает xinput для выполнения повторного сопоставления кнопок при запуске. Ниже приведен мой полный сценарий.

# Map button 9 (top side button) to button 2 (middle button)
my_mouse_id=$(xinput | grep "Logitech USB Laser Mouse" | sed 's/^.*id=\([0-9]*\)[ \t].*$//')
echo $my_mouse_id > ~/temp/my_mouse_id
xinput set-button-map $my_mouse_id 1 2 3 4 5 6 7 8 2 10 11 12 13 14 15 16

В первой строке здесь устанавливается временная переменная сеанса, равная идентификатору мыши, как указано xinput . Это делается с помощью grep ing для известного имени мыши в отчете xinput , затем используя sed , чтобы извлечь идентификационный номер из этого токена id=xxx в отчете. Это значение затем используется в директиве xinput set-button-map , которая выполняет повторное сопоставление. В приведенном выше примере единственное изменение состоит в том, что кнопка # 9 перерисовывается на кнопку mimic # 2. Все остальные остаются в настройках по умолчанию.

Отображение кнопок мыши на произвольные функции

См. также этот ответ .

Вам понадобится xinput , xbindkeys и xautomation (включая xte >), установленный для этой задачи.

Используйте xinput list и xinput test , чтобы узнать идентификатор устройства мыши и номер кнопки, которую вы хотите назначить. В моем случае я хотел отобразить нижнюю боковую кнопку (# 8) двойным щелчком левой кнопки (# 1).

Создайте или отредактируйте ~/.xbindkeysrc . Формат этого файла представляет собой ряд парных строк. Первая строка - это команда, которая должна быть выполнена для события; вторая строка - описание события. Мы будем использовать компонент xte xautomation для отправки событий непосредственно в обработчик ввода.

Чтобы создать событие двойного щелчка при отпускании кнопки, я добавил следующее:

"/usr/bin/xte 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release

Эта конфигурация отображает последовательность двух щелчков мышью на кнопке # 1 на выпуск кнопки # 8. (В теории, я думаю, вы могли бы сопоставить команду any с кнопкой мыши, но это наиболее распространенный случай. См. этот ответ для других практических примеров.)

Обновление для 16.04 Ubuntu

Для пользователей с несколькими мышами, подключенными к вашей системе, вам также необходимо передать идентификатор устройства. Это может не относиться ко всем пользователям и было обнаружено на Ubuntu 16.04 с Unity.

xinput list

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Kensington      Kensington Expert Mouse   id=9    [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=13   [slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                     id=14   [slave  pointer  (2)]

Затем измените файл .xbindkeysrc, указав значение id = из выходного файла команды (id = 9 в этом примере):

"/usr/bin/xte -i 9 'mouseclick 1' 'mouseclick 1' &"
b:8 + Release
    
ответ дан zerobandwidth 07.07.2014 в 13:13
источник
1

Мне удалось изменить отображение средней кнопки мыши Logitech на «Return» с помощью распознавания жестов Easystroke, которую я загрузил из Ubuntu Software Center. Изменить: в приложении вы должны выбрать «Добавить действие», «Назовите его», выбрать тип ключа, нажать «Подробности» и нажать «Ввод», нажать «Ход записи», а во время прокрутки нажмите среднюю кнопку.

    
ответ дан atr15 13.09.2015 в 18:02
0

Короткие шаги для этого:

Существует утилита, называемая xinput . xinput list или только xinput покажут все устройства ввода X и их идентификаторы. Здесь вы найдете идентификатор мыши, который вы хотите переназначить.

Я буду использовать свой ID в качестве примера, из моей настройки, которая равна 21, тогда xinput --get-button-map 21 выведет

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Теперь, если вы хотите, скажем, поменять левую и правую кнопки, вы просто запустите

xinput --set-button-map 21 3 2 1

Здесь мы делаем переопределение.

Для запуска при запуске просто поместите это в файл:

echo "xinput --set-button-map 21 3 2 1" > leftmouseremap.sh

предоставить ему разрешение на выполнение

chmod +x leftmouseremap.sh 

Наконец, добавьте это в приложение Statrtup вручную из графического интерфейса или, если вы хотите, чтобы он был от CLI, поместите текст ниже (измените пути к вашему) inti файл в вашем ~/.config/autostart , вот мой ( less .config/autostart/leftmouseremap.sh.desktop ):

[Desktop Entry]
Type=Application
Exec=/home/ruslan/leftmouseremap.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name[en_US]=/home/ruslan/leftmouseremap.sh
Name=/home/ruslan/leftmouseremap.sh
Comment[en_US]=
Comment=

Имейте в виду, что с KDE путь будет похож на ~/.kde/Autosart , для других менеджеров настольных компьютеров это может быть заметно иным. В качестве альтернативы запуск можно выполнить с помощью общего подхода, используя /etc/rc.local .

    
ответ дан Ruslan Gerasimov 06.07.2017 в 08:30