libLuna
Biblioteka, na której stoją okna Luny. Rysuje scenę, składa tekst, obsługuje wejście i tłumaczenia. Nie potrzebuje GTK, Qt ani GObject — tylko Rusta i Waylanda.
Odpowiednik: GTK albo Qt.
Projekt libLuna
libLuna to mały toolkit GUI w czystym Rust. Razem ze środowiskiem Luna i kompozytorem Selene tworzy jeden spójny pulpit — od narysowania przycisku po wyświetlenie okna na ekranie. Bez GTK, bez Qt i bez GObject. Po ludzku: mniej warstw, które trzeba omijać.
Czysty Rust · Wayland · MPL-2.0 · bez fontów z CDN i bez trackerów
Trzy warstwy
GTK / GNOME / Mutter. Qt / KDE Plasma / KWin. U nas: libLuna / Luna / Selene. Każda warstwa robi jedną rzecz i nie udaje, że robi wszystkie.
Biblioteka, na której stoją okna Luny. Rysuje scenę, składa tekst, obsługuje wejście i tłumaczenia. Nie potrzebuje GTK, Qt ani GObject — tylko Rusta i Waylanda.
Odpowiednik: GTK albo Qt.
To, co widzisz po zalogowaniu: panel, launcher, ustawienia, pliki, terminal, ekran blokady. Spójna powłoka, w której każdy element mówi tym samym językiem.
Odpowiednik: GNOME albo KDE Plasma.
Kompozytor Wayland. Przyjmuje okna, układa je, rozdaje klawiaturę i mysz, obsługuje monitory i okna X11. Napisany bez smithay — na własnej, cienkiej warstwie.
Odpowiednik: Mutter albo KWin.
Powód
Pomysł nie wziął się z niechęci do GTK. Wziął się z pytania: co, jeśli chcemy pulpit, który jest mały, szybki i w całości nasz?
GTK4 z libadwaitą ciągnie GObject, glib i ręczne liczenie referencji. Dla małego pulpitu to więcej maszynerii, niż naprawdę trzeba.
Wiązania do Rusta dokładają jeszcze jeden mostek, którego trzeba pilnować. My chcieliśmy mniej ruchomych części, nie więcej.
Świetnie nadają się do narzędzi, ale nie modelują powłoki: pasków tytułu z CSD, sidebarów, okruszków ścieżki i popoverów.
Rust od widgetu po kompozytor. Bez dwóch systemów pamięci, bez FFI w środku i bez niespodzianek przy pakowaniu.
Kolory i geometria kontrolek to tokeny, nie stałe rozsiane po widgetach. Motyw zmienia UI bez dotykania kodu.
Mały kod, mały binarny, przewidywalna wydajność. Łatwiej naprawić coś, co da się objąć wzrokiem — i co sami napisaliśmy.
„libLuna nie próbuje być GTK. Próbuje być wystarczająco dobra dla Luny — i tylko tyle.”
Architektura
Cztery poziomy, jeden kierunek zależności. Górne warstwy nie muszą wiedzieć, co robią dolne — i w tym cała sztuczka.
Selene nie musi wiedzieć, że aplikacja używa libLuny. A libLuna nie musi wiedzieć, jak działa DRM. Każda warstwa zna tylko swoją robotę.
Bez ściemy
Projekt jest w ruchu. Wolimy pokazać prawdziwy stan niż obiecywać pulpit, którego jeszcze nie ma.
Pełna, żywa lista protokołów: docs/compositor.md.
Zrzuty
Wszystkie zrzuty pochodzą z działającego kodu — z podglądu offline albo z sesji Selene.
Spróbuj
Potrzebujesz Linuksa, stabilnego Rusta i kompozytora Wayland. Selene możesz uruchomić obok obecnej sesji, bez przejmowania ekranu.
# zbuduj cały workspace i uruchom demo
git clone https://git.paganlinux.eu/luna.git
# albo z mirrora: git clone https://github.com/mijsys/libLuna.git
cd libLuna
cargo build --workspace
cargo run -p luna-demo
# bez kompozytora: wyrenderuj podgląd do PNG
cargo run -p luna-demo --bin render -- docs/images/out.png
/dev/input.Testowo, obok działającej sesji: SELENE_BACKEND=nested selene. Szczegóły są w de/README.md.
# instalacja do katalogu — nic nie rusza systemu
./scripts/install.sh --destdir /tmp/luna-test --prefix /usr
# najpierw zobacz plan, potem zainstaluj na stałe
./scripts/install.sh --dry-run
sudo ./scripts/install.sh --prefix /usr