Делаем работу с мышью Logitech в Linux комфортнее

от автора

Среди читателей Хабра наверняка много тех, кому нравится компания Logitech и кто пользуется ее продуктами. Сегодня речь пойдет о мышах этой фирмы, а точнее, о расширении их функциональности при работе ОС Linux.

Владельцы этих устройств знают, что почти все мыши 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *