feat(renaser): Fase 13 — ratón, puntero y arrastre de flotantes

renaser dialogaba sólo con el teclado; las ventanas flotantes nacían
en cascada y allí se quedaban. La Fase 13 trae el ratón.

- Driver `drivers/raton`: el ratón PS/2 cuelga del dispositivo
  auxiliar del 8042 + IRQ12. El driver despierta el aux, programa
  su IRQ, le ordena reportar, ensambla paquetes de 3 bytes con
  guarda del bit-3. Posición como atómicos, eventos como cola
  lock-free — el mismo guardarraíl que el teclado.
- El puntero, capa de PRESENTACIÓN: `Pantalla::estampar_puntero`
  pinta un sprite de flecha 12×18 sobre el framebuffer después de
  copiar el lienzo. El lienzo nunca lo contiene — hace de
  save-under natural—.
- Compositor: `atender_raton` drena eventos. Botón bajando es un
  clic-para-enfocar consistente con `mover_foco` (silencia bocina,
  alza si flota). Si la enfocada flota, arranca un arrastre con el
  desfase de agarre; el botón sostenido la sigue al puntero; al
  soltar, termina.
- `refrescar_puntero` reestampa el framebuffer si el puntero se
  movió en una vuelta tranquila en que ninguna app pintó.

Verificado en QEMU (mouse_move / mouse_button del monitor): el
puntero aparece al arrancar, se mueve por la pantalla, un clic
sobre pulso le da el foco, y un arrastre con el botón sostenido
mueve la flotante de la cascada al centro-abajo.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 23:21:06 +00:00
parent d1b700eb2b
commit 8fc1d99ddf
11 changed files with 644 additions and 4 deletions
+40
View File
@@ -906,3 +906,43 @@ capacidades. Hasta hoy renaser sólo sabía DIBUJAR para llamar la atención.
pcspk-audiodev`), el PCM capturado —50 s— es una onda cuadrada oscilante de
±24 000 de amplitud, con una frecuencia media de ~375 Hz: la de la escala de
Do mayor.
## Fase 13 — Ratón, puntero y arrastre de flotantes — 2026-05-22
renaser tenía teclado y bocina como entrada/salida del usuario, pero no
puntero. Las ventanas flotantes de la Fase 9 nacían en cascada y se quedaban
ahí, clavadas. La Fase 13 trae el ratón: un puntero en pantalla, clic-para-
enfocar y arrastre del marco de las ventanas flotantes.
### Añadido
- **Driver `drivers/raton`** — el ratón PS/2 cuelga del dispositivo auxiliar
del 8042 (la misma controladora que el teclado) y anuncia cada movimiento
por la IRQ12. El driver despierta el aux, enciende su IRQ, le ordena
reportar, y ensambla los paquetes de 3 bytes con la guarda del bit-3 que
detecta desincronización. Como el teclado, la IRQ12 sólo toca atómicos
—posición del puntero— y una cola lock-free de eventos.
- **El puntero, capa de presentación.** `Pantalla` gana `formato` y la
función `estampar_puntero`: un sprite de flecha de 12×18 que se pinta
DIRECTAMENTE sobre el framebuffer, justo después de copiar el lienzo. El
lienzo permanece libre de puntero —hace de save-under natural—; cada
`presentar` sella el puntero al final.
- **Capacidad del compositor**: `atender_raton` drena eventos del ratón cada
fotograma. El botón izquierdo bajando es un CLIC: enfoca la ventana viva
bajo el puntero (consistente con `mover_foco` — silencia la bocina, alza al
frente si flota). Si la enfocada es flotante, arranca un ARRASTRE con el
desfase de agarre; con el botón sostenido, la ventana sigue al puntero;
soltarlo lo termina.
- **`refrescar_puntero`**: en una vuelta tranquila en que ninguna app pinte,
reestampa el framebuffer si el puntero se ha movido — el centinela
empacado evita repintar dos veces el mismo instante.
- `Escritorio` gana `arrastre: Option<Arrastre>` y `raton_izq: bool`.
`Arrastre` guarda el índice de la ventana asida y el desfase de agarre.
`cerrar` libera el arrastre si la ventana cerrada era la arrastrada.
### Verificado
- QEMU (`mouse_move` + `mouse_button` del monitor). El puntero aparece en el
centro al arrancar; `mouse_move` lo lleva por la pantalla. Clic sobre la
ventana `pulso` (en la pila) la enfoca: el borde índigo deja la maestra y
envuelve a `pulso`. `Alt+F` la flota; el ratón la agarra y la arrastra de
la esquina superior izquierda al centro-abajo de la pantalla con el botón
sostenido. El kernel sigue estable a través de los gestos.