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

в 18:44, , рубрики: c++, linux, logitech, метки: ,

Среди читателей Хабра наверняка много тех, кому нравится компания 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) есть автоматический запуск приложений. Открываем его, прописываем путь к скомпилированной программе — и дело сделано.

Автор: tsymbaliuk

Источник

Поделиться

* - обязательные к заполнению поля