`vigia-imagen.py` daba ✗ en cursores en DOS de los cuatro escritorios. No es cosmético: con el cursor por software —obligatorio en virtio-gpu y en todo render por CPU— el compositor dibuja la imagen que le da el TEMA, y sin tema el ratón se mueve invisible. cosmic llegó a 43/43 y sway a 173/173 así, porque un tema de cursor no es dep de build de nadie: sólo entra si se DECLARA. `adwaita-cursors` (corpus, 48.1, data-only): del mismo tarball que `adwaita-icon-theme` pero SÓLO `Adwaita/cursors/` — 39 ficheros y 14 MB, sin un icono. Promover el tema entero habría regalado a sway y a cosmic los iconos de GNOME, que está anotado como decisión pendiente y no como olvido. Las dos cosas que el tarball no trae y la receta fabrica: · los nombres X11 heredados (`left_ptr`, `xterm`, `watch`, `hand2`…) son enlaces que genera el `meson.build` de upstream. El mapa se PARSEA de ahí, no se copia: copiado envejece en silencio. Si el origen de un enlace no existe, la fase falla — upstream pone un `files()` como aserción. · `/usr/share/icons/default/index.theme` con `Inherits=Adwaita`. Sin `XCURSOR_THEME` en el entorno, libXcursor y wlroots buscan el tema llamado literalmente `default`; sin él no hay puntero AUNQUE Adwaita esté instalado. Es el eslabón que hace que ande sin configuración. ⚠ no declarar esta receta junto a `adwaita-icon-theme`: chocan en `Adwaita/cursors/*`. Y el vigía estaba midiendo el invariante de al lado: exigía `index.theme` en el directorio para contar un tema, que es correcto para ICONOS —la búsqueda XDG recorre `Directories=`— y falso para CURSORES, porque libXcursor abre `<tema>/cursors/<nombre>` directo y el índice sólo hace falta para seguir un `Inherits=`. Con la receta instalada seguía diciendo «NINGÚN tema de cursor». De paso queda anotado en `targets.toml` que el comentario de cosmic decía «sin ellos arranca sin puntero» sobre `cosmic-icons`, que no trae cursores: describía una protección que no existía. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CGyBj4QyeCZiwLMkP9GJp6
95 lines
5.2 KiB
TOML
95 lines
5.2 KiB
TOML
# 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 = []
|