Commit f600aa7
2
files
+81
added
-1
deleted
@@ -404,6 +404,47 @@ impl Frame<'_> {
404
404
/// odświeżenia (start, zmiana rozmiaru/skali, zdarzenia wejścia, zmiana motywu).
405
405
///
406
406
/// Funkcja wraca, gdy okno zostanie zamknięte (przez użytkownika lub `Escape`).
407
+/// Ustawia `WAYLAND_DISPLAY`, gdy go brak (terminal uruchomiony w sesji X11).
408
+///
409
+/// Kolejność: zmienna → marker Selene (`luna-wayland`) → `wayland-0`/`wayland-1`.
410
+/// Dzięki temu `luna-files`, `luna-demo` i inne aplikacje libLuny działają także
411
+/// z terminala odziedziczonego po X11, gdzie `WAYLAND_DISPLAY` nie jest ustawione.
412
+fn ensure_wayland_display() -> Result<(), Box<dyn Error>> {
413
+ if std::env::var_os("WAYLAND_DISPLAY").is_some_and(|v| !v.is_empty()) {
414
+ return Ok(());
415
+ }
416
+ let rt = std::env::var_os("XDG_RUNTIME_DIR")
417
+ .map(std::path::PathBuf::from)
418
+ .ok_or("brak XDG_RUNTIME_DIR i WAYLAND_DISPLAY — uruchom aplikację w sesji Luny")?;
419
+
420
+ let mut names: Vec<String> = Vec::new();
421
+ if let Ok(name) = std::fs::read_to_string(rt.join("luna-wayland")) {
422
+ let name = name.trim().to_owned();
423
+ if !name.is_empty() {
424
+ names.push(name);
425
+ }
426
+ }
427
+ names.push("wayland-0".to_owned());
428
+ names.push("wayland-1".to_owned());
429
+
430
+ for name in names {
431
+ let path = if name.starts_with('/') {
432
+ std::path::PathBuf::from(&name)
433
+ } else {
434
+ rt.join(&name)
435
+ };
436
+ if path.exists() {
437
+ std::env::set_var("WAYLAND_DISPLAY", &name);
438
+ return Ok(());
439
+ }
440
+ }
441
+ Err(format!(
442
+ "Nie znaleziono kompozytora Wayland (brak WAYLAND_DISPLAY i gniazda w {}). Uruchom aplikację w sesji Luny.",
443
+ rt.display()
444
+ )
445
+ .into())
446
+}
447
+
407
448
pub fn run<F>(config: AppConfig, render: F) -> Result<(), Box<dyn Error>>
408
449
where
409
450
F: for<'a> FnMut(&mut Frame<'a>) + 'static,
@@ -414,6 +455,10 @@ where
414
455
if let Ok(Some(dir)) = libluna_core::runtime::ensure_runtime_dir() {
415
456
eprintln!("libLuna: XDG_RUNTIME_DIR not set, using {}", dir.display());
416
457
}
458
+ // `wayland-client` **nie** zgaduje nazwy gniazda: bez `WAYLAND_DISPLAY` kończy
459
+ // się `NoCompositor`. Terminale uruchamiane przez powłokę dostają czyste
460
+ // środowisko X11, więc odnajdujemy gniazdo Selene po markerze / `wayland-0`.
461
+ ensure_wayland_display()?;
417
462
let conn = Connection::connect_to_env()?;
418
463
let (globals, event_queue) = registry_queue_init(&conn)?;
419
464
let qh = event_queue.handle();
@@ -1733,6 +1733,34 @@ fn force_x11_env(cmd: &mut std::process::Command) {
1733
1733
apply_display(cmd);
1734
1734
}
1735
1735
1736
+/// Backend X11 dla **terminala**, ale z zachowanym `WAYLAND_DISPLAY`.
1737
+///
1738
+/// Terminal ma działać na X11 (spójny pasek tytułu), a uruchamiane w nim
1739
+/// aplikacje Waylanda muszą widzieć gniazdo Selene.
1740
+fn force_x11_terminal_env(cmd: &mut std::process::Command) {
1741
+ cmd.env("GDK_BACKEND", "x11")
1742
+ .env("QT_QPA_PLATFORM", "xcb")
1743
+ .env("SDL_VIDEODRIVER", "x11")
1744
+ .env("CLUTTER_BACKEND", "x11")
1745
+ .env("MOZ_ENABLE_WAYLAND", "0");
1746
+ // Gniazdo: z bieżącego środowiska albo z markera sesji.
1747
+ let socket = std::env::var("WAYLAND_DISPLAY")
1748
+ .ok()
1749
+ .filter(|v| !v.is_empty())
1750
+ .or_else(|| {
1751
+ std::env::var_os("XDG_RUNTIME_DIR")
1752
+ .and_then(|rt| {
1753
+ std::fs::read_to_string(std::path::Path::new(&rt).join("luna-wayland")).ok()
1754
+ })
1755
+ .map(|s| s.trim().to_owned())
1756
+ .filter(|s| !s.is_empty())
1757
+ });
1758
+ if let Some(socket) = socket {
1759
+ cmd.env("WAYLAND_DISPLAY", socket);
1760
+ }
1761
+ apply_display(cmd);
1762
+}
1763
+
1736
1764
/// `DISPLAY` dla uruchamianych aplikacji.
1737
1765
///
1738
1766
/// Sesja startuje powłokę **od razu** po gnieździe Waylanda, zanim Xwayland zdąży
@@ -1816,7 +1844,14 @@ fn launch_direct(exec: &str, terminal: bool, force_x11: bool) {
1816
1844
cmd.stdin(std::process::Stdio::null())
1817
1845
.stdout(std::process::Stdio::null());
1818
1846
if force_x11 {
1819
- force_x11_env(&mut cmd);
1847
+ if terminal {
1848
+ // Terminal działa przez X11 (nasz SSD), ale jego **dzieci** mają dostać
1849
+ // Wayland — inaczej `luna-files`/inne aplikacje Waylanda kończą się
1850
+ // `NoCompositor`, a GTK po cichu spada na X11.
1851
+ force_x11_terminal_env(&mut cmd);
1852
+ } else {
1853
+ force_x11_env(&mut cmd);
1854
+ }
1820
1855
} else {
1821
1856
apply_display(&mut cmd);
1822
1857
}