Владельцы этих устройств знают, что почти все мыши Logitech стоимостью выше 10$ имеют не 3 кнопки, а целых 5 — колесико может наклонятся влево и вправо. Для Windows существует замечательная программа Logitech® SetPoint™, которая позволяет использовать дополнительные клавиши манипулятора почти как угодно. Вот уже 5 лет я использую их для изменения уровня общей громкости. Но, к сожалению, подобного продукта для Linux компания Logitech не создала. Под катом — история о том, как самому исправить этот недостаток.
Мое первое знакомство с Linux началось 4 года назад. Тогда, в целом, меня все устраивало, но “дьявол кроется в деталях”, и именно из-за них я тогда так и не смог полностью отказаться от Windows. Не помню всего, что тогда раздражало, но отчетливо помню, что настроить изменение громкости дополнительными клавишами моей мыши так и не удалось.
Прошло 4 года и я снова столкнулся с Linux. За это время интерфейсы широко шагнули вперед, но та, старая проблема, так и не была решена. Но за эти года я понял, что если под линукс чего-то нет, то его можно написать самому! Именно этим я и решил заняться в свободный от работы вечер.
Немного теории. Каждое устройство в системе Linux представляется в виде файла в директории /dev, например, для моей мыши это — /dev/hidraw0. Через этот файл можно отправлять данные, записывая в файл, или же принимать данные, читая этот файл, чем мы и будем заниматься.
Итак, открываем любимую среду разработки (впрочем, можно и консоль), и пишем программу, которая будет выводить то, что отправляет мышь:
#include <iostream> #include <fstream> int main () { // Открываем файл std::fstream filestr ("/dev/hidraw0", std::fstream::in); char input; while(true) { // Считываем и выводим по одному байту filestr.read(&input,1); std::cout << static_cast<int>(input) << " "; } // Если вечный цикл вдруг кончится, закрыть файл мы обязаны filestr.close(); return 0; }
После этого компилируем, запускаем и щелкаем колесиком влево-вправо, посматривая на вывод. У меня он был таким:
0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 0 0 0 0 -1 0 0 0 0 0 1 0 1 0 0 0 0 0 5 0 0 0 0 0 4 0 0 0 0
Видим, что при каждом изменении своего состояния мышь отправляет 6 байт. При боковых нажатиях клавиш мышь отправляет “0 0 0 0 0 -1” (влево) и “0 0 0 0 0 1” (вправо). Теперь можно написать простой парсер:
#include <iostream> #include <fstream> int main () { std::fstream filestr ("/dev/hidraw0", std::fstream::in); char input[6]; while(true) { filestr.read(input,6); if (input[0] == 0 && input[1] == 0 && input[2] == 0 && input[3] == 0 && input[4] == 0) { if (input[5] == -1) std::cout << "left" << std::endl; else if (input[5] == 1) std::cout << "right" << std::endl; } } filestr.close(); return 0; }
Компилируем, проверяем работоспособность. Если все работает так, как надо, можна назначать на левое и правое нажатие исполнение любых команд, которые нам понравятся. Я назначил переключение громкости:
#include <iostream> #include <fstream> #include <stdlib.h> int main () { std::fstream filestr ("/dev/hidraw0", std::fstream::in); char input[6]; while(true) { filestr.read(input,6); if (input[0] == 0 && input[1] == 0 && input[2] == 0 && input[3] == 0 && input[4] == 0) { if (input[5] == -1) system("amixer set Master 5%- > /dev/null"); else if (input[5] == 1) system("amixer set Master 5%+ > /dev/null"); } } filestr.close(); return 0; }
Осталось только добавить этот файл в автозагрузку, и дело сделано. Можно сделать это через консоль, но, как я уже писал, “интерфейсы широко шагнули вперед” и теперь (по крайней мере, в моей Ubuntu) есть автоматический запуск приложений. Открываем его, прописываем путь к скомпилированной программе — и дело сделано.
ссылка на оригинал статьи http://habrahabr.ru/post/160101/
Добавить комментарий