Slint, toolkit para interfaces de usuario multiplataforma con núcleo en Rust, publica su versión 1.17 con una mejora clave para los enlaces con JavaScript y TypeScript: la sustitución del ciclo de 16 ms que mantenía el hilo despierto de forma permanente por una integración real con libuv, el bucle de eventos de Node.js. Hasta la versión 1.16, el hilo de la interfaz consultaba cada 16 ms aunque no hubiera trabajo pendiente, lo que disparaba el uso de CPU y batería en reposo y retrasaba los eventos de UI hasta ese intervalo.
La solución, disponible ya en Linux y macOS, se apoya en el hook uv_prepare_t de libuv, que se ejecuta tras los temporizadores de JavaScript y antes de la espera de E/S. Slint calcula con uv_backend_timeout el tiempo máximo que el sistema puede bloquearse, procesa sus propios eventos de ventana con ese límite y desbloquea el sondeo de libuv mediante uv_async_send, de modo que el proceso solo despierta cuando hay un evento de UI, un temporizador vencido o E/S lista. Adicionalmente, un future con async-io observa el descriptor de fichero de libuv para devolver el control rápidamente cuando hay E/S.
El artículo detalla por qué los dos bucles deben compartir hilo (las propiedades de Slint se leen durante el renderizado y desde callbacks que llaman a JavaScript, y en macOS la GUI solo puede ejecutarse en el hilo principal de Node), por qué la vía obvia de mover Slint a un hilo de trabajo queda descartada, y por qué el resto de objetivos pendientes —Windows, Deno y Bun— aún no se han resuelto. En Windows, la integración exigiría exponer las completion ports de libuv, algo que Electron ya hace mediante un parche no adoptado upstream; Deno no usa libuv y Bun tiene su propio runtime, por lo que ninguno expone el hook equivalente.
