Ну, может это не совсем драйвер, и модули ядра мы тут писать не будем. Но я расскажу простой и удобный, а главное — рабочий способ заставить работать дополнительную клавишу у данной мыши так, как она должна работать, а не нажимать каждый раз сочетание 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 без пароля — проследи, чтобы у него не было права на запись (на всякий случай).
Здравствуйте! ___123___Мышь A4Tech G9-500F — драйвер для Ubuntu — Maddot IT&FOSS___123___