Как переназначить кнопки dpi в Linux (на примере мыши MX1100)

Давно пользуюсь многокнопочной мышью Logitech MX1100. В Windows на отдельные её кнопки настроены различные сочетания клавиш, это позволяет сделать стандартное ПО SetPoint. К сожалению, Logitech не выпускает этой программы под Linux.

Есть много способов переназначить кнопки (сделать маппинг), но вот проблема: кнопки изменения dpi не распознаются в системе. Точнее, они только и могут, что менять dpi, а вот, например, программа xev не выдаёт вообще ничего при их нажатии.

Logitech MX1100 g_hack

Решение нашлось тут: http://askubuntu.com/questions/117149/disabling-remapping-logitech-g400-mouse-dpi-buttons.

Мне повезло: скрипт оказался написанным именно под мою мышь (Logitech MX1100), хотя изначально вопрос задавался про другую (Logitech G400). Повезло вот почему. Хотя там и описано решение для прочих моделей, но на практике его применять трудно — нужно снимать дамп обмена данными с помощью WireShark и анализировать его. Но основная проблема в том, что для той же самой MX1100 мой дамп отличается от представленного, причём даже размером блоков. На счастье, всё сработало и так.

Короче говоря, что нужно сделать

  1. Скопировать отсюда скрипт в любой файл, например, g_hack.c.
  2. Изменить его под своё устройство:
    1. Добавить последовательность байтов для своей модели (см. выше, где про WireShark; для меня этот пункт оказался необязательным). Подробности тут.
    2. Изменить значения определений:
      #define VENDOR 0x046d /* для фирмы Logitech */
      #define MOUSE_G5 0xc041 /* для мыши модели G5 */
      #define MOUSE_MX1100 0xc526 /* для мыши модели NX1100 */

      и так далее. Айди производителя и модели мыши можно узнать с помощью команды lsusb. Она выведет все USB-устройства; выбираете строчку для вашего, в ней нужные данные разделены двоеточием, например: 046d:c526

  3. Компилируем:
    cc -o g_hack g_hack.c
  4. Запускаем от имени root:
    sudo g_hack

    Скорее всего, команда выдаст ошибку, в которой будет сказано, какие параметры мы не указали. Например:
    Logitech g_hack
    Перезапускаем g_hack с нужными параметрами (экспериментируйте):
    Logitech g_hack

  5. Проверяем, начали определяться кнопки или нет. Сделать это можно с помощью команды xev. С помощью этой же утилиты узнаём коды кнопок мыши.
  6. Назначаем нужные команды на кнопки. Для этого есть масса утилит, включая графические. Я пользовался btnx, но вообще для Logitech советуют lomoco. Сейчас пользуюсь связкой xbindkeys и xte (она же Xaut, она же в прошлом Xautomation).
  7. По желанию автоматизируем запуск g_hack при старте системы.
Коды клавиш моей мыши
1 Левая кнопка
2 Средняя кнопка (нажатие колеса)
3 Правая кнопка
4 Колесо вперёд
5 Колесо назад
6 Колесо влево
7 Колесо вправо
8 Назад (боковая)
9 Вперёд (боковая)
10 Зум (боковая)
13 +DPI
14 -DPI