GTK4 панель на Go для Wayland + Niri WM
  • Go 76.6%
  • SCSS 17.1%
  • Shell 5.8%
  • Makefile 0.4%
  • Dockerfile 0.1%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
plafon e1c23d3f25
All checks were successful
Release / Build and release (push) Successful in 5s
Build check / Build Niti (push) Successful in 15m51s
fix: полная дефолтная палитра colors.scss (стили при первом запуске)
2026-08-16 23:31:08 +02:00
.forgejo/workflows CI: добавить evolution-data-server-devel в build/release (календарь EDS) 2026-08-16 01:18:30 +02:00
.github/workflows Niti: Material 3 GTK4 panel for Wayland + Niri 2026-06-12 11:07:01 +02:00
cmd fix: type-to-launch двойной ввод + акцент из обоев 2026-08-16 12:49:58 +02:00
config QuickCenter: DND/power-mode/airplane toggles; календарь + Google Calendar интеграция 2026-08-14 20:50:51 +02:00
data/screenshots readme: обновлён первый скриншот Quick Menu 2026-08-15 19:43:21 +02:00
internal fix: полная дефолтная палитра colors.scss (стили при первом запуске) 2026-08-16 23:31:08 +02:00
modules fix: type-to-launch двойной ввод + акцент из обоев 2026-08-16 12:49:58 +02:00
scripts Add install.sh, README, release workflow 2026-06-12 12:27:04 +02:00
styles Уведомления QC: убран hover заголовка стопки, кнопки ближе к углу; пилюли disk/vitals без фикс. min-width (ширина по контенту) 2026-08-16 09:25:27 +02:00
tests Фаза 4: единый JSON-конфиг — panel/panel.json + zones.json + widgets.json 2026-08-07 15:59:59 +02:00
.gitignore Добавлен .gitignore для локальных файлов 2026-08-07 17:09:34 +02:00
.golangci.yml Niti: Material 3 GTK4 panel for Wayland + Niri 2026-06-12 11:07:01 +02:00
CHANGELOG.md Панель: hover кнопок подтверждения и пунктов трей-меню + фокус окна по «Открыть» 2026-08-15 21:36:04 +02:00
Containerfile calendar: события из EDS/GOA вместо gcal OAuth; клики месяц/день → GNOME Calendar; hover и отступы 2026-08-15 18:20:26 +02:00
go.mod QuickCenter: DND/power-mode/airplane toggles; календарь + Google Calendar интеграция 2026-08-14 20:50:51 +02:00
go.sum QuickCenter: DND/power-mode/airplane toggles; календарь + Google Calendar интеграция 2026-08-14 20:50:51 +02:00
install.sh Add ~/.local/bin to PATH in systemd unit 2026-06-12 14:38:00 +02:00
Makefile Фаза 8: ленивые модули (RegisterLazy) + Фаза 9: PGO в сборке 2026-08-07 16:59:55 +02:00
README.md панель: QC-сетка 2×4, уведомления, трей, точка-разделитель, диски/vitals, BT-автоподключение 2026-08-15 23:08:57 +02:00
VERSION fix: locale-aware desktop file parsing for app descriptions 2026-08-04 20:22:06 +02:00

Niti

Wayland-панель для тайлового скроллинг-композитора Niri. Написана на Go с использованием gotk4 (Go-биндинги GTK4) и gtk4-layer-shell. Быстрая работа, мгновенный отклик и минимальное потребление ресурсов. Создано специально для ALT Atomic Niri и выступает там в качестве нативного псевдо-шелла по аналогии с gnome-shell. Структура полностью модульная, в будущем с полной свободой включения/отключения модулей и виджетов, а также полной заменой их порядка по усмотрению пользователя.

Панель Niti

Quick Menu Quick Menu (другая тема) Quick Menu (другая тема)

Что это

Niti — это панель плюс набор окон-компаньонов для Niri: лаунчер приложений, быстрое меню, уведомления, OSD-индикаторы, меню выключения, календарь. Всё рисуется как нативные Wayland-слои (layer-shell) и управляется через IPC Niri. Сам композитор и сессию Niti не заменяет — работает рядом с ними.

Почему Go

Преимущество Что это даёт
Один статический бинарник мгновенный запуск, нет интерпретатора и рантайма в памяти
Нативная скорость и низкий расход памяти быстрее и легче JS/TS-шеллов (Ags/Astal на GJS) и Python-обёрток
Горутины конкурентность из коробки: D-Bus-сервисы, Niri IPC, MPRIS, трей работают параллельно без ручного управления потоками
Типобезопасность gotk4 полный доступ к GTK4/libadwaita с проверкой типов на этапе компиляции
PGO сборка с профилем реального использования (make pgo-build) — дополнительное ускорение горячих путей

Итог: панель стартует за миллисекунды, в простое почти не нагружает CPU и держит минимальный RAM — в отличие от шеллов на JavaScript и Python.

Возможности

Панель (Bar)

Панель с виджетами в трёх зонах — левая, центр, правая. Состав по умолчанию:

Зона Виджеты
Левая Рабочие столы, Таскбар
Центр Часы, Медиа
Правая Горячие клавиши, Инфо о системе, Диски, Системный монитор (CPU/RAM/temp), Питание, Раскладка, Трей, Быстрое меню

Состав зон и параметры виджетов меняются в ~/.config/niti/config.json. В коде есть и дополнительные виджеты, не включённые по умолчанию: запись экрана (PipeWire), заряд периферии (клавиатура/мышь/геймпад) — подключаются добавлением в конфиг.

Окна и оверлеи

Модуль Что делает
Launcher запуск приложений (Mod+D): парсинг .desktop, поиск, закреплённые приложения (пин-бар)
QuickCenter быстрое меню: медиаплеер + компактные переключатели (Не беспокоить, режим питания, авиарежим)
OSD всплывающие индикаторы громкости и яркости
Notifications встроенный демон уведомлений (с поддержкой DND)
PowerMenu меню выключения / перезагрузки / выхода
Settings окно настроек панели и модулей
Calendar календарь-попап (клик по часам), интеграция с Google Calendar
AppGrid сетка установленных приложений
Corners скруглённые углы экрана
Hotkeys оверлей со списком горячих клавиш

Архитектура

cmd/niti/main.go          — точка входа, single-instance (unix-сокет), IPC-команды
config/                   — загрузка конфига, старт модулей
internal/
  app/                    — GTK Application, жизненный цикл
  css/                    — компиляция SCSS (sass), hot-reload стилей
  services/               — D-Bus / IPC-бэкенды (niri, audio, mpris, …)
  widgets/                — обёртки над GTK-виджетами
  panel/ window/ types/ reactive/
modules/                  — окна: bar, launcher, quickcenter, osd, …
  widgets/                — виджеты бара + manifest.json (динамическая конфигурация)
styles/                   — 19 SCSS-файлов, компилируются при запуске

Стили написаны на SCSS и компилируются в рантайме (internal/css), поэтому тему можно менять «на лету» через ~/.config/niti/colors.scss (Material 3).

Сервисы — интеграции с системой

Каждый источник данных — отдельный сервис, общающийся через D-Bus или IPC:

niri (IPC Niri), audio (PipeWire), mpris (медиаплееры), network (NetworkManager), bluetooth (BlueZ), backlight (яркость), upower (питание/батарея), systemtray (SNI), notifications (демон уведомлений), applications (парсинг .desktop), wallpaper (обои), udisks (диски), pwrec (запись экрана), abooster (интеграция с Atomic Booster), eds (Evolution Data Server), gcal (Google Calendar).

Системные интеграции: systemd и D-Bus

systemd

Панель сама работает как пользовательский сервис niti.service (ExecStart=/usr/bin/niti, WantedBy=graphical-session.target) — сессия запускает её вместе с графическим окружением. Других сервисов панель при старте не поднимает; через systemctl выполняются только явные действия пользователя:

  • Меню выключения (PowerMenu): systemctl reboot / poweroff / reboot --firmware-setup, перезапуск панели systemctl --user restart niti.
  • Виджет питания: управление планировщиком scx_lavd (systemctl start/stop scx_lavd).

D-Bus

Шина Сервис Для чего
System org.freedesktop.NetworkManager Wi-Fi/сети
System org.bluez Bluetooth
System org.freedesktop.UPower питание/батарея периферии
System org.freedesktop.UDisks2 диски
Session org.mpris.MediaPlayer2 медиаплееры (бар + Quick Center)
Session org.freedesktop.Notifications Niti регистрирует это имя — является демоном уведомлений
Session org.kde.StatusNotifierItem + com.canonical.dbusmenu системный трей (иконки + меню)
Session org.plafonlinux.AtomicBooster интеграция с Atomic Booster
Session org.gnome.evolution.dataserver.Calendar (через libecal) события календаря (EDS/GOA)

Прочие IPC

  • Niri — собственный IPC через unix-сокет ($NIRI_SOCKET): окна, воркспейсы, события, действия.
  • PipeWire — управление громкостью через CLI pactl (pipewire-pulse).
  • Niti ↔ Niti — single-instance через unix-сокет niti.sock (команды --open-window, --toggle-window и т.д.).

Установка

curl -fsSL https://altlinux.space/plafonlinux/Niti/raw/branch/main/install.sh | bash

Установщик сам определит ветку ALT (Sisyphus или p11), поставит нужные зависимости и соберёт панель.

Сборка и разработка

git clone https://altlinux.space/plafonlinux/Niti.git
cd Niti
make            # собрать бинарник в bin/niti
make install    # установить в ~/bin/niti + стили

Зависимости для сборки:

  • Go 1.23+, GCC (нужен CGo для gotk4)
  • libgtk4-devel, libgtk4-layer-shell-devel
  • pipewire-libs-devel

Конфигурация

Файл Назначение
~/.config/niti/config.json настройки панели и модулей
~/.config/niti/colors.scss цвета (Material 3)
~/.config/niti/styles/ скомпилированные CSS-стили

Профилирование и производительность

make run            # запуск с pprof на :6060
make pgo-capture    # собрать профиль (30 секунд использования)
make pgo-build      # пересборка с PGO-оптимизацией
make profile-flame  # flame-graph
make profile-top    # top горячих функций