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

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

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 listdeviceID, Это может отличаться от количества кнопок, которые видны на устройстве.

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, но это устанавливает любое действие для обеих кнопок (трекпойнт и сенсорная панель)

Другие вопросы по тегам