# pagan-toolkit Własna, minimalna biblioteka UI dla **Waylanda** — bez Qt, GTK, SCTK i iced. Rysuje okno bezpośrednio **Cairo** do bufora **`wl_shm`**, a rolę okna realizuje przez surowe `xdg-shell` + `xdg-decoration`. To część PaganDE: mały, czytelny punkt startowy dla okienek i paneli DE. ## Co jest w środku | Moduł | Odpowiedzialność | | --- | --- | | `src/lib.rs` | Re-exporty publicznego API. | | `src/window.rs` | `MyToolkitWindow`: model, hit-testing, hover, `render_to_buffer`, `handle_mouse_click`, `handle_mouse_motion`, `resize_edge_at`. | | `src/draw.rs` | Prymitywy Cairo: `rounded_rectangle`, `draw_circle_button`, `draw_titlebar`, `draw_menu_button`, `draw_window_controls`, `clear_transparent`. | | `src/shm.rs` | Alokacja `memfd`/`tempfile` + `memmap2` + `wl_shm` pool/buffer (`ShmBuffer` trzyma `File` i `MmapMut` razem). | | `src/connection.rs` | `wayland-client`: registry, role `xdg_surface`/`xdg_toplevel`, dekoracje, pętla zdarzeń. | | `src/input.rs` | `wl_seat`/`wl_pointer`: hover, klik, serial z button-press, `xdg_toplevel.move`/`resize`. | | `src/i18n.rs` | Minimalna lokalizacja PL/EN (`PAGAN_LANG`). | | `examples/demo.rs` | Działające okno 800×500. | ## Wygląd * Ciemny motyw. * Pasek tytułu **40 px**. * „Menu" po lewej i Zamknij/Minimalizuj/Maksymalizuj po prawej leżą na **tej samej** osi `Y = 20.0` (stała `TITLEBAR_CONTROL_CENTER_Y`). * Zaokrąglone rogi okna, **promień 12 px**, tło przezroczyste (`alpha = 0`) poza zaokrągleniem. * Przyciski jako okręgi, kolor zależny od hover. ## Wymagania * Linux z Waylandem (kompozytor PaganDE — albo dowolny inny). * **Świeży toolchain Rust.** `cairo-rs 0.22` jest budowany w edition 2024 i wymaga nowego `rustc` (≈ 1.85+). Jeśli masz starszy kompilator, w `Cargo.toml` zejdź do `cairo-rs = "0.20"` i zweryfikuj miejsca oznaczone `// API-NOTE`. * Systemowe biblioteki: `pkg-config`, `libcairo2-dev` (nagłówki Cairo). ### Instalacja Rust (rustup) ```sh curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source "$HOME/.cargo/env" rustup update stable ``` ### Zależności systemowe (Debian/Ubuntu) ```sh sudo apt install build-essential pkg-config libcairo2-dev ``` ## Budowanie ```sh cargo build # biblioteka cargo build --examples # biblioteka + demo ``` ## Uruchomienie demo na naszym kompozytorze Na kompozytorze PaganDE (lub dowolnym innym) — wskaż socket Waylanda przez `WAYLAND_DISPLAY`: ```sh WAYLAND_DISPLAY=wayland-1 cargo run --example demo ``` Jeśli uruchamiasz demo z sesji, w której Wayland już działa, `WAYLAND_DISPLAY` jest zwykle ustawione automatycznie i wystarczy: ```sh cargo run --example demo ``` ## Język interfejsu Ustaw `PAGAN_LANG`: ```sh PAGAN_LANG=pl cargo run --example demo PAGAN_LANG=en cargo run --example demo ``` Nieznana wartość → angielski. Dodanie nowego napisu to jeden wariant w `MsgKey` i dwa stringi w `tr()` (`src/i18n.rs`). ## Poziom logów ```sh RUST_LOG=debug cargo run --example demo ``` ## Znane ograniczenia (wersja 0.1) * Menu jest tylko sygnalizowane (`WindowAction::ShowMenu` → log), bez rozwijanego popupu. * Brak obsługi klawiatury, dotyku i wielu seatów. * Brak `wl_surface.frame` (brak animacji/throttlingu) — przerysowanie tylko na żądanie. * Bufor SHM jest pojedynczy (bez podwójnego buforowania). * Bufor tworzymy przez `tempfile`; dla pełnej zgodności ze specyfikacją `wl_shm` warto użyć `memfd_create` + pieczęć `F_SEAL_SHRINK` (patrz `// API-NOTE` w `src/shm.rs`). ## Licencja MIT.