Commit 34b681d
0
files
+0
added
-0
deleted
@@ -1,89 +0,0 @@
1
-# Architektura libLuny
2
-
3
-Nazewnictwo projektu (analogia do GTK / GNOME / Mutter):
4
-
5
-| Warstwa | Odpowiednik GNOME | Odpowiednik KDE | Nasza nazwa |
6
-|---|---|---|---|
7
-| Toolkit (biblioteka) | GTK | Qt | **libLuna** |
8
-| Środowisko / powłoka | GNOME | KDE Plasma | **Luna** |
9
-| Kompozytor Wayland | Mutter | KWin | **Selene** |
10
-
11
-## 1. Warstwy (mapowanie pojęć GTK/GDK/Gsk/libadwaita → libLuna)
12
-
13
-| Rola | Odpowiednik w GTK/Adw | Moduł libLuny | Stan |
14
-|---|---|---|---|
15
-| Prymitywy: geometria, kolor, skala, zdarzenia, tokeny | grunt/pango types | `libluna-core` | ✅ M0 |
16
-| Rysowanie 2D, buforowanie, clip | Gsk (+Cairo) | `libluna-render` | ✅ M0 |
17
-| Tekst: shaping, metryki, rasteryzacja | Pango | `libluna-render::text` (fontdue) | ✅ M0 (docelowo cosmic-text) |
18
-| Warstwa platformy / okna / wejście | GDK | `libluna-platform` | ✅ M0 |
19
-| Silnik układu (measure/allocate) | GtkLayoutManager | `libluna-layout` | ⏳ M2 |
20
-| Widgety bazowe | Gtk* | `libluna-widgets` | ⏳ M2–M3 |
21
-| Zestaw „libadwaita” (Card, HeaderBar, Sidebar…) | libadwaita | `libluna-adwaita` | ⏳ M4–M5 |
22
-| Pętla zdarzeń i aplikacja | GtkApplication / GMainLoop | `libluna-app` | ⏳ M4 |
23
-
24
-Fasada `libluna` (crate `crates/libluna`) zbiera warstwy w jedno wejście dla aplikacji.
25
-
26
-## 2. Decyzja (podjęta): czysty Rust
27
-
28
-Wybraliśmy **czysty Rust**, bez GObject/glib i bez GTK/Qt. Uzasadnienie:
29
-
30
-- **Lekkość**: brak runtime glib/gobject; statycznie linkowany, mały zestaw zależności.
31
-- **Bezpieczeństwo**: zarządzanie pamięcią przez kompilator zamiast ręcznego refcountingu.
32
-- **Nowoczesny toolchain**: `cargo` + `clippy` + `rustfmt`.
33
-- **Integracja**: kompozytor Selene jest zwykłym serwerem Wayland, więc wystarczy standardowy
34
- protokół (`xdg-shell`, a dla paneli `wlr-layer-shell`).
35
-
36
-Rozważane, odrzucone alternatywy:
37
-
38
-- **C + GObject + Cairo/Pango** — natywne dla obecnego KartONDE i najtańsze w migracji, ale
39
- zostaje w świecie glib i wciąga ciężki GObject.
40
-- **Rust + C ABI / mostek GObject** — daje nowoczesny rdzeń, lecz dodaje dwie granice FFI.
41
-
42
-## 3. Rysowanie i tekst
43
-
44
-- **Graf sceny** (`libluna-render::scene`) jest niezależny od backendu; budują go widgety.
45
-- **Backend M0**: CPU (`tiny-skia`) z antyaliasingiem — kształty, zaokrąglenia, obramowania,
46
- linie, clip. Bufor RGBA8888 trafia w `wl_shm` (konwersja do BGRA/`Argb8888`).
47
-- **Tekst M0**: `fontdue` (font Adwaita Sans z systemu). To świadome uproszczenie — bez
48
- kerningu i pism złożonych. Docelowo `cosmic-text` (shaping, fallback fontów), bez zmiany
49
- kontraktu `measure`/`draw`.
50
-- Później: opcjonalny backend GPU i śledzenie uszkodzeń (damage) do minimalizacji odświeżeń.
51
-
52
-## 4. Model widgetu (wspólny dla wszystkich warstw)
53
-
54
-```
55
-Widget:
56
- measure(constraints) -> Size // faza 1: ile chce
57
- allocate(rect) // faza 2: gdzie trafia
58
- draw(scene, theme) // rysowanie sceny
59
- handle(event) -> Handled | Propagate // wejście
60
- focus/grab/hover state
61
-```
62
-
63
-- Layout: dwuprzebiegowy **measure/allocate** (jak GTK/Flutter) — przewidywalny i prosty.
64
-- Wejście: jedno drzewo zdarzeń, propagacja od liści wzwyż, fokus klawiatury, grab wskaźnika.
65
-
66
-## 5. Komunikacja z kompozytorem (Selene)
67
-
68
-- Okna aplikacji: `xdg-shell` z dekoracjami po stronie klienta (CSD) — sami rysujemy HeaderBar.
69
-- Panele/powłoka: `wlr-layer-shell` (jak `karton-shell`).
70
-- Do rozważenia później: `xdg-decoration`, `fractional-scale-v1`, `viewporter`,
71
- `foreign-toplevel-management` (integracja z panelem zadań), `idle-inhibit`.
72
-- Buforowanie: start od `wl_shm` (CPU), później opcjonalny backend EGL/`wl_drm`.
73
-
74
-## 6. Motywowanie
75
-
76
-- Tokeny: `spacing` (3/6/12/18/24), `radius` (6/9/12/pill), `typography`
77
- (title/heading/body/caption), **metryki kontrolek** (`Metrics`) oraz palety `light`/`dark` + `accent`.
78
-- Warstwa „adwaita-look”: karty, listy, nagłówki, przyciski, przełączniki — zgodne
79
- wizualnie z makietami.
80
-- Geometria kontrolek nie jest już stałą w widgetach — wynika z `Theme::metrics`, więc styl
81
- steruje też rozmiarami (HeaderBar, Switch, Button…).
82
-- Opcjonalnie później: mini-podzbiór CSS po klasach stylu; tokeny mają pierwszeństwo.
83
-
84
-## 7. Świadomie odłożone (poza MVP)
85
-
86
-- Dostępność: AT-SPI (przez D-Bus) — niezbędna dla realnego pulpitu, ale faza późniejsza.
87
-- IME / `text-input-v3`, klawiatura wirtualna.
88
-- Schowek (`wl_data_device`), drag & drop.
89
-- Animacje i easing, backend GPU.
90
0
deleted file mode 100644
@@ -1,55 +0,0 @@
1
-# Selene — protokoły i droga do pełnego kompozytora
2
-
3
-Selene nie używa Smithery: protokół obsługujemy własną warstwą na `wayland-server`.
4
-Ten plik jest **żywą listą** tego, co już działa, i tego, co jeszcze dzieli nas od
5
-kompozytora, na którym codzienna praca nie wymaga obejść.
6
-
7
-## Działa
8
-
9
-| Protokół / funkcja | Uwagi |
10
-|---|---|
11
-| `wl_compositor` v4 | `wl_surface`, regiony, damage, frame-callbacki |
12
-| `wl_subcompositor` v1 | powierzchnie potomne: `sync`/`desync`, pozycja, kolejność stosu, składanie z alfą |
13
-| `wl_shm` v1 | ARGB/XRGB/ABGR/XBGR → RGBA, pula z `resize` |
14
-| `wl_output` v4 | geometria, tryb, skala 1×, nazwa, `done` |
15
-| `wl_seat` v5 | pointer + keyboard, `frame`, powtórzenia klawiszy, XKB (pl/en/de) |
16
-| `wl_data_device_manager` v3 | schowek i drag & drop wewnątrz sesji |
17
-| `xdg_wm_base` v1 | toplevel, popup, pełny `xdg_positioner` (kotwica, grawitacja, flip/slide) |
18
-| `zxdg_decoration_manager_v1` | polityka: zawsze SSD (albo `LUNA_CLIENT_DECORATIONS=1`) |
19
-| `zwlr_layer_shell_v1` v4 | panele, tło, OSD; region wejścia z alfy |
20
-| `zwlr_foreign_toplevel_manager_v1` v3 | pasek zadań: tytuł, stan, aktywacja, zamknięcie |
21
-| `ext_workspace_manager_v1` | przestrzenie robocze |
22
-| `xwayland_shell_v1` + XWM | okna X11, `_NET_WM_STATE`, ramki, menu X11 |
23
-| `xdg_surface.set_window_geometry` | widoczny prostokąt vs bufor z cieniami CSD |
24
-| multi-monitor | obszary robocze per wyjście, panel rezerwuje miejsce tylko u siebie |
25
-
26
-## Braki — kolejność wg wpływu na codzienną pracę
27
-
28
-1. **`xdg_activation_v1`** — przenoszenie fokusu przy uruchamianiu z portali/paska.
29
- Bez tego nowe okno bywa za innym i trzeba go szukać.
30
-2. **`wl_pointer.set_cursor` + `wp_cursor_shape_v1`** — własne kursory klienta
31
- (I-beam, łapka, strzałki resize). Dziś zawsze rysujemy kursor systemowy.
32
-3. **`zwp_primary_selection_v1`** — wklejanie środkowym przyciskiem (terminale).
33
-4. **`zwp_pointer_constraints_v1` + `zwp_relative_pointer_v1`** — gry, mouselook,
34
- blokada kursora.
35
-5. **`zwp_text_input_v3` + input-method** — IME (CJK, kompozycja znaków).
36
-6. **`wp_viewporter` + `wp_fractional_scale_v1`** — skalowanie 1,25/1,5× bez rozmycia.
37
-7. **`zwp_linux_dmabuf_v1`** — zero-copy z GPU. **Największa luka:** klienty Vulkan/EGL
38
- (Zed natywnie na Waylandzie, hardware video) potrzebują importu dmabuf (GBM/EGL),
39
- a nasz renderer jest CPU. Do zaplanowania razem z back-endem GPU.
40
-8. **`zwp_idle_inhibit_v1`** — odtwarzacze wideo i prezentacje nie pozwalają wygasić ekranu.
41
-9. **`wp_tearing_control_v1`** — brak vsync dla gier (opcjonalnie).
42
-10. **`xdg_toplevel` v2+** — `wm_capabilities`, `configure_bounds`, stan `tiled`;
43
- dziś ogłaszamy v1, więc klienty nie dostają pełnej informacji o kafelkowaniu.
44
-11. **`buffer_scale` / `buffer_transform`** — całkowite HiDPI i obrót ekranu.
45
-12. **`ext_session_lock` / screencopy** — blokada sesji i zrzuty ekranu aplikacji.
46
-
47
-## Znane problemy do zbadania
48
-
49
-- **Zed przez XWayland potrafi „zjeść” cały rdzeń** (97% CPU, kilka GB RAM) mimo
50
- poprawnego UI. Podejrzenie: pętla `ConfigureNotify`/expose w XWM albo brak
51
- `_NET_WM_SYNC_REQUEST`. Do reprodukcji na izolowanej sesji z `DISPLAY` Xwaylanda.
52
-- X11: model okna używa rozmiaru bufora (z 2 px obramowaniem X11), więc po
53
- maksymalizacji szerokość bywa o 2 px większa niż ekran. Kosmetyczne.
54
-- `xdg_popup` nie obsługuje jeszcze `reposition`/`reactive` (przestawianie już
55
- otwartego menu przy zmianie rozmiaru rodzica).
56
0
deleted file mode 100644
57
1
Binary files a/docs/images/demo-montage.png and /dev/null differ
58
2
deleted file mode 100644
59
3
Binary files a/docs/images/demo-step-1.png and /dev/null differ
60
4
deleted file mode 100644
61
5
Binary files a/docs/images/demo-step-10.png and /dev/null differ
62
6
deleted file mode 100644
63
7
Binary files a/docs/images/demo-step-11.png and /dev/null differ
64
8
deleted file mode 100644
65
9
Binary files a/docs/images/demo-step-12.png and /dev/null differ
66
10
deleted file mode 100644
67
11
Binary files a/docs/images/demo-step-13.png and /dev/null differ
68
12
deleted file mode 100644
69
13
Binary files a/docs/images/demo-step-14.png and /dev/null differ
70
14
deleted file mode 100644
71
15
Binary files a/docs/images/demo-step-15.png and /dev/null differ
72
16
deleted file mode 100644
73
17
Binary files a/docs/images/demo-step-16.png and /dev/null differ
74
18
deleted file mode 100644
75
19
Binary files a/docs/images/demo-step-2.png and /dev/null differ
76
20
deleted file mode 100644
77
21
Binary files a/docs/images/demo-step-3.png and /dev/null differ
78
22
deleted file mode 100644
79
23
Binary files a/docs/images/demo-step-4.png and /dev/null differ
80
24
deleted file mode 100644
81
25
Binary files a/docs/images/demo-step-5.png and /dev/null differ
82
26
deleted file mode 100644
83
27
Binary files a/docs/images/demo-step-6.png and /dev/null differ
84
28
deleted file mode 100644
85
29
Binary files a/docs/images/demo-step-7.png and /dev/null differ
86
30
deleted file mode 100644
87
31
Binary files a/docs/images/demo-step-8.png and /dev/null differ
88
32
deleted file mode 100644
89
33
Binary files a/docs/images/demo-step-9.png and /dev/null differ
90
34
deleted file mode 100644
91
35
Binary files a/docs/images/gallery.png and /dev/null differ
92
36
deleted file mode 100644
93
37
Binary files a/docs/images/icons.png and /dev/null differ
94
38
deleted file mode 100644
95
39
Binary files a/docs/images/layout-nord.png and /dev/null differ
96
40
deleted file mode 100644
97
41
Binary files a/docs/images/layout.png and /dev/null differ
98
42
deleted file mode 100644
99
43
Binary files a/docs/images/luna-desktop.png and /dev/null differ
100
44
deleted file mode 100644
101
45
Binary files a/docs/images/luna-launcher-carousel.png and /dev/null differ
102
46
deleted file mode 100644
103
47
Binary files a/docs/images/luna-launcher-grid.png and /dev/null differ
104
48
deleted file mode 100644
105
49
Binary files a/docs/images/luna-launcher-list.png and /dev/null differ
106
50
deleted file mode 100644
107
51
Binary files a/docs/images/luna-logo.png and /dev/null differ
108
52
deleted file mode 100644
109
53
Binary files a/docs/images/luna-osd.png and /dev/null differ
110
54
deleted file mode 100644
111
55
Binary files a/docs/images/luna-panel-idle.png and /dev/null differ
112
56
deleted file mode 100644
113
57
Binary files a/docs/images/luna-popup-calendar.png and /dev/null differ
114
58
deleted file mode 100644
115
59
Binary files a/docs/images/luna-popup-session.png and /dev/null differ
116
60
deleted file mode 100644
117
61
Binary files a/docs/images/luna-popup-volume.png and /dev/null differ
118
62
deleted file mode 100644
119
63
Binary files a/docs/images/luna-popup-wifi.png and /dev/null differ
120
64
deleted file mode 100644
121
65
Binary files a/docs/images/new-widgets.png and /dev/null differ
122
66
deleted file mode 100644
123
67
Binary files a/docs/images/quick-panel.png and /dev/null differ
124
68
deleted file mode 100644
125
69
Binary files a/docs/images/settings-dark.png and /dev/null differ
126
70
deleted file mode 100644
127
71
Binary files a/docs/images/settings-de-dark.png and /dev/null differ
128
72
deleted file mode 100644
129
73
Binary files a/docs/images/settings-fr.png and /dev/null differ
130
74
deleted file mode 100644
131
75
Binary files a/docs/images/settings-light.png and /dev/null differ
132
76
deleted file mode 100644
133
77
Binary files a/docs/images/settings-nord.png and /dev/null differ
134
78
deleted file mode 100644
135
79
Binary files a/docs/images/settings-paper.png and /dev/null differ
136
80
deleted file mode 100644
137
81
Binary files a/docs/images/styles.png and /dev/null differ
138
82
deleted file mode 100644
139
83
Binary files a/docs/images/widgets.png and /dev/null differ
140
84
deleted file mode 100644
@@ -1,246 +0,0 @@
1
-# Roadmap libLuny
2
-
3
-Kamienie milowe są ułożone tak, aby **każdy kolejny etap dał się uruchomić i zobaczyć**,
4
-a na końcu odtworzył realne aplikacje środowiska Luna z makiet.
5
-
6
-## M0 — Fundament (szkielet + pierwsze okno) — ✅ UKOŃCZONE
7
-- Struktura workspace (cargo), build, `clippy`, `rustfmt`, testy.
8
-- `libluna-core`: geometria (`Point/Size/Rect/Insets`), kolor, skala ekranu, typy zdarzeń,
9
- tokeny stylu (spacing/radius/typografia/paleta light+dark).
10
-- `libluna-render`: graf sceny + backend CPU (`tiny-skia`), tekst (`fontdue`), clip, linie.
11
-- `libluna-platform`: połączenie Wayland, `xdg-shell` (CSD), bufor `wl_shm`, `calloop`,
12
- wejście (`seat`, `xkbcommon`), resize/skala, zamknięcie okna.
13
-- **Efekt:** okno z HeaderBar-em (tytuł + `[—] [□] [✕]` + „burger”), rysowane CSD, oraz scena
14
- makiety Ustawień. Render offline do PNG w obu motywach: `docs/images/settings-*.png`.
15
-- Do weryfikacji na żywo: uruchomienie na kompozytorze Selene (`cargo run -p luna-demo`).
16
-
17
-## M0.5 — Wielojęzyczność i wygląd — ✅ UKOŃCZONE
18
-- `libluna-i18n`: system tłumaczeń bez gettext (klucz = angielski napis). **Każdy język w osobnym
19
- pliku** `i18n/<kod>.lang` (wbudowane pl/en/de przez `include_str!`) oraz doładowywanie
20
- w runtime z `~/.config/luna/i18n`, `~/.local/share/luna/i18n`, `/usr/share/luna/i18n`;
21
- wykrywanie z `LANG`/`LC_*`, globalne przełączanie, `languages()`/`language_name()`, makro `t!`.
22
-- `libluna-core`: `ThemePreference` (Auto/Jasny/Ciemny), `Accent` (9 kolorów), `ThemeSettings`
23
- z rozwiązywaniem motywu i zapisem do `~/.config/luna/theme.conf`.
24
-- `libluna-platform`: zdarzenia wejścia (wskaźnik, klawiatura, scroll) przekazywane do `Frame`;
25
- sterowanie motywem z aplikacji (`set_preference`/`set_accent`) z natychmiastowym przerysowaniem.
26
-- `luna-demo`: interaktywny panel wyglądu (segmenty trybu, paleta akcentów, wybór języka),
27
- chowanie **paska dolnego** i **paska bocznego** oraz przeciąganie jego krawędzi (drag, 150–460 px);
28
- skróty `l`/`a`/`g`/`b`/`s`; zrzuty w kilku językach/motywach w `docs/images/`.
29
-
30
-## M1 — Render
31
-- Graf sceny: prostokąty, zaokrąglone prostokąty, obcinanie (clip), cień, obrazy/ikony SVG.
32
-- `libluna-text`: shaping/układanie (Pango albo cosmic-text), fallback fontów, ellipsis.
33
-- `damage`/częściowe odświeżanie.
34
-
35
-## M2.5 — Widgety (start) — ⏳ W TOKU
36
-- `libluna-widgets`: widgety wielokrotnego użytku w modelu immediate — `ViewSwitcher`, `NavList`,
37
- `Menu` (popover `☰`), `Button` (warianty + chevron), `Switch`, `Slider`, `DropDown`
38
- (rozwijany przez `Menu`), `HeaderBar` (pasek tytułu z kontrolkami okna), `TabBar`/`TabView`
39
- (zakładki: pasek + model stron), `BottomSheet` (dolny panel modalny), `Pager` (karuzela stron),
40
- `PathBar` (okruszki), `Entry` (pole tekstowe) i `SearchEntry` (wyszukiwanie na jego bazie),
41
- `ItemView` (pliki/katalogi: siatka
42
- lub lista) i `ScrollView` (przewijanie), oraz `Stepper`, `CheckButton` i `RadioGroup`
43
- (krokowiec, checkbox, wybór jednokrotny); do tego `Card` i `ActionRow` (karty i wiersze
44
- ustawień), `Toast` (powiadomienie nakładkowe z akcją), `StatusPage` (ekran stanu: ikona,
45
- tytuł, opis, akcja — np. „pusty stan” listy), `Spinner` (wskaźnik zajętości), `Tooltip`
46
- (dymek podpowiedzi) i `Banner` (pasek komunikatu z akcjami); wspólny `PaintCtx`; testy
47
- hit-testingu bez okna.
48
-- **Galeria libadwaita pokryta**: `Avatar`, `ShortcutLabel`, `ToggleGroup`, `SplitButton`, `Bin`;
49
- `Row` (switch/combo/expander/entry/password/spin/slider/button/nav) + `PreferencesGroup`/
50
- `PreferencesPage`; `Dialog` + `AlertDialog`/`AboutDialog`/`ShortcutsDialog`/`PreferencesDialog`;
51
- `NavigationView`/`NavigationSplitView`/`OverlaySplitView`/`Sidebar` (`Carousel` = `Pager`);
52
- `ToolbarView`, `WindowTitle`, `Clamp`, `WrapBox`, `BreakpointBin`, `ButtonContent`.
53
-- **Galeria GTK4 pokrywana partiami** (partia 5–10): prezentacja `Label`, `Separator`,
54
- `ProgressBar`, `LevelBar`, `Frame`, `Revealer`, `Overlay`, `AspectFrame`; przyciski
55
- `ToggleButton`, `LinkButton`, `ColorButton`; pola specjalne `PasswordEntry` (maskowanie +
56
- „oko”) i `EditableLabel`; kontenery `CenterBox`, `Grid`, `Fixed`, `Paned`, `Stack`,
57
- `ActionBar`, `PopoverMenuBar`; dalej `MenuButton`, `SearchBar`, `Expander`, `Statusbar`,
58
- `Calendar`, `Image`, `TextView`, `Popover`, `ColumnView`, `Assistant`, `Scrollbar`/
59
- `Adjustment`, `ColorChooser`, `FlowBox`, `SpinButton`, `EmojiChooser`, `NavigationRail`,
60
- `Viewport`, `WindowHandle`; aliasy GTK4 `ScrolledWindow` = `ScrollView`,
61
- `StackSwitcher` = `ViewSwitcher`, `Notebook` = `TabView`, `ListBox` = `NavList`.
62
- Doszły odpowiedniki GTK4: `InfoBar` (4 rodzaje + zamknięcie), `Picture` (`ContentFit`:
63
- contain/cover/fill/fit-width/fit-height) i `MediaControls` (play/pauza + pasek postępu +
64
- czasy); podgląd: `cargo run -p luna-demo --bin new-widgets` → `docs/images/new-widgets.png`.
65
-- **Pakiet ikon symbolicznych** (`libluna-widgets::icon`): `IconName` + `paint_icon`,
66
- 28 ikon rysowanych wektorowo w naszym stylu (Menu/Search/Files/Settings/Terminal/Music/
67
- Star/Clock/Store/Edit/Wifi/Volume/Battery/Power/Grid/List/Carousel/…). Zestaw jest
68
- **wyliczalny** (`IconName::ALL` + `IconName::name()`), a cały pakiet ma galerię-podgląd:
69
- `cargo run -p luna-demo --bin icons` → `docs/images/icons.png` (motyw jasny i ciemny).
70
- Renderer zyskał prymitywy: `fill_circle`, `stroke_circle`, `stroke_polyline`, `fill_polygon`
71
- (z zaokrąglonymi końcami). Ikony użyte w panelu, launcherze oraz w OSD i powiadomieniach
72
- Luny (zamiast glifów fontu).
73
- Tokeny metryk kontenerów: `Theme::metrics.container`. Animacje: `libluna-core` `motion`
74
- (`Easing`, `lerp`, `Animation`), użyte w `Stack` (przejścia `StackTransition`), `Revealer`,
75
- `Toast`, `BottomSheet` i `Pager` (sterowane `advance(dt, …)`).
76
-- **Edycja tekstu**: `Entry`/`SearchEntry`/`PasswordEntry`/`TextView` mają **zaznaczanie**
77
- (`set_selection`, `select_all`, zakres, Shift+strzałki/Ctrl+A) oraz operacje schowka
78
- (`copy`/`cut`/`paste`); `TextInput` rozszerzono o metody zaznaczania.
79
-- `libluna-platform`: realne akcje okna z `Frame` (`close`/`minimize`/`toggle_maximize`).
80
- **Klatki animacji**: `Frame::delta_time()` + `Frame::request_frame()` (płynne ~60 Hz, gdy trwa
81
- animacja; bez tego okno odświeża się tylko na zdarzenia).
82
-- Demo używa widgetów zamiast ręcznego rysowania (pasek boczny, wybór motywu/widoku, menu `☰`,
83
- przycisk „Opcje”, przełączniki, suwak, wybór języka, pasek tytułu, zakładki `TabBar`/`TabView`).
84
- Powiadomienie (`Toast`) w demo animuje się (wjazd + fade), zmiana zakładki
85
- to animowane przejście (`Stack` slide), a dolny panel wysuwa się i karuzela „przyciąga”.
86
-- **Galeria widgetów** headless: `cargo run -p luna-demo --bin gallery` → `docs/images/gallery.png`
87
- (kontenery, tabela, kalendarz, chooser’y, kreator kroków, pasek stanu z cz. 5–12).
88
-- Motywy: wariant (light/dark/auto) + akcent, z trwałością. **Component metrics**: rozmiary
89
- i paddingi kontrolek wyniesione z widgetów do tokenów (`Theme::metrics`), więc styl steruje
90
- też geometrią (README, „Własny wygląd”).
91
-- Układ: **retencyjne drzewo `measure`/`allocate`** (`libluna-widgets::layout`) — `Node`
92
- (`VBox`/`HBox`, `Padding`, `Expanded`, `Center`, `Spacer`, `Label`, `Fixed`), `Constraints`,
93
- `Layout::fit`; przykład karty złożonej z drzewa (`bin/layout.rs` → `docs/images/layout.png`).
94
-- **Style instalowane z plików**: `libluna-core::theme_file` (`ThemePatch`, klucze kropkowe,
95
- `available_themes()`, nakładanie na bazę), trwały wybór stylu w `ThemeSettings` (`theme.conf`),
96
- przykłady `examples/luna/themes/*.theme`, podgląd przez `render/layout --theme`.
97
-- Wybór stylu w UI: menu `☰` → „Styl” (lista `available_themes()`, „Domyślny” + style z plików),
98
- stosowany na żywo i zapisywany w `theme.conf`; `LUNA_THEMES_DIR` dla dev/testów.
99
-- Podgląd motywów (headless): `bin/styles` renderuje realny interfejs w kilku stylach i składa
100
- montaż (`docs/images/styles.png`) — odpowiednik „okna podglądu”.
101
-- `TabBar`: przewijanie przy przepełnieniu (scroll + przyciski chevron na krawędziach, wybór
102
- zawsze widoczny).
103
-- `luna-demo` używa drzewa układu: karty i ich wiersze liczy `measure`/`allocate`.
104
-- Dalej: **okno podglądu na żywo w aplikacji**, stany (disabled/focus/pierścień fokusu),
105
- `Separator`/`Spacer` jako widżety, kolejne kamienie (M1 render, M3 listy).
106
-
107
-## M2 — Układ + widgety bazowe
108
-- Dwuprzebiegowy silnik measure/allocate — ✅ **częściowo** (silnik + kontenery `VBox`/`HBox`,
109
- `Padding`, `Expanded`, `Center`, `Spacer`, `Label`; do zrobienia: migracja demo i zaokrąglenia API).
110
-- `Box` (h/v), `Label`, `Icon`, `Button`, `Separator`, `Spacer`.
111
-- Stany: hover/pressed/disabled/focus + pierścień fokusu klawiatury.
112
-
113
-## M3 — Sterowanie i listy
114
-- `Switch`, `Slider`, `CheckButton`, `RadioButton`, `Entry`, `DropDown`, `Stepper`.
115
-- `ScrollView`, `ListView`, `GridView` (siatka kafelków) z zaznaczaniem i aktywacją.
116
-- `Sidebar` (sekcje + wiersze z ikonami, grupy rozwijane).
117
-
118
-## M4 — „Chrome” okna
119
-- `Window`, `HeaderBar` (slot start/center/end), `WindowControls` (`— □ ✕`).
120
-- `MenuButton` + `Popover` (menu „burger”: pozycje, separatory, skróty, podmenu).
121
-- `TabBar` / `ViewSwitcher` (segmentowy: Lista | Siatka).
122
-- `PathBar` (okruszki z `>` i `▾`), `SearchBar`/`SearchEntry`.
123
-- Bottom bar / pasek statusu.
124
-
125
-## M5 — Zestaw „adwaita”
126
-- `Card` (nagłówek sekcji + wiersze), `ActionRow` (tytuł/podtytuł + suffix).
127
-- `PreferencesGroup`, `Banner`, `Toast`, `StatusPage`.
128
-- `Spinner`, `Tooltip`, ikony symboliczne motywowane.
129
-
130
-## M6 — Odtworzenie makiet (cel!)
131
-- **Luna Settings** — panel boczny (Przegląd/Zaawansowane), karty z `Switch`/`DropDown`/
132
- `Slider`, pasek akcji, pasek statusu.
133
-- **Luna Files** — HeaderBar z `PathBar` + wyszukiwarką + przełącznikiem widoku + kontrolkami
134
- okna, panel boczny (Miejsca/Urządzenia/Sieć), widok siatki, popover opcji/sortowania,
135
- bottom bar z wolnym miejscem.
136
-
137
-## M7 — Migracja z GTK4
138
-- Najpierw `karton-settings` (mniejszy, `window.c` ~590 linii + strony) — strona po stronie.
139
-- Potem `karton-files` (`window.c` ~5100 linii) — etapami.
140
-- Opcjonalnie ujednolicenie `karton-shell` na libLunę (dziś cairo/pango bezpośrednio).
141
-
142
-## M8 — Kompozytor Selene + środowisko Luna (`de/`)
143
-- **Selene** (`de/selene`) — kompozytor Wayland w czystym Rust, **bez smithay**: własna warstwa
144
- na `wayland-server` (rdzeń + xdg-shell) i bezpośrednia pętla `poll` po gnieździe i backendzie.
145
- ✅ M-K0: globale `wl_compositor`, `wl_shm`, `xdg_wm_base`, `wl_seat`; cykl życia powierzchni
146
- + frame-callbacki, `xdg_surface.configure`, i18n, profil release z LTO.
147
- ✅ M-K1: **wyjście nested** (`libluna-platform`) + kompozycja okien klientów (`wl_shm` →
148
- piksele → `libluna-render`); nowy prymityw `Scene::image`/`ImageData` w rendererze.
149
- ✅ M-K2: **wejście** — `wl_output`, `wl_seat` z wskaźnikiem i klawiaturą (`wl_pointer`,
150
- `wl_keyboard` z mapą XKB i syntezą modyfikatorów), magistrala wejścia z wybudzaniem,
151
- oraz **pływające okna** (fokus, podnoszenie, przeciąganie).
152
- ✅ M-K3: **dekoracje po stronie serwera** (pasek tytułu, przyciski minimalizacji/maksymalizacji/
153
- zamknięcia, uchwyt przeskalowania) + operacje okna (przeciąganie, `xdg_toplevel.configure`/
154
- `close`, **zmiana rozmiaru za wszystkie krawędzie i narożniki**, **maksymalizacja**, **pełny
155
- ekran**, `xdg-decoration` z trybem `server_side`; skróty `Super+M`/`Super+F`/`Super+↑`/
156
- `Super+↓`/`Super+Tab`).
157
- ✅ M-K4: **`xdg_popup`** (menu/kontekstowe z kotwiczeniem do pozycjonera i zamykaniem poza)
158
- oraz **`wlr-layer-shell`** (panele/docki: kotwice, marginesy, strefa wyłączna, warstwy,
159
- wybór monitora) — fundament pulpitu Luna.
160
- ✅ M-K5: **wiele monitorów** — model `OutputInfo` z pozycją, global `wl_output` per monitor,
161
- przenośne **wykrywanie DRM/KMS** (`de/selene/src/drm.rs`, ioctl `GETRESOURCES`/`GETCONNECTOR`)
162
- z fallbackiem na wyjście nested; okna maksymalizują się na swoim monitorze.
163
- ✅ M-K6: **schowek** (`wl_data_device_manager`: `data_source`/`data_offer`/`selection`,
164
- kopiuj/wklej między klientami) oraz **układy klawiatury** z otoczenia
165
- (`LUNA_KEYBOARD_LAYOUT`/`LUNA_KEYBOARD_VARIANT`) i `wl_keyboard.repeat_info`.
166
- ✅ M-K7: **drag & drop** (`start_drag`, `enter`/`motion`/`leave`/`drop`, `dnd_finished`)
167
- oraz **realne wyjście DRM/KMS** (`SELENE_BACKEND=drm`, opcjonalne): master, bufor dumb,
168
- `ADDFB2`, `SETCRTC`, podwójne buforowanie i **page-flip**; bezpieczny fallback do nested,
169
- gdy master trzyma inna sesja.
170
- ✅ M-K8: **wejście evdev** (`SELENE_INPUT=evdev`): własne czytanie `/dev/input/event*`
171
- (wskaźnik względny z wirtualnym kursorem, przyciski, kółko, klawiatura) — rodzime wejście
172
- dla trybu DRM. Wymaga grupy `input`/root.
173
- ✅ Optymalizacje: cache `mmap` puli `wl_shm` i zero-copy w rendererze (`PixmapRef::from_bytes`).
174
- Uruchomienie: `cargo run -p selene` (szczegóły: `de/README.md`).
175
-- Dalej: GLES/akceleracja, hotplug monitorów (`zwlr_output_manager`), `libinput` (gesty),
176
- selekcja pierwotna, IME (`text-input`).
177
-- **Luna** (`de/luna`) — powłoka środowiska na `libluna-widgets`. ✅ start: **panel górny**
178
- (sam **burger** — bez etykiety, który otwiera launcher; tytuł okna, zegar/data,
179
- przełączniki, przestrzenie, użytkownik) i **launcher** w trzech widokach
180
- (**Lista / Siatka / Karuzela** z segmentowym przełącznikiem); render headless do
181
- `docs/images/luna-panel-idle.png`, `docs/images/luna-launcher-{list,grid,carousel}.png`
182
- i `docs/images/luna-popup-*.png` (`cargo run -p luna --bin luna-panel`).
183
- Dane (`PanelState`, `App`, `Launcher`) oddzielone od rysowania (`PaintCtx`) — ten sam kod do
184
- podglądów i sesji na żywo. ✅ **Prawdziwe aplikacje**: `apps.rs` skanuje pliki `.desktop`
185
- (XDG), parsuje `[Desktop Entry]` z lokalizacją nazw i filtrowaniem `NoDisplay`/`Hidden`;
186
- klik w pozycję uruchamia polecenie. Podgląd listy: `cargo run -p luna --bin luna-apps`.
187
- ✅ **Przewijanie** listy/siatki (scroll + klip zawartości). ✅ **Nawigacja klawiaturą**:
188
- strzałki (lista ±1, siatka kolumny/wiersze, karuzela karty), `Enter` uruchamia zaznaczoną
189
- pozycję, `Esc` zamyka; zaznaczenie automatycznie przewija się do widoku
190
- (`Launcher::navigate` + `ensure_selection_visible`).
191
- ✅ **`luna-shell`** (bin) uruchamia panel jako prawdziwą **powierzchnię
192
- warstwową** (`wlr-layer-shell` po stronie klienta w `libluna-platform`); bez kompozytora
193
- kończy się czytelnym `NoCompositor`. ✅ **OSD** (`osd.rs`) i **powiadomienia** (`notifications.rs`)
194
- — pokazywane pod paskiem na powierzchni „chrome”; oba korzystają z pakietu ikon
195
- (`IconName`) zamiast glifów tekstowych. Dalej: usługa D-Bus
196
- `org.freedesktop.Notifications`, centrum powiadomień, menu kontekstowe.
197
-
198
-## Później (poza MVP)
199
-- Dostępność AT-SPI, IME, schowek, drag & drop, animacje, backend GPU, mini-CSS dla motywów.
200
-- Renderer: ✅ **klip obejmuje tekst** (`DrawCommand::Text` respektuje `ClipRect`) — naprawione,
201
- `ScrollView` i inne przewijane widoki przycinają też napisy.
202
-
203
-## Inwentarz widgetów (z makiet → moduł docelowy)
204
-
205
-| Widget | Moduł | Makieta |
206
-|---|---|---|
207
-| Window + CSD HeaderBar | `libluna-adwaita` | obie |
208
-| WindowControls `— □ ✕` | `libluna-adwaita` | obie |
209
-| MenuButton + Popover (burger) | `libluna-widgets` | obie |
210
-| TabBar / ViewSwitcher | `libluna-widgets` | Settings, Files |
211
-| BottomSheet | `libluna-widgets` | Settings, Files |
212
-| Pager (karuzela stron) | `libluna-widgets` | (przeglądarka, onboarding) |
213
-| Sidebar (sekcje, wiersze) | `libluna-adwaita` | obie |
214
-| PathBar (okruszki) | `libluna-widgets` | Files |
215
-| Entry (pole tekstowe) | `libluna-widgets` | Settings, Files |
216
-| SearchEntry / SearchBar | `libluna-widgets` | Files |
217
-| GridView / ListView | `libluna-widgets` (`ItemView`) | Files |
218
-| ScrollView | `libluna-widgets` | obie |
219
-| Card + ActionRow | `libluna-widgets` | Settings |
220
-| Switch | `libluna-widgets` | Settings |
221
-| Slider (+ etykieta %) | `libluna-widgets` | Settings |
222
-| DropDown | `libluna-widgets` | Settings |
223
-| Button (pill/suggested/flat) | `libluna-widgets` | Settings |
224
-| Stepper / Check / Radio | `libluna-widgets` | Files (popover) |
225
-| Toast | `libluna-widgets` | Settings, Files |
226
-| Avatar / ShortcutLabel | `libluna-widgets` | Settings |
227
-| ToggleGroup / SplitButton | `libluna-widgets` | Settings, Files |
228
-| Row (switch/combo/expander/entry/spin/button) | `libluna-widgets` | Settings, Files |
229
-| PreferencesGroup / PreferencesPage | `libluna-widgets` | Settings |
230
-| Dialog / AlertDialog / AboutDialog / ShortcutsDialog / PreferencesDialog | `libluna-widgets` | obie |
231
-| NavigationView / NavigationSplitView / OverlaySplitView / Sidebar | `libluna-widgets` | Files |
232
-| ToolbarView / WindowTitle / Clamp / WrapBox / BreakpointBin / Bin | `libluna-widgets` | obie |
233
-| Banner | `libluna-widgets` | Files, Settings |
234
-| Spinner / Tooltip | `libluna-widgets` | obie |
235
-| StatusBar / bottom info | `libluna-widgets` | obie |
236
-| StatusPage (pusty stan) | `libluna-widgets` | Files |
237
-
238
-## Kompozytor (Selene)
239
-
240
-Status protokołów Waylanda (co działa, czego brakuje i w jakiej kolejności dodajemy)
241
-opisuje **[`docs/compositor.md`](compositor.md)**.
242
-
243
-## Kryterium „gotowca” (Definition of Done dla MVP)
244
-Odtworzenie **obu makiet** (Settings i Files) wyłącznie na libLunie, bez GTK4, z jasnym i
245
-ciemnym motywem, uruchamialne na kompozytorze Selene, w rozsądnym rozmiarze binarki
246
-i zużyciu pamięci względem odpowiedników GTK4.