tawasuyu

tawasuyu/brahman

Rust 582TOML 222Markdown 83JSON 198635 Definiciones

feat(mirada-compositor): backend DRM — app de arranque + traza de ventanas

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 <noreply@anthropic.com>

fb2f3a2d015088a9caa5041588fe3ae86a52f971 · por sergio · (hace 5 meses) · padre 782244b74 · ver el árbol en este commit

Delta semántico · 3

crates/apps/mirada-compositor/src/drm_backend.rs

  • cambió de firma struct DrmState
  • cambió por dentro fn run pub
  • cambió por dentro fn tick

1 archivos · +21 −0

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<crate::CtlServer>,
     /// 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<dyn Error>> {
     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<DrmState> =
@@ -374,6 +393,7 @@ pub fn run() -> Result<(), Box<dyn Error>> {
             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<dyn Error>> {
         keymap_watch,
         ctl,
         start: Instant::now(),
+        last_windows: 0,
     };
 
     let signal = event_loop.get_signal();