Около недели назад я выложил в открытый доступ проект переключателя клавиатуры LoLo Switcher для оконной среды X11. Принцип работы этого переключателя сильно отличается от общепризнанных архитектурных решений в этой области.
Про архитектуру
Все ныне существующие переключатели раскладки работают только на уровне X11, что весьма православно и гарантирует их использование при удаленном подключении к иксам. Однако эти переключатели имеют застаревшие болячки, вызванные неудачной архитектурой подсистемы событий ввода X11, и часто ограничены в конфигурировании. Переключатель, который работает более-менее стабильно, например старый не совсем добрый xxkb, впринципе не может быть гибко сконфигурирован. А продвинутый xneur спустя шесть лет разработки до сих пор неспособен работать (как бы помягче сказать) в некоторых программах, таких как Kate и Kopete. У разработчиков xneur даже есть рекомендации, как переконфигурировать другие программы (например, XTerm) для того, чтобы они начали работать с xneur. Такой подход уже выходит за рамки здравого смысла. В общем, я не вижу в Linux переключателя клавиатуры, в котором бы гибкость конфигурирования сочеталась бы с безглючностью и беспроблемностью работы.
Любой сторонний наблюдатель скажет, что если за многие годы в X11 так и не появился человеческий переключатель клавиатуры, то что-то не так в самой архитектуре иксов, как минимум в той её части, которая отвечает за события ввода. Да, так и есть. Это признают и сами разработчики X11, и в данный момент подсистема ввода переписывается под именем XInput2. Мне даже предложили еще подождать. Т. е. дождаться когда XInput2 везде станет стандартом де-факто, параллельно с этим влиять на разработчиков XInput2 чтобы они при проектировании учли те проблемы, которые существуют сейчас при написании переключателей клавиатуры. Но я и так ждал тринадцать лет, и мне предлагают подождать еще! Да у меня внуки к тому времени уже появятся.
Принцип работы LoLo Switcher следующий. LoLo Switcher работает как процесс на низком системном уровне, и получает данные от клавиатуры напрямую из файла устройства. Обнаружив нужную последовательность кодов, LLS вызывает функции X11, отвечающие за переключение раскладки.
Я сознательно пошел на создание такой архитектуры, так как при локальном использовании она гарантирует переключение языка в X11 при любых условиях, а ситуаций "в одном окне работает, в другом нет" просто не может быть. Кроме того, мне важна скорость и отзывчивость переключения. По моему мнению, существующие переключатели в X11 работают не так быстро как хотелось бы. Им приходится держать в памяти "модель" клавиатуры, динамически меняя ее при нажатии/отжатии/удерживании обычных клавиш и клавиш-модификаторов по тем обрывочным данным, которые дает интерфейс X11 (а он дает, кстати, не все события, которые генерирует клавиатура, в частности поэтому и приходится воссоздовать картину состояния клавиатуры на "модели"). Кроме того, скорость автоповтора клавиш (который, кстати, есть даже у клавиш-модификаторов), в X11 совершенно другая, нежели заданная в BIOS или непосредственно на самой клавиатуре (да, есть и такие клавиатуры, с треугольничками на функциональных клавишах). Скорость автоповтора в X11 настраивается в любом современном DE, но это никак положительно не влияет на рассинхрон с аппаратной частью клавиатуры, который чуствуется при быстрой работе. А так как автоповтор есть даже на клавишах-модификаторах, которые традиционно используются для переключения раскладки, то мы имеем проблемы рассинхрона и при смене языка, особенно если язык должен переключаться при отжатии клавиши.
В общем мне, как пользователю, совершенно необходим быстрый, низкоуровневый и максимально конфигурабельный переключатель клавиатуры, который можно было бы настроить на любую комбинацию кодов устройства ввода. Поэтому я и реализовал переключатель LoLo Switcher с такой нестандартной архитектурой.
Новый релиз
Сегодня я выпускаю стабильный релиз LoLo Switcher v.0.20.
В этом релизе исправлены серьезные проблемы, которые были в первом публичном релизе, в частности устранена утечка дескрипторов процессов и памяти, которая возникала из-за неправильного запуска bash-команд, прописываемых в опциях CommandX. Внешне это проявлялось в том, что примерно после 500-600 переключений RUS/LAT переключатель вываливался с ошибкой "Failed to create thread to command".
Было проведено обширное тестирование LoLo Switcher через отладчик valgrind, чтобы исключить любые проблемы неправильного выделения памяти, так как переключатель клавиатуры должен работать практически всё время работы компьютера. В настоящий момент valgrind показывает отчет "ERROR SUMMARY: 0 errors from 0 contexts" в любом режиме работы переключателя.
Версия v.0.20 является стабильной, и рекомендована к использованию. Впринципе, на этом этапе возможности LoLo Switcher меня устраивают полностью, и следующих релизов в ближайшее время не предвидится. Всё, что закладывалось в программу, сейчас работает без нареканий, и что-то менять и дорабатывать не вижу никакого смысла.
Спасибо за внимание, успешного вам дня.