# adwaita-cursors 48.1 — SÓLO los cursores de Adwaita, en el CORPUS. # # ══ EL HUECO QUE TAPA ══════════════════════════════════════════════════════════════════════════ # `vigia-imagen.py` mide un invariante que ninguna métrica de clausura ve: **≥1 tema de cursor con # `cursors/` poblado**. El 2026-09-04 daba ✗ en DOS de los cuatro escritorios —`escritorio-cosmic` # y `escritorio-sway`—, y eso no es cosmético: con el cursor por software (obligatorio en # virtio-gpu y en cualquier render por CPU) el compositor dibuja la imagen que le da el tema, así # que sin tema **el puntero se mueve invisible**. Es la misma figura que las fuentes de GNOME y que # los iconos de KDE: sellado ≠ usable, y el agujero no es dep de build de nadie. # # ══ POR QUÉ UNA RECETA NUEVA Y NO PROMOVER `adwaita-icon-theme` ════════════════════════════════ # Los cursores viven DENTRO de `adwaita-icon-theme` (recipes/incoming-gnome/), que son ~5000 # ficheros de tema de ICONOS. Promoverla al corpus para conseguir un puntero le regalaría a sway y # a cosmic el tema de iconos de GNOME — y eso está declarado como una DECISIÓN pendiente, no como # un olvido (`vigia-imagen.py` lo marca ⊘ en sway a propósito). Esta receta corta por lo sano: # mismo tarball, misma versión, **sólo `Adwaita/cursors/`** (~1 MB), sin un solo icono. # # ⚠ **NO declarar esta receta y `adwaita-icon-theme` en el MISMO perfil**: las dos instalan # `/usr/share/icons/Adwaita/cursors/*` y chocarían fichero a fichero — la misma colisión por la que # zathura no entra en `escritorio-kde` (dos poppler). `escritorio-gnome` ya tiene sus cursores por # el tema completo y NO lleva ésta. # # ══ LAS DOS COSAS QUE EL TARBALL NO TRAE Y HAY QUE FABRICAR ════════════════════════════════════ # 1. **Los nombres X11 heredados.** El tarball trae los nombres CSS (`default`, `pointer`, `text`…); # `left_ptr`, `hand2`, `xterm`, `watch` y compañía son ENLACES que genera el `meson.build` # (`cursor_symlinks`). Una app que pida `left_ptr` —y las viejas piden eso— no encontraría nada. # El mapa se PARSEA de `meson.build`, no se copia a mano: la lista autoritativa es upstream, y # copiada envejece en silencio. Si el origen del enlace no existe, la fase FALLA: upstream pone # ahí un `files()` justamente como aserción, y perderla convertiría un cambio de upstream en un # enlace roto que nadie ve. # 2. **El tema `default`.** Sin `XCURSOR_THEME` en el entorno, libXcursor y wlroots buscan el tema # literalmente llamado `default`; si no existe, no hay puntero AUNQUE `Adwaita` esté instalado. # Por eso se escribe `/usr/share/icons/default/index.theme` con `Inherits=Adwaita`. Es el # eslabón que hace que esto funcione en una imagen SIN configuración, que es el caso real. # # Los `.cur` son los cursores de Windows: upstream los excluye en la instalación de Linux # (`exclude_files: win32_cursors`) y acá también, por el mismo motivo. # # Data-only: no hay un compilador involucrado. name = "adwaita-cursors" version = "48.1" license = "LGPL-3.0-or-later OR CC-BY-SA-3.0" [source] tarball = "https://download.gnome.org/sources/adwaita-icon-theme/48/adwaita-icon-theme-48.1.tar.xz" sha256 = "cbfe9b86ebcd14b03ba838c49829f7e86a7b132873803b90ac10be7d318a6e12" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "dynamic" [build.phases] configure = "true" compile = "true" install = ''' set -e CUR=/out/usr/share/icons/Adwaita/cursors mkdir -p "$CUR" # los cursores propiamente dichos, sin los .cur de Windows find Adwaita/cursors -maxdepth 1 -type f ! -name '*.cur' -exec install -Dm0644 {} "$CUR"/ \; # MEDIDO, no supuesto: 48.1 trae 37 cursores reales (nombres CSS) + 31 `.cur` de Windows. El # primer intento puso el piso en 50 «por si acaso» y la fase falló contra el tarball CORRECTO — # un guardián calibrado por encima de la escala real no protege: bloquea. N=$(ls -1 "$CUR" | wc -l) [ "$N" -ge 30 ] || { echo "sólo $N cursores: el tarball cambió de forma" >&2; exit 1; } # los nombres X11 heredados, leídos del meson.build de upstream (no copiados a mano) sed -n '/cursor_symlinks = {/,/^ }/p' meson.build \ | sed -n "s/^ *'\([^']*\)': *\[\([^]]*\)\].*/\1 \2/p" \ | while read -r SRC RESTO; do [ -e "$CUR/$SRC" ] || { echo "el mapa nombra un cursor ausente: $SRC" >&2; exit 1; } echo "$RESTO" | tr ',' '\n' | tr -d " '" | while read -r DST; do [ -n "$DST" ] && ln -sf "$SRC" "$CUR/$DST" done done # el tema `default`: sin esto, una imagen sin XCURSOR_THEME no encuentra NINGÚN cursor mkdir -p /out/usr/share/icons/default cat > /out/usr/share/icons/default/index.theme <<'EOF' [Icon Theme] Name=Default Comment=Alias al tema de cursores real Inherits=Adwaita EOF # la comprobación que no se puede cumplir por accidente: el nombre que pide TODA app vieja [ -e "$CUR/left_ptr" ] || { echo "sin left_ptr: el mapa de enlaces no se aplicó" >&2; exit 1; } [ -e "$CUR/default" ] || { echo "sin el cursor 'default': el tema no sirve" >&2; exit 1; } ''' [deps] build = []