← luna

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 }