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
+13
View File
@@ -54,6 +54,7 @@ pub fn init() {
// --- Interrupciones de hardware, ya remapeadas por el PIC ---
idt[pic::VECTOR_TEMPORIZADOR].set_handler_fn(irq_temporizador);
idt[pic::VECTOR_TECLADO].set_handler_fn(irq_teclado);
idt[pic::vector_irq(12)].set_handler_fn(irq_raton);
let idt_estatica: &'static InterruptDescriptorTable = idt;
idt_estatica.load();
@@ -136,6 +137,18 @@ extern "x86-interrupt" fn irq_teclado(_marco: InterruptStackFrame) {
pic::fin_de_interrupcion(pic::VECTOR_TECLADO);
}
/// IRQ12 — Raton PS/2 (Fase 13). Lee un byte del puerto de datos del 8042 —el
/// mismo que sirve al teclado—; el ensamblador de paquetes del raton se ocupa
/// de juntar tres bytes y entregar el evento al compositor.
extern "x86-interrupt" fn irq_raton(_marco: InterruptStackFrame) {
// SEGURIDAD: 0x60 es el puerto de datos del 8042 en la arquitectura PC.
// Que la IRQ12 ha disparado garantiza que el byte es del raton, no del
// teclado: el controlador alza una linea distinta para cada dispositivo.
let byte: u8 = unsafe { x86_64::instructions::port::Port::new(0x60).read() };
crate::drivers::raton::recibir_byte(byte);
pic::fin_de_interrupcion(pic::vector_irq(12));
}
/// IRQ del disco — virtio-blk (Fase 6.2). El disco ha terminado una
/// transferencia: `atender_irq` reconoce la interrupcion en el dispositivo
/// —lo que libera su linea— y despierta a la tarea que aguardaba el bloque.