From fb2f3a2d015088a9caa5041588fe3ae86a52f971 Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 21 May 2026 02:21:11 +0000 Subject: [PATCH] =?UTF-8?q?feat(mirada-compositor):=20backend=20DRM=20?= =?UTF-8?q?=E2=80=94=20app=20de=20arranque=20+=20traza=20de=20ventanas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Primera prueba 2b en hardware: sesión, render, teclado y atajos funcionan — Super+Shift+e cierra limpio. Faltaba ver una ventana de cliente. - MIRADA_STARTUP: si trae un comando, el backend DRM lo lanza como hijo al arrancar (hereda WAYLAND_DISPLAY) — así se prueba un cliente sin saltar de VT. - Logs: cada cliente Wayland que se conecta, y el nº de ventanas en pantalla cuando cambia — para confirmar la cadena cliente→ventana. Co-Authored-By: Claude Opus 4.7 --- .../apps/mirada-compositor/src/drm_backend.rs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/crates/apps/mirada-compositor/src/drm_backend.rs b/crates/apps/mirada-compositor/src/drm_backend.rs index 9dc2713..18eda47 100644 --- a/crates/apps/mirada-compositor/src/drm_backend.rs +++ b/crates/apps/mirada-compositor/src/drm_backend.rs @@ -72,6 +72,8 @@ struct DrmState { ctl: Option, /// Inicio del compositor — base de tiempos para los frame-callbacks. start: Instant, + /// Nº de ventanas en el último `tick` — para registrar los cambios. + last_windows: usize, } impl DrmState { @@ -126,6 +128,12 @@ impl DrmState { fn tick(&mut self) { self.app.brain_poll(); + let n = self.app.windows.len(); + if n != self.last_windows { + eprintln!("mirada-compositor · ventanas en pantalla: {n}"); + self.last_windows = n; + } + if self.keymap_watch.as_ref().is_some_and(|w| w.changed()) { if let Some(path) = &self.keymap_path { match Keymap::load(path) { @@ -330,6 +338,17 @@ pub fn run() -> Result<(), Box> { std::env::set_var("WAYLAND_DISPLAY", &socket_name); println!(" escuchando en WAYLAND_DISPLAY={socket_name}"); + // App de arranque: si `MIRADA_STARTUP` trae un comando, se lanza como + // hijo (hereda `WAYLAND_DISPLAY`) — cómodo para probar sin saltar de VT. + if let Ok(cmd) = std::env::var("MIRADA_STARTUP") { + if !cmd.trim().is_empty() { + match std::process::Command::new("sh").arg("-c").arg(&cmd).spawn() { + Ok(child) => println!(" app de arranque lanzada (pid {}): {cmd}", child.id()), + Err(e) => eprintln!(" no pude lanzar «{cmd}»: {e}"), + } + } + } + // 8 · El bucle `calloop`: VBlank, teclado, clientes y un timer. println!("[8/8] montando el bucle de eventos …"); let mut event_loop: EventLoop = @@ -374,6 +393,7 @@ pub fn run() -> Result<(), Box> { Generic::new(listener, Interest::READ, CalloopMode::Level), |_readiness, listener, state| { while let Some(stream) = listener.accept()? { + eprintln!("mirada-compositor · cliente Wayland conectado."); let _ = state .display .handle() @@ -434,6 +454,7 @@ pub fn run() -> Result<(), Box> { keymap_watch, ctl, start: Instant::now(), + last_windows: 0, }; let signal = event_loop.get_signal();