- Vala 71.1%
- Python 25.5%
- Meson 2.7%
- Dockerfile 0.5%
- Shell 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
EnableUnitFiles/DisableUnitFiles передавали string[] литералом прямо
в Variant("(asbb)", ...) — маршалинг массива ломался, g_variant_new
получал NULL вместо GVariantBuilder, и tuner падал с сегфолтом
(подтверждено coredump: libtuner-niti-power.so). Массив юнитов теперь
собирается через VariantBuilder и подставляется как @as.
|
||
| .forgejo/workflows | ||
| build-aux/altlinux | ||
| data | ||
| src | ||
| tests | ||
| .gitignore | ||
| CHANGELOG.md | ||
| Containerfile | ||
| meson.build | ||
| README.md | ||
| screenshot.png | ||
TunerNitiPower
Плагин Tuner для Atomic Niri с русской вкладкой «Питание». Визуальная
структура перенесена из панели panels/power GNOME Settings 51.0:
BreakpointBin, ViewStack с переключателем страниц, группы libadwaita,
батареи/UPS, подключённые устройства, режимы питания и энергосбережение.
Дополнительно есть отдельная страница настроек экрана блокировки Seni с
таймаутом, фоном, размытием и цветовой схемой.
В группе «Подключённые устройства» периферия UPower классифицируется теми же
правилами, что и Quick Center NitiVala (mouse, keyboard, controller и
hidpp_battery), и отображается GNOME-подобной полосой уровня, статусом и
значком зарядки. Группа «Быстрое меню» управляет фильтрами периферии и блоком
peripheral-battery; отдельный переключатель управляет niti-power в
zones.right панели. Кнопка «Применить» атомарно сохраняет оба JSON-файла и
перезапускает пользовательскую службу niti.
Логика написана на Vala. UPower и power-profiles-daemon вызываются напрямую
через асинхронный D-Bus с GCancellable; GNOME Shell,
gnome-settings-daemon и GDM не требуются. Конфигурация Tuner хранится в
~/.config/niti-vala/power.json, а интеграция простоя Niri — в
~/.config/niri/idle.kdl.
Сборка
Нужны Meson, Vala, GTK4, libadwaita, json-glib, libpeas/Tuner и blueprint-compiler:
meson setup build
meson compile -C build
meson test -C build
python3 -m pytest -q
Сборка компилирует четыре Blueprint-шаблона в .ui и упаковывает их через
GResource. src/power-model.vala не зависит от GTK и содержит разбор UPower,
allowlist профилей/object paths, форматирование времени и безопасный конфиг;
его компиляция закреплена pytest-контрактом. tests/power-gtk-smoke создаёт
страницу в GTK4 под Xvfb.
На системе без встроенной батареи батарейные группы и строка процента заряда не
показываются; внешние батареи и устройства UPower остаются в соответствующих
списках. Режимы performance, balanced и power-saver отображаются с теми же
русскими названиями и описаниями, что и портированная строка GNOME Settings 51.0.
Для проверки JSON-моделей и классификации периферии используются pytest и
Vala-тест power-model-test; GTK smoke-тест требует Xvfb.
Безопасность
Нет shell-строк и запуска команд из пользовательского ввода. Значения
профилей, object paths, таймауты и пути обоев проверяются; конфигурационные
каталоги создаются с mode 0700. D-Bus подписки и async backend’ы
отменяются/снимаются в dispose().
Замены GNOME
GNOME-настройки org.gnome.settings-daemon.plugins.power,
org.gnome.desktop.session и org.gnome.desktop.interface заменены
пользовательским Vala-конфигом и Niri idle.kdl. Переключение профилей и
порогов зарядки выполняется через UPower/power-profiles-daemon, включая
сообщения PerformanceDegraded. GNOME Shell Brightness и SensorProxy
заменены capability-настройкой, потому что в Niri нет совместимого GNOME
session-сервиса. Экран блокировки перенесён на Seni; системный
/etc/seni/greeter.json намеренно не изменяется без polkit/systemd helper.
Настройки часов Seni в текущем контракте Seni отсутствуют, поэтому отдельные элементы часов не добавляются. Caffeine не дублируется: его inhibit-сервис уже принадлежит NitiVala, но публичного клиентского D-Bus API для управления из Tuner пока нет.
