← bitácora

v0.2.0 — pestañas, y luego grupos

Hasta ahora rumb tenía exactamente una página abierta, porque el puente estaba construido para una. La v0.2.0 es lo que ocurre cuando se hace que sean muchas.

Cada pestaña es su propio WebView de Servo, que pinta en su propio framebuffer offscreen y exporta su propio dma-buf; el compositor dibuja el de la pestaña activa. Ese es el coste honesto de las pestañas en esta arquitectura — una pestaña no es un registro barato que guarda una URL, es un motor vivo que retiene memoria de GPU. Así que una pestaña que lleve suficiente tiempo inactiva se descarta: su WebView se libera, la memoria vuelve, y llamamos a malloc_trim para que el asignador la devuelva de verdad en lugar de quedársela. Hay salvaguardas. Una pestaña que esté reproduciendo contenido multimedia, o con un formulario a medias, o con un handler de beforeunload, nunca se suspende a sus espaldas.

Luego los grupos, que se llevaron la mayor parte del tiempo. Un grupo tiene un nombre y un color elegido en hexadecimal o sobre una paleta visual, se colapsa en una sola píldora y se dibuja como un subrayado de color continuo a lo largo de sus pestañas — un raíl lateral, en cambio, cuando la barra es vertical. Las pestañas se arrastran dentro y fuera de los grupos, y un grupo entero se arrastra como una unidad.

El feedback del arrastre necesitó varias pasadas. Rellenar el destino con un resaltado indica más o menos dónde va a caer la cosa; una línea fina de acento en el borde delantero de la pestaña sobre la que se pasa el cursor indica exactamente dónde. La segunda es mejor, y es además la que destapó un off-by-one por el que los movimientos hacia la derecha insertaban una posición más tarde de la cuenta, de modo que reordenar solo funcionaba hacia la izquierda.

La propia barra se sitúa ahora en cualquiera de los cuatro bordes, y la vertical se arrastra para redimensionarla como un cajón.

active WebView framebuffer background WebView framebuffer discarded dropped — title and URL kept GPUI dma-buf one frame drawn, whatever the tab count a sleeping tab gives its GPU memory back; reopening it reloads the page
Cada pestaña es un WebView vivo con su propio framebuffer; solo el activo llega al compositor, y una pestaña descartada devuelve los dos.