Небольшая прелюдия
Гейминг на linux вполне себе существует, хотя временами он бывает весьма специфическим, но порождает вполне тривиальные запросы, в том числе клавиатурные макросы. Большинство игровых клавиатур имеет программируемые клавиши и софт для них, который работает только под Windows.
Столкнувшись пару раз с потребностью в клавиатурых макросов решил написать небольшой гайд по макросам в играх (и не только) на linux на примере игры Street Fighter V. Гайд написан на основании личного опыта, а значит, те решения, что здесь предложены весьма вероятно не самые лучшие.
Street Fighter V - это добротный файтинг, культовая франшиза с относительно хорошим онлайном. Steam-версия беспроблемно работает через proton (а когда-то анонсировали даже нативную версию для linux). У игры есть некоторая сложность: много хитрых инпутов характерных для японских файтингов, которые традиционно больше ориентированы на рычажок аркадных автоматов и плохо подходят для клавиатур. Файтинги вообще очень требовательны к точности и скорости нажимая клавиш, для достижения хороших результатов потребуется многие десятки часов тренировок, макросы же помогают сохранить время и провести эти самые часы несколько более увлекательно. Однако, если вы планируете посещать оффлайн-турниры этот способ определённо не для вас:)
Инструменты уличного бойца
Итак, для linux-пользователя есть два популярных решения по созданию хоткеев на клавиатуре (и мыши) это использование AutoKey (аналог виндовского AutoHotKey) или xbindkeys. Вообще, вариантов много, например есть XMacro, который умеет макросы и записывать, и воспроизводить, им я не пользовался, но функционал фактически тот же.
AutoKey в целом позволяет легче реализовать сложные комбинации клавиш, работает со скриптами python, имеет нормальный графический интерфейс, но по моим ощущениям у него нестабильная отзывчивость (мы же кибератлеты нам важна latency!) и по большому счёту почти тоже самое можно делать и на чистом питоне (см. ниже).
xbindkeys - это трушная юниксовая утилита, из самых дебрей X сервера, бородатая и угрюмая, зачастую уже установлена на дистрибутиве, но если нет то должна быть репозиториях (как устанавливать смотрите в документации своего дистрибутива).
По умолчанию конфигурационный файл xbindkeys находится в домашней папке, создать его можно с помощью команды:
xbindkeys --defaults > ~/.xbindkeysrc
В этом файле описываются сочетания клавиш - шорткаты. Шорткаты состоит из двух строчек первая строчка это команда, которая выпонится после нажимания клавиш, вторая комбинация клавиш, что-то вроде такого:
"firefox"
c:41 + m:0x10 + release
c:41 - код клавиши,
m:0x4 - модификаторы (control, shift, numlock и прочее)
Код клавиши и модификаторы можно получить нажимая кнопку клавиатуры после команды xbindkeys -k
release - обозначает, что команда шорткат будет срабатывать после того как кнопка отпущена. В нашем случает это важно, так как пока зажаты клавиши шортката другие команды с клавиатуры не проходят. Это особенности реализации xbindkeys. То есть, если наш шорткат запускает макрос клавиатуры, то за то время пока кнопка находится в нажатом положении все нажатия клавиатуры (включая те нажатия, которые генерирует макрос) будут съедаться. Поэтому, если мы создадим шорткат для макроса, но не укажем release, то макрос запустится во время нажатия клавиши (событие keydown) и все команды макроса будут уходить в никуда пока клавишу не отпустить (событие keyup).
В общем, всё очень просто, но в случае каких-то непоняток используйте man xbindkeys ;)
Удар дракона в четверть круга
Но хоткеи это полбеды, нам нужна программа которая эти самые макросы выполнит. Для этого воспользуемся утилитой xdotool.
Но прежде небольшое лирическое отступление. Как упоминалось ранее, для японских файтингов характерно использование управления движения с помощью стика (рычажка аркадного автомата). Два очень характерных инпута для таких игр это так называемые dragon punch (удар дракона) и quarter circle (четверть круга).
Dragon punch (традиционно называется в честь одноимённого приёма каратиста Рю, основного протагониста серии Street Fighter) обозначается в мувлистах (список спецударов) буквой Z со стрелочкой, поэтому так же обозначается как зет-мув, выполняется как вперёд-вниз-вниз+вперёд. Выполнять на клавиатуре не особо удобно и не интуитивно.
Quarter circle для его выполнения необходимо описать дугу в четверть круга стиком аркадного автомата начиная снизу, на клавиатуре выпоняется как вниз-вниз+вперёд-вперёд.
Именно эти два движения мы будем выполнять с помощью макросов в нашем примере.
Итак, xdotool такая же дремучая утилита из глубин X-сервера как и xbindkeys, простая в использовании и без всякого графического интерфейса. В нашем случае удобнее её будет использовать так:
xdotool - < sf5-dp-left.txt
xdotool принимает на вход текстовый файл с командами. Например, я использую WASD для движения (хотя для файтингов имеет смысл использовать пробел для движения вверх), то так будет выглядеть файлик sf5-dp-left.txt:
#!/usr/local/bin/xdotool
keydown --delay 40 a
keyup --delay 15 a
keydown --delay 40 s
keydown --delay 40 a
keyup --delay 1 a
keyup s
keydown значит зажать кнопку,
keyup - отпустить кнопку,
--delay - задержка в миллисекундах до следующей команды, задержки в миллисекундах устанавливаются по вкусу.
Макрос выполняет только нажатие кнопок направления, так как в SFV драгон панч имеет три вариации в зависимости от силы удара и их надо выбирать по игровой ситуации, то я не стал вписывать кнопку удара в макрос, но при желании сюда и его можно вписать .
Точно так же по аналогии будет выглядеть и четверть круга sf5-qc-right.txt:
#!/usr/local/bin/xdotool
keydown --delay 25 s
keydown --delay 25 d
keyup --delay 25 s
keyup --delay 25 d
Далее осталось только повесить данные макросы на неиспользуемые клавиши, например: на q и e левый и правый драгонпанч, на z и c левый и правый четверть круга. Так как файтинги требуют не особо много клавиатурных клавиш, то можно забиндить кучу макросов на все случаи жизни, под любые свои предпочтения.
Заключительный шаг
Однако же, будем честны с собой xbindkeys плохо подходит для файтингов, она в первую очередь предназначена для создания хоткатов повседневного использования. Костыль с "+ release" решает проблему лишь частично, если нажимать кнопки очень быстро, то блокировка клавиатуры почти не заметна, но не для файтингов. Хотя для большинства игр такое поведение даже желательно: нажатия клавиш хоткатов до игры не доходят.
Для решения нашей задачи есть множество вариантов. Но самой простым и наглядным будет взять немного питона.
Вообще почти для каждого языка программирования есть библиотеки для логгирования нажатий клавиш и какой-то принципиальной разницы между ними нет. К слову сказать, для xbindkeys можно делать свои макросы на Lisp, но это удел для самых экзальтированных извращенцев.
Устанавливаем библиотеку keyboard:
pip install keyboard
и создаём нехитрый скрип Питона:
#!/usr/bin/env python3
import keyboard
import os
keyboard.add_hotkey('z', lambda: os.system("xdotool - < /path/to/file/sf5-dp-left.txt"))
keyboard.wait("End")
При нажатии клавиши z срабатывает команда "xdotool - < /path/to/file/sf5-dp-left.txt", подобным образом можно записать все хоткеи, даже какую-нибудь свою компьютерную логику привнести.
keyboard.wait("End") нужно, чтобы не программа сразу не закрывалась.
Вероятно, система потребуется запускать этот скрипт с помощью sudo:
sudo python script_name.py
И на этом, думаю, всё. Подобным же образом можно настроить макросы для любой игры включая те, что запущенны через эмулятор. Да и не только для игр. Гайд, как упоминалось ранее, основан на личном опыте и приведённый здесь способ не идеален, к примеру, можно было заморочиться и обойтись без запуска с sudo, но для меня это совсем не принципиально.