La página contesta
El render era la mitad visible del problema. El input es la mitad que lo convierte en un navegador, y hasta que esto entró rumb tenía una página que se podía mirar y scrollear, y nada más.
El teclado ahora va a la página por defecto. Suena obvio, y ahí está toda la decisión: la barra de URL se tragaba cada pulsación porque era lo único que había pedido alguna. Ahora solo edita mientras tiene el foco — Cmd/Ctrl+L, o un clic sobre ella — con Enter para cargar y Escape para devolver el foco. En cualquier otro caso, las teclas se traducen a eventos de teclado de Servo y se entregan al WebView. Escribir en un campo de texto de una página funciona. Y un cuadro de búsqueda también, que es la primera vez que rumb se puede usar para buscar algo en lugar de para mostrar algo que ya habíamos decidido cargar.
Los cursores vinieron con ello. El WebViewDelegate de Servo tiene un hook notify_cursor_changed que se dispara con la forma que quiere para lo que haya bajo el puntero; eso lo mapeamos al CursorStyle de GPUI y fijamos el puntero del sistema. Los enlaces parecen enlaces, el texto parece seleccionable. Es muy poco código para lo mucho que cambia la sensación — antes de esto, todas las partes de la página eran igual de inertes.
Pantalla completa también, con F11 y un botón de la barra de herramientas.
Nada de esto es difícil en el sentido de ser ingenioso. Es difícil en el sentido de ser quisquilloso: el foco tiene que tener exactamente un dueño, las coordenadas del puntero tienen que estar en píxeles físicos y relativas a los límites del elemento correcto, y cada una de esas cosas está mal sin avisar hasta que uno se sienta a mirarla.