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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user