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>
This commit is contained in:
@@ -72,6 +72,8 @@ struct DrmState {
|
|||||||
ctl: Option<crate::CtlServer>,
|
ctl: Option<crate::CtlServer>,
|
||||||
/// Inicio del compositor — base de tiempos para los frame-callbacks.
|
/// Inicio del compositor — base de tiempos para los frame-callbacks.
|
||||||
start: Instant,
|
start: Instant,
|
||||||
|
/// Nº de ventanas en el último `tick` — para registrar los cambios.
|
||||||
|
last_windows: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DrmState {
|
impl DrmState {
|
||||||
@@ -126,6 +128,12 @@ impl DrmState {
|
|||||||
fn tick(&mut self) {
|
fn tick(&mut self) {
|
||||||
self.app.brain_poll();
|
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 self.keymap_watch.as_ref().is_some_and(|w| w.changed()) {
|
||||||
if let Some(path) = &self.keymap_path {
|
if let Some(path) = &self.keymap_path {
|
||||||
match Keymap::load(path) {
|
match Keymap::load(path) {
|
||||||
@@ -330,6 +338,17 @@ pub fn run() -> Result<(), Box<dyn Error>> {
|
|||||||
std::env::set_var("WAYLAND_DISPLAY", &socket_name);
|
std::env::set_var("WAYLAND_DISPLAY", &socket_name);
|
||||||
println!(" escuchando en 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.
|
// 8 · El bucle `calloop`: VBlank, teclado, clientes y un timer.
|
||||||
println!("[8/8] montando el bucle de eventos …");
|
println!("[8/8] montando el bucle de eventos …");
|
||||||
let mut event_loop: EventLoop<DrmState> =
|
let mut event_loop: EventLoop<DrmState> =
|
||||||
@@ -374,6 +393,7 @@ pub fn run() -> Result<(), Box<dyn Error>> {
|
|||||||
Generic::new(listener, Interest::READ, CalloopMode::Level),
|
Generic::new(listener, Interest::READ, CalloopMode::Level),
|
||||||
|_readiness, listener, state| {
|
|_readiness, listener, state| {
|
||||||
while let Some(stream) = listener.accept()? {
|
while let Some(stream) = listener.accept()? {
|
||||||
|
eprintln!("mirada-compositor · cliente Wayland conectado.");
|
||||||
let _ = state
|
let _ = state
|
||||||
.display
|
.display
|
||||||
.handle()
|
.handle()
|
||||||
@@ -434,6 +454,7 @@ pub fn run() -> Result<(), Box<dyn Error>> {
|
|||||||
keymap_watch,
|
keymap_watch,
|
||||||
ctl,
|
ctl,
|
||||||
start: Instant::now(),
|
start: Instant::now(),
|
||||||
|
last_windows: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let signal = event_loop.get_signal();
|
let signal = event_loop.get_signal();
|
||||||
|
|||||||
Reference in New Issue
Block a user