Files
takana/recipes/adwaita-cursors.toml
SergioandClaude Opus 5 8c4e1a6b24 cursores: cosmic y sway corrían con el puntero INVISIBLE — receta propia, y el vigía medía mal
`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
2026-09-04 01:38:30 +00:00

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 = []