Commit 017f90a
0
files
+0
added
-0
deleted
@@ -68,19 +68,21 @@ pub fn spawn(
68
68
/// trzyma master DRM. Bez ponowień Selene od razu widzi `MasterBusy` i zostawia czarny
69
69
/// ekran. Czekamy do ~5 s, aż greeter zwolni mastera.
70
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)
71
+ // LightDM potrafi wystartować sesję, zanim greeter (Xorg) zwolni ekran — bywa, że
72
+ // master jest już wolny, ale CRTC-e jeszcze zajęte (modeset się nie udaje). Dlatego
73
+ // próbujemy przez ~5 s niezależnie od powodu (master/zasoby/modeset).
74
+ let mut last = DrmError::MasterBusy;
75
+ for attempt in 0..50 {
76
+ match DrmBackend::open() {
77
+ Ok(backend) => return Ok(backend),
78
+ Err(e) => last = e,
79
+ }
80
+ if attempt == 0 && std::env::var("SELENE_STATS").is_ok() {
81
+ eprintln!("selene/drm: init nieudany ({last:?}) — czekam na zwolnienie ekranu…");
81
82
}
82
- other => other,
83
+ std::thread::sleep(Duration::from_millis(100));
83
84
}
85
+ Err(last)
84
86
}
85
87
86
88
/// Uruchamia wątek wyjścia DRM/KMS — renderuje scenę do buforów i skanuje na monitorach.