Saltar al contenido principal
Volver al inicio
#004

Hyprwall

Selector de wallpapers para Hyprland con un carrusel renderizado por software, escrito en Rust.

Developer
RustWaylandHyprlandtiny-skia

Decisiones técnicas:

Una capa overlay, no una ventana

Hyprwall se dibuja como una superficie layer-shell de Wayland en la capa overlay, usando smithay-client-toolkit. En vez de ser una ventana más del compositor, es una capa que cubre la pantalla con interactividad de teclado exclusiva, así el selector aparece por encima de todo y captura las flechas sin pelear con el resto del entorno.

Arquitectura Elm

El estado vive bajo un patrón Model–Msg–Cmd: los eventos de Wayland se traducen a mensajes, una función update pura decide cómo cambia el estado y qué efectos disparar, y los comandos resultantes (redibujar, aplicar wallpaper, salir) se ejecutan aparte. La ventaja concreta es que toda la lógica de navegación y selección queda libre de Wayland y se puede testear con funciones puras, sin levantar un compositor.

Render por software propio

No hay GPU acá: cada frame se rasteriza a mano sobre un buffer de memoria compartida con tiny-skia, y el texto de las etiquetas se dibuja glyph por glyph con fontdue, incluyendo recorte con elipsis cuando un nombre no entra. El pipeline está partido en dos etapas: primero se construye una escena —una lista de comandos de dibujo independiente de la resolución— y después un rasterizador la pinta aplicando el factor de escala. Eso mantiene el soporte HiDPI en un solo lugar y deja la construcción de la escena fácil de testear.

Carrusel con foco central

El layout ubica el wallpaper seleccionado grande y centrado, y los demás se reparten a los costados encogiéndose con la distancia, envolviéndose de forma circular. Solo se calculan las tarjetas que caben en pantalla. El hit testing para el click sale del mismo layout, de modo que lo que ves y lo que podés clickear nunca se desincronizan.

Selección de wallpaper en hyprwall, foto 1

Selección de wallpaper en hyprwall, foto 2

Selección de wallpaper en hyprwall, foto 3

Carga en paralelo

Al arrancar, los wallpapers del directorio se decodifican y se reducen a miniaturas en paralelo con rayon, preservando el orden alfabético original pese a que terminen en cualquier orden. Las imágenes se decodifican una sola vez a un tamaño acotado, no al resolver cada frame.

Aplicar wallpaper

Para fijar el fondo, hyprwall prueba en cascada awww, swww y hyprctl hyprpaper, levantando el daemon correspondiente si hace falta y esperando a que aparezca su socket. Funciona con la herramienta que ya tengas instalada en lugar de imponer una. Tras aplicar, recuerda el wallpaper actual en cache y deja un symlink — que es justamente de donde hyprcolor y hyprbar leen el fondo activo para recolorear el resto del escritorio.

Tests

La lógica pura —el reducer de estado, la navegación del picker, la construcción de la escena— tiene cobertura de tests unitarios: que las flechas envuelvan, que un click cambie la selección y dispare la aplicación, que la escena emita primero el panel y luego las tarjetas. Lo que toca Wayland queda como una capa fina de traducción sin decisiones propias, así que no necesita un compositor para probarse.

Estado actual

Funciona de punta a punta: escanea el directorio, muestra el carrusel, navega con teclado o mouse y aplica el wallpaper elegido. Es la pieza que cierra el ecosistema —elige el fondo que hyprcolor convierte en paleta y que hyprbar refleja en su color de acento.