Ну, может это не совсем драйвер, и модули ядра мы тут писать не будем. Но я расскажу простой и удобный, а главное — рабочий способ заставить работать дополнительную клавишу у данной мыши так, как она должна работать, а не нажимать каждый раз сочетание WIN+R и ввод текста: rwww.win2.cn/g9 или кцццюцшт2юст.п9.

На днях сломалась, верой и правдой, служившая мне долгих 6 лет моя любимая мышь. Я, разумеется, расстроился и просидел эти пару дней в Терминале без гуи, ибо в современном гуи делать без мышки нечего. И вот, вчера я приобрел — показавшуюся мне достаточно удобной мышь — A4Tech G9-500F. Честно скажу — выбирал в магазине долго и главным критерием было удобство «лежания» мыши в руке. Но, как и на большинстве аксессурах сейчас, на тыльной стороне коробки было написано, что нормальная работа гарантируется только вместе с ОС Windows. «Какая жалость )» — усмехнулся я, и купил эту мышь 🙂 Я был полностью уверен, что в моем любимом Xubuntu она поднимется без проблем — так и произошло.

Но оказалось, что в Linux не работает дополнительная кнопка на мыши, которая по умолчанию подразумевает двойной клик. И не то, чтобы не работает, а еще хуже — посылает системе сигнал о нажатии WIN+R и вводит адрес сайта, где можно скачать на нее драйвер, разумеется, только для Windows. Покопавшись в интернете еще немного я нашел лишь советы удалить Линукс, или вернуть мышь в магазин. Но это не труЪ-way подумал я, ведь мышь мне понравилась и я не собирался отказываться от ее использования только потому, что компания-производитель не позаботилась выпустить драйвер для A4Tech G9-500F. Вместо этого я решил реализовать поддержку дополнительной клавиши сам, чего бы мне это не стоило )

Начал я, разумеется с формирования взгляда на нажатие «не правильной» кнопки системой. Сначала, признаться, хотел просто повесить опрееленное действие на нажатие комбинации WIN(META)+R, но это проблемы не решило ибо адрес сайта, вбиваемый мышью продолжал докучать, вводясь во все формы ввода, да еще и вызывая определенные сбои в системе. Тогда я решил узнать, как видит мою мышь система, используя команду в терминале:

$ xinput --list 
Вывод:
? Virtual core pointer                    	id=2	[master pointer  (3)]
?   ? Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
?   ? A4TECH USB Device                       	id=9	[slave  pointer  (2)]
?   ? A4TECH USB Device 			id=8	[slave  pointer  (2)]
...

Да, именно так. Система почему-то видела мышь — как два экземпляра мыши, один — сама мышь, второй — злосчастная кнопка. Но оказалось мне только на руку. Следующим действием я просто отключил ввод этой кнопки. Опытным путем я выяснил, что id кнопки у меня — 8 (следующей же командой):

$ xinput --disable 8

(Включить — xinput —enable 8)
Так стало гораздо комфортней и легче на душе. Но теперь при нажатии кнопки не происходило вообще ничего, что достаточно сильно расстраивало ибо, раз есть кнопка, то ей хочется пользоваться. И я пошел копаться в /dev/input/ :

$ ls /dev/input/
by-id    event0  event10  event2  event4  event6  event8  js0   mouse0
by-path  event1  event11  event3  event5  event7  event9  mice

Предполагается, что один из event’ов — это наше устройство — чудо-кнопка. Для более комфортного поиска я установил удобную утилиту — evtest:

sudo apt-get install evtest

Запускать ее нужно от Рута:

$ sudo evtest        
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:	Power Button
/dev/input/event1:	Power Button
/dev/input/event2:	AT Translated Set 2 keyboard
/dev/input/event3:	A4TECH USB Device
/dev/input/event4:	A4TECH USB Device
...
Select the device event number [0-11]:         

И так я узнал (ну, правда оставалось опять же опытным путем выяснить, какой ивент — 3 или 4), какой ивент мне необходимо слушать для отлова нажатия на клавишу, а слушать я буду с помощью той же утилиты — evtests:

sudo evtest /dev/input/event3

Итак, после нажатия, как я увидел — в событие появлется самым первым — нажатие на Win(meta)-key:

Event: time 1405347461.943455, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e3
Event: time 1405347461.943455, type 1 (EV_KEY), code 125 (KEY_LEFTMETA), value 1

Вот по данному событию я и буду отлавливать нажатие на клавишу, ведь, хоть в xinput я и отключил ее, но в события нажатия все-равно идут.

Для того, чтобы заставить чудо-кнопку на G9-500F в Linux так, как заумывал разработчик мыши (двойной клик ЛКМ), который не удосужился написать для моей любимой ос драйвер — я написал следующий элементарный скрипт:

#!/bin/bash

evtest /dev/input/event3 | awk '/KEY_LEFTMETA\), value 1/ {system("xdotool click --repeat 2 1")}'

Скрипт необходимо запускать от Рута. Желаю тебе удачи, если у тебя A4Tech G9-500F и Linux — не отчаивайся, как видишь — все оказывается не так сложно, если попытаться решить проблему, а не относить годный девайс в магазин — ты же не ламер какой в конце концов. Да прибудет с тобой сила! 🙂

Как получать event кнопки автоматически

В ходе работы с данным скриптом выяснилось, что номер event’а нашей кнопки в /dev/input может изменяться и тогда необходимо переписывать в скрипте его номер, чтобы evtest отслеживал именно кнопку, а не что-то другое.

Чтобы автоматизировать процесс необходимо немного изменить исходный скрипт.

Для начала через xinput —list как и описано выше получаем id устройства (у меня это 8), затем вписываем этот id в следующий, немного измененный скрипт из статьи:

#!/bin/bash

tEvent=$(xinput --list-props 8 | grep -oE "event+[0-9]{1,3}")
evtest /dev/input/$tEvent | awk '/KEY_LEFTMETA\), value 1/ {system("xdotool click --repeat 2 1")}'

В скрипте там, где «—list-props 8» — 8 (восьмерка) это какраз ID устройства, полученный опытным путем (как в статье) с помощью xinput.
После указания своего id скрипт будет всегда сам получать event кнопки и подставлять его в evtest.

Полностью автоматизированный скрипт

Точно подходит для мышки g9-500f.

Благодарим нашего читателя — MAP4yK за достойный вклад в развитие данного скрипта.

#!/bin/bash

sleep 5
for Id in $(xinput --list | grep  "A4TECH USB" | grep -oE "id=[0-9]{1,2}" | grep -oE "[0-9]{1,2}")
do
if [ "$(xinput --list-props $Id | grep -oE "\"Rel Horiz Wheel\"")" ]
then
buttonId=$Id
fi
done
sleep 5
xinput --disable $buttonId
sleep 5
tEvent=$(xinput --list-props $buttonId | grep -oE "event+[0-9]{1,3}")
evtest /dev/input/$tEvent | awk '/KEY_LEFTMETA), value 1/ {system("xdotool click --repeat 2 1")}'

Дополнение:
Меня спрашивали, как добавить получившийся скрипт в автозапуск?
Я сделал так:

 

sudo nano /etc/sudoers 

В конец файла /etc/sudoers дописал:

ALL ALL=NOPASSWD: /home/mike/bin/mouse.sh

/home/mike/bin/mouse.sh — это полный путь к скрипту.

Потом просто добавил в стандартном меню настроек->сеансы и запуск->автозапуск команду: sudo /home/mike/bin/mouse.sh

Скриншот меню автозапуска с xUbuntu:

Не забудь, что если скрипт стартует с системой — в него также необходимо добавить вызов xinput —disable id (чтобы каждый раз не прописывать это вручную). Вот так выглядит скрипт у меня сейчас (для примера):

bin/bash

sleep 5
for Id in $(xinput --list | grep  "A4TECH USB" | grep -oE "id=[0-9]{1,2}" | grep -oE "[0-9]{1,2}")
do
if [ "$(xinput --list-props $Id | grep -oE "\"Rel Horiz Wheel\"")" ]
then
buttonId=$Id
fi
done
sleep 5
xinput --disable $buttonId
sleep 5
tEvent=$(xinput --list-props $buttonId | grep -oE "event+[0-9]{1,3}")
evtest /dev/input/$tEvent | awk '/KEY_LEFTMETA), value 1/ {system("xdotool click --repeat 2 1")}'

Кстати, если даешь скрипту право на исполнение от ROOT без пароля — проследи, чтобы у него не было права на запись (на всякий случай).