10 октября 2007

Два колеса и пять педалей - катаемся на нестандартных мышках


Неуклюжая получилась бы конструкция, если бы речь шла о велосипеде. В мышках же повышение количества кнопок призвано увеличить удобство использования. Но если дополнительные кнопки не работают и висят балластом, то ни о каком удобстве не может быть и речи. Производители таких мышек комплектуют их программным обеспечением (не для нашей любимой ОС, конечно), позволяющим глобально привязать какое-то одно действие для каждой из дополнительных кнопок. Однако хотелось бы иметь возможность настраивать их поведение в каждом приложении индивидуально, при возможности - штатными средствами. В данной статье вы узнаете, как это сделать.

Прежде всего мы должны убедиться, что X сервер правильно работает с мышкой. Вопросы использования мышек в консоли оставим эстетам, не разделяющим моего мнения о том, что мышка в консоли вообще явление необязательное, тем более такая. Рассмотренная конфигурация - Xorg 7.x, A4 tech WOP-49 (5 нажимаемых кнопок включая одно из колёс, 2 колеса).
Отправляемся в xorg.conf и в соответствующей секции вносим изменения:

Option "Protocol" "ExplorerPS/2"
Option "Buttons" "9"
Option "ButtonMapping" "1 2 3 8 9"
Option "ZAxisMapping" "4 5 6 7"

Первой строчкой указываем протокол, второй - количество кнопок мыши, третьей - нажимаемые кнопки, четвёртой - движения колёс. Как вы видите, боковые кнопки идут после колёс и в случае с одним колесом это могло бы выглядеть так:

Option "ButtonMapping" "1 2 3 6 7"
Option "ZAxisMapping" "4 5"

Итак, все манипуляции с мышью, кроме перемещения, X сервер воспринимает как нажатия кнопок. Соответственно, в моём случае 1,2,3,8,9 обозначают левую, среднюю, правую и две боковые кнопки, а 4,5,6,7 - движения колёс. И именно нажатиями кнопок я буду всё это называть для унификации в дальнейшем.

Запускаем X сервер и убеждаемся, что всё работает правильно. Можно покрутить какой-нибудь документ в книжной ориентации в обоих направлениях. Но окончательный вердикт вынесет утилита xev. При получении каких либо событий она отправляет их описание в консоль. И если на нажатия боковых кнопок в её выводе присутствует button 8 и button 9 (6 и 7 для одноколёсной мыши), значит, всё нормально и кнопки видны X серверу.

Следующая задача - получить возможность назначать произвольное действие боковым (в принципе - любым) кнопкам, по возможности - штатными средствами самих приложений. Очень напоминает горячие клавиши, не так ли? Основная идея в этом и состоит - эмулировать нажатие комбинации клавиш при нажатии кнопки мыши. В дальнейшем мы можем назначить ей в каждом приложении своё действие.

Для этого нам понадобятся xbindkeys и xvkbd из одноименных пакетов. Вся магия будет совершаться при помощи следующих строк в ~/.xbindkeysrc:

"xvkbd -xsendevent -text "\[Control_L]\[KP_Divide]""
b:8
"xvkbd -xsendevent -text "\[Control_L]\[KP_Multiply]""
b:9

То есть боковые кнопки будут эмулировать Ctrl+* и Ctrl+/. Такие комбинации выбраны потому что одной рукой их выполнять неудобно а значит использоваться они будут вряд ли. Комбинацию можете подобрать и сами, воспользовавшись значением keysym для клавиши, определить которое можно при помощи всё той же xev. Запись кода в качестве параметра xvkbd должна выглядеть как \[keysym].
Вот так, слегка пошуршав двумя конфигами, мы добились желаемого.

10 комментариев:

WTakET комментирует...

Здравствуйте! А вот у меня такая же мышь и xev никак не реагирует на вращение второго колесика, не подскажите в чем может быть дело?

PhoeniX комментирует...

это как раз от неправильной настройки xorg.conf. X сервер просто не видит этого колеса. Какая у вас мышка, сколько кнопок/колёс?

WTakET комментирует...

Мышь WOP-49, два колеса, две доп.кнопки. Дистрибутив Debian Etch, xorg-7.1.

PhoeniX комментирует...

значит, у нас одинаковые мышки, пробуйте мой конфиг. Все значимые опции здесь учтены.
Должен также отметить, что через произвольное время работы хсервер перестаёт понимать второе колесо, всё остальное продолжает работать.

WTakET комментирует...

нет, не работает. а xmodmap так и определил у вас 9 кнопок? у меня их почему то 13.

PhoeniX комментирует...

это логически определяется. кнопки в конфиге = кнопки + колёса*2 + нажимаемые колёса

WTakET комментирует...

таким образом мы говорим серверу сколько кнопок он должен обрабатывать, так? Сделал такой же как у вас конфиг, не работает. Смотрю:
wtaket@debian4home:~$ xmodmap -pp
There are 13 pointer buttons defined.

Physical Button
Button Code
1 1
2 2
3 3
4 4
5 5
6 12
7 13
8 8
9 9
10 6
11 7
12 10
13 11
Здесь на 6 и 7 кнопку пробовал назначать как сейчас, 10 и 11, и 6 и 7, все равно xev не видит никаких событий.

PhoeniX комментирует...

xmodmap тут может только всё испортить по вкусу.
у меня он показывает вообще 32. но он не используется.

WTakET комментирует...

а без него не работает, впрочем как и с ним :) . А вот если не указывать кол-во кнопок, пусть сервер не знает что с ними делать, но события то все равно какие-то должны поступать, а у меня нет ничего. В принципе то и не нужен мне этот колес, просто странно как-то, у вас работает у меня нет.

PhoeniX комментирует...

А вы исследуйте. Работайте головой. Получить готовый ответ - ничего не узнать.