abstract:
- Как выключить правую кнопку на ClickPad'е
- Что такое сниппеты для X-сервера
- Немного лирики о том, как в линуксе ищут решения проблем.
Вступление
X-сервер в отношении железа у меня обычно вызывает неприязнь. Потому что с одной стороны это нечто жутко консьюмерское и покрытое бесконечными тонкостями поддержки элитных ноутбуков очередного мегазасранца (Linus Loves Nvidia), который и под винды нормальных дров не может сделать, а с другой стороны, это то, что хочется, чтобы работало гладенько и само собой, ибо чинить сломавшийся X-сервер неприятно, особенно, если это единственный рабочий компьютер под рукой.
Впрочем, от лирики к хардкору.
На x220 есть такая замечательная вещь:
Посреди клавиатуры фирменный IBM'овский клитор (трекпоинт), под клавиатурой (над точпадом) кнопки от трекпоинта. Сам точпад второго комплекта кнопок не имеет и является ClickPad'ом — под ним расположена одна кнопка, нажатие которой транслируется либо в левую, либо в правую кнопки в зависимости от того, где было зафиксировано нажатие. Обработка эта софтовая (в драйвере).
Давным давно (~2.6.30) в линуксе поддержку этой штуки сделали кривыми хаками, потом выкинули (~2.6.38). В результате многие ноутбуки (например, уродливый HP, который у меня на работе) остались вообще без правой кнопки мышки.
Недавно привалили апдейты, которые «включили» это. HP такой вещи, наверное, обрадуется, однако, на X220, где есть аппаратные кнопки клитора с правой (и средней) кнопками, меня на 100% устраивало, что кликпад работает только как левая кнопка.
После апдейта я недельку помучился, но так и не привык. Как же этот багфикс выключить нафиг и вернуть на место баг? Я всё время кликал справа, ожидая, что это будет левый клик (потому что палец справа и ещё его шевелить куда-то не хочется).
Поиск
(вместо унылого howto я лучше покажу процесс поиска варианта решения, который не только решил проблему, но вкачал мне несколько малых уровней в linux).
Итак, исходные данные: мы знаем, что это называется 'ClickPad' (нетривиальное знание, кстати, без него ничего толком не найти), мы знаем, что это связано с драйверами точпада, которые называются psmouse.
Первая итерация в гугль привела к мысли, что psmouse тут ни причём (из него выпилили поддержку Clickpad'а и больше не впиливали).
Второй был поиск по ClickPad Linux, который показал во-первых волну любви пользователей линукса к вендорам, а во-вторых навёл на третье ключевое слово — synaptics (драйвер к точпадам и контора, которая к этим драйверам производит точпады).
… Который привёл к команде man synaptics. synaptics is an Xorg input driver. «Ага!» — воскликнули мужики. А дело-то не в ядре… И в этом мане упоминали ClickPad. Бинго? Нет, не бинго. Разумеется man никто целиком не начал читать, и был очередной заход в гугль с более конкретным набором слов: ClickPad synaptics. На удивление, гугль был на редкость невнятен.
Пришлось-таки читать man.… Ок, не читать, а искать по ClickPad [Поиск в man'е, less'е, more'е, vim'е и т.д. — '/', следующее 'n', предыдущее 'N'].
Процитирую найденный раздел целиком:
Option "SoftButtonAreas" "RBL RBR RBT RBB MBL MBR MBT MBB" This option is only available on ClickPad devices. Enable soft button click area support on ClickPad devices. The first four parameters are the left, right, top, bottom edge of the right button, respectively, the second four param‐ eters are the left, right, top, bottom edge of the middle button, respectively. Any of the values may be given as percentage of the touchpad width or height, whichever applies. If any edge is set to 0, the button is assumed to extend to infinity in the given direction. Setting all values to 0 disables soft button areas. Property: "Synaptics Soft Button Areas"
кажется, оно, уныло подумал я.
Почему уныло? Потому что это всё называется xorg.conf, а его существование в системе хорошо описали xkcd'шники:
Если у вас есть xorg.conf, значит что-то в вашей жизни не задалось…
С другой стороны, в ходе гугления, мне несколько раз встретилось слово xorg.conf.d.
[Справка: каталоги вида «имяконфига.d» обычно используются для разделения файла конфигурации на множество мелких, что позволяет каждый логический кусок хранить в отдельном файле, упрощая совместное управление конфигурацией пользователем и приложениями].
… Ещё чуть-чуть гугля, и, внезапно, набираю:
$ find /usr -name "xorg.conf.d" /usr/share/X11/xorg.conf.d
… и там пачка скриптов. В том числе злополучный SoftButtonAreas c значениями 50% и 82%, который и делает эту злобную правую кнопку радикально-экстремистским правым источником социального раздражения.
Джигит может пропатчить файл /usr/share/X11/xorg.conf.d/50-synaptics, но мы не джигиты и пойдём другим путём.
Видимо, мы можем сделать файл таким же образом, но в /etc/X11/xorg.conf.d/ (создав директорию сначала).
Но как его писать?
Cниппеты xorg.conf
Оказывается, в XXI веке человечество не только разучилось ходить по Луне, но ещё и придумало сниппеты для конфига xorg.conf. Которые можно иметь и использовать даже без самого конфига. Читай — чуть больше счастья в этой жизни.
Каждый сниппет позволяет изменить поведение X-сервера в конкретном случае, не изобретая конфига целиком. Каждый сниппет хранит в себе секцию и указание на то, к чему секция относится. Делается это кучей опций, среди которых нас интересует MatchDriver и MatchName. Наша конструкция будет выглядеть примерно так:
Section "InputClass" Identifier "Kill right button off" MatchDriver "synaptics" MatchName "DUNNO" Option "SoftButtonAreas" "0% 0 0% 0 0 0 0 0" EndSection
Мы хотим зафильтровать только точпад конкретной марки (мало ли что и где).
Что нам нужно знать?
MatchDriver — «synaptics», ок. Что в MatchProduct? Читаем man xorg.conf:
MatchProduct "matchproduct" This entry can be used to check if the substring "matchproduct" occurs in the device's product name.
… мдя.
How to know device name
Догадка: dmidecode?
Handle 0x0030, DMI type 21, 7 bytes Built-in Pointing Device Type: Track Point Interface: PS/2 Buttons: 3 Handle 0x0031, DMI type 21, 7 bytes Built-in Pointing Device Type: Touch Pad Interface: PS/2 Buttons: 2
Явно негусто. lspci не катит, lsusb не катит. Interface PS/2…
В man'е к xorg.conf упоминался Matchpnpid. Как посмотреть pnp идентификаторы устройств в системе? Упс. Не знаю. dmidecode точно не кажет. Как? Что? Где?
После некоторого поиска, нашлась замечательная утилита lspnp.
Увы, у нашего точпада невнятный pnpid, который явно нельзя использовать.
Следующая попытка — udev.
udev info --query=name --path=/dev/input/event0
Не знает такого.
Разгребать дамп базы udev'а? (udevadm info --export-db
). То ещё удовольствие.
… А если нам спросить сам X-сервер? Ведь у него ну ооочень подробные логи. Ищем. Находим.
[ 19.078] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/event6) [ 19.078] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "evdev touchpad catchall" [ 19.078] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "touchpad catchall" [ 19.078] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "Default clickpad buttons" [ 19.078] (II) LoadModule: "synaptics" [ 19.078] (II) Loading /usr/lib/xorg/modules/input/synaptics_drv.so [ 19.078] (II) Module synaptics: vendor="X.Org Foundation" [ 19.078] compiled for 1.11.3, module version = 1.6.1 [ 19.078] Module class: X.Org XInput Driver [ 19.079] ABI class: X.Org XInput driver, version 16.0 [ 19.079] (II) Using input driver 'synaptics' for 'SynPS/2 Synaptics TouchPad' [ 19.079] (II) Loading /usr/lib/xorg/modules/input/synaptics_drv.so [ 19.079] (**) SynPS/2 Synaptics TouchPad: always reports core events [ 19.079] (**) Option "Device" "/dev/input/event6" [ 19.080] (II) synaptics: SynPS/2 Synaptics TouchPad: found clickpad property [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: x-axis range 1472 - 5472 [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: y-axis range 1408 - 4448 [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: pressure range 0 - 255 [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: finger width range 0 - 15 [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: buttons: left double triple [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: Vendor 0x2 Product 0x7 [ 19.080] (**) Option "SoftButtonAreas" "50% 0 82% 0 0 0 0 0" [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: touchpad found [ 19.080] (**) SynPS/2 Synaptics TouchPad: always reports core events [ 19.080] (**) Option "config_info" "udev:/sys/devices/platform/i8042/serio1/input/input6/event6" [ 19.080] (II) XINPUT: Adding extended input device "SynPS/2 Synaptics TouchPad" (type: TOUCHPAD, id 10) [ 19.080] (**) synaptics: SynPS/2 Synaptics TouchPad: (accel) MinSpeed is now constant deceleration 2.5 [ 19.080] (**) synaptics: SynPS/2 Synaptics TouchPad: MaxSpeed is now 1.75 [ 19.080] (**) synaptics: SynPS/2 Synaptics TouchPad: AccelFactor is now 0.040 [ 19.080] (**) SynPS/2 Synaptics TouchPad: (accel) keeping acceleration scheme 1 [ 19.080] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration profile 1 [ 19.080] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration factor: 2.000 [ 19.080] (**) SynPS/2 Synaptics TouchPad: (accel) acceleration threshold: 4 [ 19.080] (--) synaptics: SynPS/2 Synaptics TouchPad: touchpad found [ 19.081] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/mouse0) [ 19.081] (**) SynPS/2 Synaptics TouchPad: Ignoring device from InputClass "touchpad ignore duplicates"
Всё прямо текстом и написано.
Название SynPS/2 Synaptics TouchPad.
Howto
Пишем свой конфиг:
/etc/X11/xorg.conf.d/1-kill-right-button-x220:
Section "InputClass" Identifier "Kill right button off" MatchDriver "synaptics" MatchName "SynPS/2 Synaptics TouchPad" Option "SoftButtonAreas" "0% 0 0% 0 0 0 0 0" EndSection
Перезапускаем x-сервер (перезагружаемся) — и, вуаля, всё работае… то есть неработает как надо.
Автор: amarao