Отображение кнопок Xinput и эмуляция средней кнопки

Вопрос или проблема

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

Оцените материал
Добавить комментарий

Капча загружается...