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


Ответы:


47

У меня есть мышь 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. Ваша мышь будет иметь другое имя; выяснение этого оставлено в качестве упражнения для читателя.

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

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].*$/\1/')
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ввода известного имени мыши в отчете xinputи последующего использования sedдля извлечения идентификационного номера из этого id=xxxтокена в отчете. Это значение затем используется в xinput set-button-mapдирективе, которая выполняет переопределение. В приведенном выше примере единственным изменением является то, что кнопка № 9 переопределяется на кнопку имитации # 2. Все остальные остаются с настройками по умолчанию.

Обновление: как @Lokasenna указывает ниже , если ваше устройство сообщает о себе как о мыши и клавиатуре, вам может потребоваться ограничить количество результатов grepиспользования -m 1.

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

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

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

Обновление для 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

7
Спасибо за информацию. Ваш awk выглядит так, как будто его нужно изменить в зависимости от количества слов в устройстве. Я использовалsed 's/^.*id=\([0-9]*\)[ \t].*$/\1/'
jbo5112

Согласно тесту xinput, большой палец запускает три различных нажатия клавиш - как связать их все вместе в .xbindkeysrc?
Axltop

@ jbo5112 Я только что начал использовать несколько мышей на своем рабочем ноутбуке, и у меня была веская причина вернуться к вашему комментарию. Теперь я заменил свое старое awkутверждение на ваше sedутверждение в моих примерах. Спасибо за улучшение!
zerobandwidth

2
Нет необходимости использовать идентификатор в set-button-map; Например:xinput set-button-map "Logitech Trackball" 1 3 3
Jaustin

Необычная проблема, которую я предполагаю: xinputдважды показывает мою мышь, например: OP USB OPTICAL MOUSE id = 12 [указатель подчиненного устройства (2)] ↳ USB OPTICAL MOUSE id = 13 [указатель ведомого устройства (2)] Только ID 13 будет ловить команды с помощью xinput test. Скрипт всегда будет ловить первый идентификатор. Но почему это все равно дважды? Оба исчезают, когда я отключаю эту мышь, и снова появляются при подключении.
w-sky

6

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

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

Я буду использовать мой идентификатор в качестве примера, из моей настройки, которая составляет 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, поместите текст ниже (измените путь к своему) в файл ~/.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.


Это решило мою проблему разлива воды. У меня есть кнопки левого / правого щелчка под сенсорной панелью моего ноутбука. Я пролил воду, и теперь обе кнопки посылают сигнал среднего щелчка в ОС (я обнаружил это с помощью приложения 'keymon'). Я использовал ваш метод, чтобы переназначить средний щелчок левой кнопкой мыши, чтобы по крайней мере получить удовольствие от щелчка левой кнопкой мыши. Я никогда не использую средний щелчок, так что это прекрасно работает для меня :) Спасибо за простые инструкции. Мой идентификатор устройства ввода был 11, поэтому я запустил "xinput --set-button-map 11 1 1 3" Спасибо!
Вахид Пазиранде

3

При использовании великолепного ответа zerobandwidth некоторые устройства, такие как MX Ergo Logitech, отображаются как указатель и клавиатура :

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech MX Ergo                          id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [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)]
    ...
    ↳ Logitech MX Ergo                          id=15   [slave  keyboard (3)]

Следовательно, в grep "Logitech MX Ergo"конечном итоге возвращает два значения. Последний в конечном итоге включается в качестве первого элемента в строке сопоставления и облажает все ваши кнопки мыши.

Исправить несложно - просто используйте grepаргумент max-count -m 1:

my_mouse_id=$(xinput | grep -m 1 "Logitech MX Ergo" | sed 's/^.*id=\([0-9]*\)[ \t].*$/\1/')
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

Отличный совет; Я отредактировал ответ, чтобы включить его. Благодарность!
zerobandwidth

1

Мне удалось изменить отображение средней кнопки моей мыши Logitech на «Возврат» с помощью Easystroke Gesture Recognition, которую я скачал из Центра программного обеспечения Ubuntu. Редактировать: в приложении вы должны выбрать «Добавить действие», «Имя», выбрать тип ключа, щелкнуть «Детали» и нажать «Ввод», нажать «Записать ход» и во время запроса нажать среднюю кнопку.


1
Добро пожаловать в AskUbuntu. Вы должны предоставить более подробную информацию с вашим ответом.
Дэвид

Хорошо, пожалуйста, см. Выше редактировать.
atr15

Хороший улов. Но то, что вы описали, не выполняется в соответствии с указаниями: на самом деле средняя кнопка - это кнопка по умолчанию, которая переводит это приложение в «режим распознавания жестов»: при нажатии оно начинает распознавать совершаемый вами жест. +1, потому что в этом приложении есть модуль для отображения идентификаторов кнопок мыши; это помогает, когда мы хотим использовать xinputкнопки, которые не отображаются при использовании xinput list <devID>.
1111161171159459134 29.11.15

1
О, это пришло 1 год спустя - ваш ответ стоит +1
1111161171159459134

1

До 12.04 в стандартном репозитории был простой графический инструмент под названием «btnx», который добавлялся как «Свойства кнопки» в Конфигурации системы. К сожалению, однако это было понижено. «Ненадежный» PPA, поддерживаемый в настоящее время для 14.04, 16.04 и 18.04, находится здесь: https://launchpad.net/~oliverstar/+archive/ubuntu/ppa (находится по адресу https://launchpad.net/ubuntu/xenial/+source / btnx )

Он не интегрируется с настройками системы, но работает на моем ноутбуке с дешевой 5-кнопочной мышью. Он также может быть переназначен на нажатия клавиш и команды, и конфигурация намного проще, чем с любым другим методом!


Интересно, вносит ли инструмент те же изменения, только в фоновом режиме. ^ _ ^
ширина полосы

0

У меня HP elitebook 2570p, Ubuntu 18.04.2. Здесь у меня есть трекпоинт, который для меня бесполезен, а вот 2 бесполезных кнопки трекпоинт под пробелом

Я не использую эти клавиши, потому что они у меня под тачпадом. Я хотел бы переназначить эти кнопки влево = back_button (Alt_L + Left), правая = middle_mouse_button. Трекпоинт в «xinput» - это id = 11, а левая кнопка - номер 1, правая - 3.

Может ли кто-нибудь написать мне правильный код, чтобы просто скопировать в терминал? У меня есть в сочетании с xbindkeysrc, но это устанавливает любое действие для обеих кнопок (трекпойнт и сенсорная панель)


Я сделал это и сделал это просто: <code> echo xinput set-button-map 11 8 1 2 >> ~ / .xsessionrc </ code> Это делает мои кнопки с сенсорной точкой (id 11) делает левую как 8-ую кнопку, середина как левый клик (№ 1), и правый клик как средний, а затем 'code' echo -e "\" / usr / bin / xte 'keydown Alt_L' 'key Left' 'keyup Alt_L' & amp; \ "\ nb: 8" >> ~ / .xbindkeysrc 'code' Устанавливает для кнопки № 8 (b: 8) значение Alt_L + Left => назад :) Теперь у меня есть две полезные кнопки мыши
Atom
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.