Commit 82b941a
2
files
+24
added
-2
deleted
@@ -125,7 +125,8 @@ SELENE_BACKEND=drm XDG_RUNTIME_DIR="$PWD/.selene-runtime" cargo run -p selene
125
125
```
126
126
127
127
Uwaga: tryb DRM przejmuje ekran (page-flip); gdy master trzyma Twoja sesja, Selene
128
-zgłasza to i **nie** rusza wyświetlaczy.
128
+zgłasza to i **nie** rusza wyświetlaczy. Gdy sesję startuje menedżer logowania, greeter
129
+potrafi jeszcze chwilę trzymać master — Selene czeka na niego do ~5 s, po czym się poddaje.
129
130
130
131
Instalator środowiska (binarki + sesja „Luna” + tłumaczenia + motywy) — `scripts/install.sh`:
131
132
@@ -62,13 +62,34 @@ pub fn spawn(
62
62
});
63
63
}
64
64
65
+/// Otwiera backend DRM, czekając chwilę, gdy mastera trzyma jeszcze greeter LightDM.
66
+///
67
+/// LightDM potrafi wystartować sesję Wayland, **zanim ubije greeter** (Xorg), który
68
+/// trzyma master DRM. Bez ponowień Selene od razu widzi `MasterBusy` i zostawia czarny
69
+/// ekran. Czekamy do ~5 s, aż greeter zwolni mastera.
70
+fn open_drm_waiting() -> Result<DrmBackend, DrmError> {
71
+ match DrmBackend::open() {
72
+ Err(DrmError::MasterBusy) => {
73
+ for _ in 0..50 {
74
+ std::thread::sleep(Duration::from_millis(100));
75
+ match DrmBackend::open() {
76
+ Err(DrmError::MasterBusy) => continue,
77
+ other => return other,
78
+ }
79
+ }
80
+ Err(DrmError::MasterBusy)
81
+ }
82
+ other => other,
83
+ }
84
+}
85
+
65
86
/// Uruchamia wątek wyjścia DRM/KMS — renderuje scenę do buforów i skanuje na monitorach.
66
87
///
67
88
/// Wymaga bycia DRM masterem; jeśli inną sesję trzyma master, kończy bez efektu
68
89
/// (wywołujący powinien wtedy użyć wyjścia nested).
69
90
pub fn spawn_drm(model: WindowModel) {
70
91
std::thread::spawn(move || {
71
- let mut backend = match DrmBackend::open() {
92
+ let mut backend = match open_drm_waiting() {
72
93
Ok(backend) => backend,
73
94
Err(reason) => {
74
95
// Rozróżniamy powód — inaczej „brak mastera” maskuje błędy inicjalizacji.