Современный индикатор состояния Caps/Num/Scroll Lock на C++17 и Qt. Переосмысление ассемблерной версии — кроссплатформенная, с настраиваемым интерфейсом и анимацией.



Скриншоты интерфейса программы в трее и контекстного меню (все выключены/включен Caps Lock/включены Caps/Num Lock)
- Кроссплатформенность: Windows (WinAPI), Linux (X11/Wayland)
- Гибкая темизация: сторонние наборы иконок без пересборки
- Анимация: плавное «дыхание» иконок при множественных состояниях (время анимации настраивается)
- Умные уведомления: кастомные popup-сообщения с настраиваемым позиционированием, с возможностью переключится на системные (время отображения настраивается)
- Точечное отслеживание: отслеживание каждой из 3 клавиш можно отключить через настройки
- Программное нажатие: включение Caps/Num/Scroll Lock через контекстное меню
- Мультиязычность: русский/английский (требует пересборки после добавления вашего нового
.ts) - Безопасность: предотвращение повторного запуска, определение возможности отслеживая состояния при запуске, отказоустойчивость к отсутствию иконок настроенной темы
- Качество кода: проверено через IWYU, Valgrind и AddressSanitizer
- Невозможно программно включать/выключать клавиши через контекстное меню (нет API)
- Кастомные уведомления фиксированы на экране (обычно в правом верхнем углу)
- Рекомендуется использовать системные уведомления
CapsLoggerV2/
├── docs/ # Скриншоты интерфейса
│ └── THEMES/ # Примеры доп. тем (без пересборки)
├── sources/
│ ├── main.cpp # Точка входа
│ ├── platform/ # Платформенно-зависимая реализация
│ └── gui/ # Qt-интерфейс и настройки
├── translations/ # Файлы переводов .ts
├── resources/ # Иконки в формате .png
├── resources.qrc # Коллекция ресурсов Qt
├── CMakeLists.txt # Cmake конфигурация сборки
├── README.MD
└── LICENSE
- Компилятор с поддержкой C++17
- Qt ≥ 5.9
- CMake ≥ 3.16
- Ninja build (рекомендуется)
| Флаг | Пояснение |
|---|---|
| -DQT_VERSION | версия Qt (5 либо 6, по умолч. ищет старшую версию) |
| -DIWYU_PATH | путь к утилите iwyu ("" - пустая строка в случае когда её вывод не требуется, по умолч. ищет в PATH) |
| -DSTATIC_RUNTIME | включение статической сборки (ON или OFF, по умолч. выключена) |
| -DCMAKE_PREFIX_PATH | Путь к директории установки Qt (напр., у вас есть разные версии для динамической сборки x64 "C:\Qt\5.15.2\msvc2022_64" и для статической x86 "C:\Qt\5.15.2\msvc2022_32_release_mt") |
| -DCMAKE_BUILD_TYPE=Release | оптимизация сборки и отсутствие/наличие отладочных символов |
# Переместиться в директорию локально клонированного репозитория
cd C:\path\to\CapsLoggerV2\repo
# Активировать среду сборки в разной разрядности (x64/x86) - путь зависит от версии
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
# Сгенерировать все требуемые .ts → .qm
lrelease translations/CapsLoggerV2_ru.ts translations/CapsLoggerV2_en.ts
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DQT_VERSION=5 -DIWYU_PATH="" -DCMAKE_PREFIX_PATH=C:\Qt\5.15.2\msvc2022_64
cmake --build buildДля создания портативной версии Windows также можно использовать
windeployqt build/CapsLoggerV2.exe# Минимальные зависимости для сборки на Linux (Debian/Ubuntu)
sudo apt install build-essential cmake ninja-build qtbase5-dev qtbase5-dev-tools qttools5-dev-tools libqt5x11extras5-dev libxtst-dev libxkbfile-dev
# Qt6 если требуется
sudo apt install qt6-base-dev qt6-base-dev-tools qt6-tools-dev-tools# Переместиться в директорию локально клонированного репозитория
cd \path\to\CapsLoggerV2\repo
# Сгенерировать все требуемые .ts → .qm
lrelease translations/CapsLoggerV2_ru.ts translations/CapsLoggerV2_en.ts
# Qt5
cmake -S . -B build-qt5 -G Ninja -DCMAKE_BUILD_TYPE=Release -DQT_VERSION=5 -DIWYU_PATH=""
cmake --build build-qt5
# Qt6
cmake -S . -B build-qt6 -G Ninja -DCMAKE_BUILD_TYPE=Release -DQT_VERSION=6 -DIWYU_PATH=""
cmake --build build-qt6| Платформа | Среда | Qt | Прочий софт |
|---|---|---|---|
| Windows 10 x64 | MSVC 2022, Clang 21.1.8, MinGW 5.3 |
5.9.0 - 5.15.2 (x64 dynamic / x32 static) |
CMake 3.29.2, Ninja build 1.12.0 |
| Ubuntu 24.04 (также с MATE/ KDE/LXQt/Xfce) |
GCC 13.3.0, Clang 18.1.3 |
5.15.3 / 6.4.2 | CMake 3.28.3, Ninja build 1.11.1 |
| Manjaro KDE 26.0.2 |
GCC 15.2.1 | 5.15.18 / 6.10.2 | CMake 4.2.3, Ninja build 1.13.2 |
Бинарник сборки со статическими библиотеками разрядностью x32 успешно протестирована на Windows 7 x32 Дополнительно сборка и запуск были проверены на Linux Mint 22.3 Cinnamon/MATE/Xfce, Lubuntu 24.04.4, AlmaLinux 10.1, Astra Linux 1.6
- Указать qm-файл с переводом в "resources.qrc" по аналогии с translations/CapsLoggerV2_en.qm
- Занести язык перевода в 'enum CapsLoggerLanguage' в "sources/gui/SettingsDefines.h"
- Добавить обработку нового значения enum в функции 'languageName' и 'setAppLanguage' в "sources/gui/SettingsDefines.cpp"
- Запустить обновление файлов переводов, чтобы подхватились новые tr-строки и создать новый .ts-файл:
lupdate sources/ -ts translations/CapsLoggerV2_XX.ts- Перевести вручную строки в Qt Linguist. Для быстрого открытия (указать путь к вашему файлу):
linguist translations/CapsLoggerV2_XX.ts- Скомпилировать ваш
.ts→.qm:
lrelease translations/CapsLoggerV2_XX.ts- Собрать приложение
- Скопируйте папку
THEMES/из папки репозитория 'docs/' рядом с исполняемым файлом - Откройте настройки приложения → раздел "Иконки" пункт "Активная тема"
- Выберите любую из предлагаемых тем для примера
- В папке
THEMES/создайте новую директорию с уникальным названием (например,my-theme) - Использовав содержимое любой существующей темы как шаблон структуры и имен
.pngфайлов сформируйте свой пакет иконок
- Если какая-либо иконка отсутствует, приложение автоматически переключится на встроенную тему
- После добавления новой темы достаточно открыть окно настроек и она отобразится в списке без перезапуска приложения
- Для предпросмотра темы просто выберите ваш пакет иконок из выпадающего списка "Активная тема" в настройках
Если после запуска приложения иконка не появляется в области уведомлений (трее), но сами уведомления приходят — это связано с тем, что современные версии GNOME больше не поддерживают устаревший протокол XEmbed, используемый некоторыми приложениями или старыми версиями Qt. Вместо него используется стандарт StatusNotifierItem (SNI).
Установите и активируйте расширение AppIndicator and KStatusNotifierItem Support, которое обеспечивает обратную совместимость.
# В дистрибутивах на основе Debian / Ubuntu:
sudo apt install gnome-shell-extension-appindicatorgnome-extensions enable appindicatorsupport@rgcjonas.gmail.comКод проекта распространяется под лицензией MIT — см. файл LICENSE
Проект использует фреймворк Qt под лицензией LGPLv3.
