Как автоматически переназначить кнопки на моей мыши при запуске?
Я боролся с этим на выходных, и мне нужно переназначить кнопки мыши.
5 ответов
У меня есть мышь 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
Короткие шаги для этого:
Существует утилита под названием 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
,
При использовании великолепного ответа 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
аргумент максимального количества, -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
Мне удалось изменить отображение средней кнопки моей мыши Logitech на "Возврат" с помощью Easystroke Gesture Recognition, которую я скачал из Центра программного обеспечения Ubuntu. Редактировать: в приложении вы должны выбрать "Добавить действие", "Имя", выбрать тип ключа, щелкнуть "Детали" и нажать "Ввод", нажать "Записать ход" и во время запроса нажать среднюю кнопку.
До 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-кнопочной мышью. Он также может быть переназначен на нажатия клавиш и команды, и конфигурация намного проще, чем с любым другим методом!
У меня HP elitebook 2570p, Ubuntu 18.04.2. Здесь у меня есть трекпоинт, который для меня бесполезен, а вот 2 бесполезных кнопки трекпоинт под пробелом
Я не использую эти клавиши, потому что они у меня под тачпадом. Я хотел бы переназначить эти кнопки влево =back_button(Alt_L+Left), правая = middle_mouse_button. Трекпоинт в "xinput" - это id=11, а левая кнопка - номер 1, правая - 3.
Может ли кто-нибудь написать мне правильный код, чтобы просто скопировать в терминал? У меня есть в сочетании с xbindkeysrc, но это устанавливает любое действие для обеих кнопок (трекпойнт и сенсорная панель)