Вопрос или проблема
У меня есть мышь с 4 физическими кнопками (Kensington Slimblade Trackball), давайте назовем их A B C D, плюс 3 оси: X, Y и колесо прокрутки.
Кнопки A и B работают из коробки как основная (кнопка 1) и правая кнопка (кнопка 3). Нажатие A + B вместе генерирует средний клик (кнопка 2), что также отлично.
Теперь я хотел бы сопоставить кнопки C и D для своих целей, но я не могу найти, как сопоставить кнопку C отдельно от эмуляции A+B.
С кнопочной картой по умолчанию я получаю следующее сопоставление:
физические кнопки: A C B D
xinput button-map: 1 2 3 4 5 6 7 8 9 10 11 12
Если я попытаюсь сопоставить кнопку C с 8 и D с 9, используя xinput set-button-map
, то нажатие A+B также сопоставляется с кнопкой 8!
физические кнопки: A C B D
xinput button-map: 1 8 3 0 0 0 0 9
^
Эмуляция A+B также становится 8!
Как я могу сопоставить кнопку C с произвольным номером кнопки, сохраняя эмуляцию A+B как кнопку 2?
Должен ли я работать на более низком уровне, чем Xinput? Как? Должен ли я использовать другую настройку Xinput?
Редактировать: вот коды evtest
для 4 кнопок:
A:
type 4 (EV_MSC), code 4 (MSC_SCAN), value 90001
type 1 (EV_KEY), code 272 (BTN_LEFT), value 1
B:
type 4 (EV_MSC), code 4 (MSC_SCAN), value 90002
type 1 (EV_KEY), code 273 (BTN_RIGHT), value 1
C:
type 4 (EV_MSC), code 4 (MSC_SCAN), value ff000001
type 1 (EV_KEY), code 274 (BTN_MIDDLE), value 1
D:
type 4 (EV_MSC), code 4 (MSC_SCAN), value ff000002
type 1 (EV_KEY), code 275 (BTN_SIDE), value 1
Я закончил тем, что пропатчил драйвер Xorg evdev, чтобы добавить опцию Emulate3Button, которая настраивает номер кнопки, выдаваемой эмуляцией средней кнопки. (Я отправил патч в рассылку, он должен быть объединен в ближайшее время.)
Затем я добавил этот фрагмент конфигурации:
Section "InputClass"
Identifier "SlimBlade Trackball"
Driver "evdev"
Option "ButtonMapping" "1 8 3 4 5 6 7 9 0 2"
Option "Emulate3Button" "10"
EndSection
Это заставляет эмуляцию средней кнопки выдавать номер кнопки 10, затем сопоставляет кнопку C с 8, D с 9, и 10 с 2. Вуаля.
Это просто дополнительный ответ на случай, если кто-то столкнется с подобной проблемой: может очень хорошо быть так, что верхние кнопки сенсорной панели указаны xinput
как отдельное устройство. В моем случае это было указано как “PS/2 Generic Mouse” с другим номером идентификатора устройства (как указано xinput
), чем сенсорная панель, поэтому решение заключалось в переназначении/изменении номеров для этой “мыши” (как указано xinput get-button-map <device id>
). См. этот конкретный ответ.
.
Ответ или решение
Вопрос о маппировании кнопок Xinput и эмуляции средней кнопки на мыши с четырьмя физическими кнопками требует понимания работы с драйверами ввода и механики обработки событий в системе X11. В частности, мы обсуждаем трекбол Kensington Slimblade, который содержит кнопки A, B, C, D и три оси: X, Y и колесико прокрутки. Основной сложностью является необходимость разделения маппинга кнопок C и D от эмуляции нажатия кнопок A+B, которая также задействует кнопку C в текущей конфигурации.
Теория
Xinput — это утилита, используемая для настройки свойств устройств ввода в системе X11. Она позволяет изменять маппинг кнопок, настройку чувствительности и другие параметры. При маппировании кнопок, система определяет физические кнопки на устройстве и их соответствие действиям в операционной системе.
Каждой кнопке и оси на устройстве ввода присваиваются уникальные идентификаторы, которые X11 использует для обработки событий. При использовании xinput set-button-map
вы фактически переназначаете эти идентификаторы, что может привести к непредвиденным последствиям, как, например, повторное присвоение одной и той же функции разным физическим кнопкам, что и наблюдается в вашей ситуации.
Пример
У вас есть следующий маппинг по умолчанию:
- Физические кнопки: A, C, B, D
- Xinput button-map: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Кнопки A и B работают как ожидается: А — основная кнопка (кнопка 1), B — правая кнопка (кнопка 3). Их сочетание вызывает действие средней кнопки (кнопка 2). Однако проблема с кнопкой C, которая задействуется одновременно с эмуляцией A+B.
Вы попытались переназначить кнопки C и D следующим образом:
- Маппирование Xinput: 1, 8, 3, 0, 0, 0, 0, 9
Но при этом сочетание A+B теперь вызывает событие для кнопки 8, что нежелательно.
Применение
Для устранения этой проблемы было выбрано наиболее подходящее решение — модификация драйвера Xorg. Это позволяет вручную управлять эмуляцией кнопок на уровне ниже Xinput и настраивать необходимое поведение. Самостоятельное исправление драйвера — задача непростая, требующая знаний программирования и понимания драйверов Linux.
Как было предложено, внесение изменений в драйвер evdev позволит ввести параметр Emulate3Button для настройки номера кнопки, срабатывающей при эмуляции нажатия A+B. Затем можно настроить конфигурацию, используя следующую секцию в Xorg:
Section "InputClass"
Identifier "SlimBlade Trackball"
Driver "evdev"
Option "ButtonMapping" "1 8 3 4 5 6 7 9 0 2"
Option "Emulate3Button" "10"
EndSection
Этот конфигурационный блок позволяет настраивать функциональность устройства с учетом индивидуальных требований, сохраняя инвариантность важных функций, таких как эмуляция средней кнопки.
Вывод
Понимание взаимодействия между физическими устройствами ввода, их драйверами и использованием утилит конфигурации, таких как Xinput, позволяет легко настраивать необходимые вам параметры. В большинстве случаев, особенно когда настройки на уровне Xinput ограничены, требуется подключение на уровне драйвера и внесение изменений в код, как это было сделано в данной ситуации. Это требует специальных знаний, но в итоге предоставляет гибкость и контроль над устройством, что важно для профессионального использования.