feat(renaser): Fases 8b y 8c — el escritorio interactivo

El compositor de la 8a teselaba, pero era inmovil. Las 8b/8c lo hacen
vivo: el teclado reordena el escritorio y mueve el foco en caliente.

- Cache de fotogramas: cada ventana guarda en RAM del kernel su ultimo
  fotograma —reservada una vez, acotada al lienzo natural—. Al re-teselar
  o mover el foco, el kernel recompone desde la cache: las apps que solo
  pintan en init (cronista) conservan su imagen sin enterarse del cambio.
- compositor: el registro ESCRITORIO (ventanas, marcos, caches, modo);
  presentar_fotograma, desalojar, atender_mandos, ciclar_layout,
  mover_foco. Foco en un AtomicUsize, mandos en una cola lock-free.
- teclado: la IRQ1 deja de difundir. Alt es el modificador del sistema —
  Alt+Espacio cicla el teselado, Alt+J/K mueven el foco—; una tecla
  ordinaria va SOLO a la app enfocada (CANALES reindexado por indice_app).
- consola: borde de foco (indigo / gris) en cada marco.

Guardarrail anti-interbloqueo: la IRQ1 jamas bloquea ESCRITORIO; se
comunica por dos atomicos y una cola lock-free. Las caches se reservan
una sola vez, al tamaño natural — sin asignacion en el bucle del reactor.

Verificado en QEMU (screendump + sendkey): arranque teselado con hola
enfocada; Alt+Espacio cicla a CenteredMaster y las apps estaticas
conservan su contenido; Alt+J mueve el foco; las teclas llegan solo a la
app enfocada. Cierra la Fase 8 — el compositor teselante e interactivo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 19:19:21 +00:00
parent e94023d8af
commit 5c462e6d30
12 changed files with 676 additions and 177 deletions
+59
View File
@@ -672,3 +672,62 @@ COMPOSITOR: el kernel ya no coloca las ventanas a mano, las TESELA con
centrado en su panel; las apps desalojadas (discola, glotona) tiñen su marco
entero con la baliza. El registro de arranque permanece legible en la franja
superior de la consola.
## Fases 8b y 8c — El escritorio interactivo — 2026-05-22
El compositor de la Fase 8a teselaba, pero era inmóvil. Las Fases 8b y 8c lo
hacen VIVO: el teclado reordena el escritorio en caliente y mueve el foco. Y
para que las apps estáticas no se queden atrás en una reordenación, el kernel
asume la persistencia visual con una caché de fotogramas.
### Añadido
- **Caché de fotogramas (backbuffer).** Cada ventana del compositor guarda, en
RAM del kernel, el último fotograma que su app envió. La caché se reserva UNA
vez, acotada al lienzo natural de la app —jamás crece—. Al re-teselar o mover
el foco, el kernel recompone cada ventana desde su caché: una app que sólo
pintó en su `init` —la cronista— conserva su imagen intacta a través de
cualquier reordenación, sin enterarse del cambio geométrico.
- **`compositor`: el escritorio interactivo.** Un registro `ESCRITORIO` —las
ventanas, sus marcos, sus cachés, el modo de teselado—; `presentar_fotograma`
(cachea y compone), `desalojar`, `atender_mandos`, `ciclar_layout`,
`mover_foco`. El foco vive en un `AtomicUsize`; los mandos del teclado, en
una cola lock-free.
- **`tarea_compositor`** — atiende los mandos del teclado en cada fotograma del
reactor: el contexto cooperativo donde es seguro re-teselar y recomponer.
- `Color::FOCO` (índigo brillante) y `Color::SIN_FOCO` (gris mate) — el borde
de cada ventana, que delata de un vistazo quién tiene el foco.
### Cambiado
- **Teclado (Fase 8c).** El manejador de IRQ1 deja de difundir a ciegas:
- La tecla **Alt** es el modificador del sistema. `Alt+Espacio` cicla el
modo de teselado; `Alt+J` / `Alt+K` mueven el foco. Estos mandos se
consumen en la IRQ — jamás llegan a una app.
- Una tecla ordinaria se entrega SÓLO a la app ENFOCADA. El censo de canales
se reindexó por `indice_app` (`Vec<Option<CanalTeclado>>`): el foco —un
índice— elige el canal exacto.
- `consola::volcar_marco` y `pintar_desalojo` trazan el borde de foco de la
ventana. `sys_render_frame` ya no compone directo: delega en
`compositor::presentar_fotograma`, que cachea antes de componer.
- `AplicacionWasm` / `ContextoCapacidades` pierden el `marco` —ahora vive en el
registro del compositor, mutable—; conservan sólo el `indice_app`.
### Exclusión de interrupciones (guardarraíl)
- El registro `ESCRITORIO` lo tocan SÓLO tareas cooperativas; el manejador de
IRQ1 jamás lo bloquea. La IRQ se comunica con el mundo cooperativo por un
canal estrecho y a prueba de interbloqueos: dos atómicos —el foco y el estado
de Alt— y una cola lock-free de mandos. Ningún cerrojo en disputa entre la
interrupción y una tarea.
- Las cachés se reservan en `compositor::fundar`, una sola vez, al tamaño
natural de cada app: ninguna asignación dinámica dentro del bucle del reactor.
### Verificado
- QEMU (captura headless + `sendkey` por el monitor):
- **Arranque** — cinco apps teseladas en `MasterStack`; `hola` enfocada luce
el borde índigo, las demás el gris.
- **`Alt+Espacio`** — el escritorio cicla a `CenteredMaster`; discola,
glotona y cronista conservan su contenido a través del re-teselado: la
caché de fotogramas en acción.
- **`Alt+J`** — el foco salta de `hola` a `memoriosa`; el borde índigo se
mueve con él.
- **Enrutamiento** — con `memoriosa` enfocada, cuatro pulsaciones llegan sólo
a ella —cuatro celdas violetas—; las demás apps, intactas.