diff --git a/docs/state/build-state-gnome.json b/docs/state/build-state-gnome.json index 0e94f7ef..83e02025 100644 --- a/docs/state/build-state-gnome.json +++ b/docs/state/build-state-gnome.json @@ -1,16 +1,16 @@ { "schema": "hammer-build-state/1", "totals": { - "recipes": 920, - "nodes": 922, - "sealed": 920, + "recipes": 921, + "nodes": 923, + "sealed": 921, "ajeno": 2 }, "by_class": { "ajeno": 2, "c": 272, "go": 362, - "gui": 47, + "gui": 48, "kernel": 6, "rust": 233 }, @@ -21,7 +21,7 @@ "ajeno": 2 }, "incoming-gnome": { - "sealed": 63 + "sealed": 64 } }, "by_profile": { @@ -36,9 +36,9 @@ "sealed": 80 }, "escritorio-gnome": { - "raices": 24, - "clausura": 182, - "sealed": 182 + "raices": 25, + "clausura": 183, + "sealed": 183 }, "escritorio-mirada": { "raices": 17, @@ -5360,7 +5360,7 @@ "escritorio-kde", "escritorio-sway" ], - "dependientes_total": 103 + "dependientes_total": 104 }, "gh": { "iname": "gh", @@ -5992,7 +5992,7 @@ "perfiles": [ "escritorio-gnome" ], - "dependientes_total": 42 + "dependientes_total": 43 }, "glib-introspected": { "iname": "glib-introspected", @@ -6245,6 +6245,30 @@ ], "dependientes_total": 0 }, + "gnome-shell-extension-blur-my-shell": { + "iname": "gnome-shell-extension-blur-my-shell", + "version": "72", + "link": "dynamic", + "compiler": "zig-cc", + "deps": [ + "gettext-tiny", + "glib", + "libffi", + "pcre2", + "zlib" + ], + "cls": "gui", + "queue": "incoming-gnome", + "foreign": false, + "hash": "b3:6b39a579c1d58e333c9c1d27875ba015705a340b883638afcde166fd6e6ac9d9", + "state": "sealed", + "blocked_by": [], + "unblocks": 0, + "perfiles": [ + "escritorio-gnome" + ], + "dependientes_total": 0 + }, "gnupg": { "iname": "gnupg", "version": "2.4.9", @@ -10065,7 +10089,7 @@ "escritorio-mirada", "escritorio-sway" ], - "dependientes_total": 109 + "dependientes_total": 110 }, "libffi-shared": { "iname": "libffi-shared", @@ -13824,7 +13848,7 @@ "escritorio-kde", "escritorio-sway" ], - "dependientes_total": 81 + "dependientes_total": 82 }, "pcre2-shared": { "iname": "pcre2-shared", @@ -18967,7 +18991,7 @@ "escritorio-mirada", "escritorio-sway" ], - "dependientes_total": 112 + "dependientes_total": 113 }, "zlib-ng": { "iname": "zlib-ng", diff --git a/docs/state/drenaje.json b/docs/state/drenaje.json index 80c8a1b3..da2cb9ac 100644 --- a/docs/state/drenaje.json +++ b/docs/state/drenaje.json @@ -31,7 +31,7 @@ }, "escritorio-gnome": { "grafo": "docs/state/build-state-gnome.json", - "nodos": 182, + "nodos": 183, "en_deuda": 0, "ondas": 0, "profundidad": 0, diff --git a/docs/state/targets.toml b/docs/state/targets.toml index 0aebd8e5..08451521 100644 --- a/docs/state/targets.toml +++ b/docs/state/targets.toml @@ -429,6 +429,20 @@ paquetes = [ # resuelve en RUNTIME leyendo el `index.theme` del padre, así que el padre tiene que estar # INSTALADO. Desde hoy se resuelve contra el corpus (misma receta, mismo hash). "adwaita-icon-theme", "hicolor-icon-theme", + # ── EXTENSIONES DEL SHELL ──────────────────────────────────────────────────────────────────── + # ⚠ Añadida el 2026-09-09: esta imagen traía la CÁSCARA de GNOME y ni una extensión. No es un + # detalle estético — GNOME manda un shell deliberadamente mínimo y el ecosistema lo completa por + # acá; sin ninguna, el escritorio es lo que el proyecto entrega y nadie usa tal cual. + # El shell SÍ sabe cargarlas sin nada más: `ui/extensionSystem.js` va en el gresource sin opción + # que lo apague y su gschema sellado trae `enabled-extensions`. Lo que faltaba era que hubiera + # alguna, y va de RAÍZ por la lección de `foot` que este fichero ya aprendió tres veces. + # ⚠ NO hace falta glib-networking ni TLS: eso sólo lo pide BAJARLAS desde extensions.gnome.org + # con el descargador del shell. Empaquetada, se instala como cualquier receta. + # La receta se construye desde el REPO del autor (tag v72), no desde el zip de EGO: hammer extrae + # con `tar -x` y GNU tar no lee zip, y además el zip es un artefacto que construye EGO a partir + # de ese mismo repo. El layout instalado se verificó CONTRA ese zip: idéntico, sin sobras ni + # faltantes. + "gnome-shell-extension-blur-my-shell", ] [perfil.escritorio-cosmic] diff --git a/recipes/incoming-gnome/gnome-shell-extension-blur-my-shell.toml b/recipes/incoming-gnome/gnome-shell-extension-blur-my-shell.toml new file mode 100644 index 00000000..2464414c --- /dev/null +++ b/recipes/incoming-gnome/gnome-shell-extension-blur-my-shell.toml @@ -0,0 +1,115 @@ +# blur-my-shell 72 — PRIMERA extensión de GNOME Shell del catálogo, y la que fija el patrón. +# +# ══ POR QUÉ EXISTE ═════════════════════════════════════════════════════════════════════════════ +# GNOME manda a propósito una cáscara mínima y el ecosistema la completa con extensiones. Sin +# ninguna empaquetada, nuestra imagen de GNOME es esa cáscara: el shell SÍ sabe cargarlas +# —`ui/extensionSystem.js` va en el gresource sin opción que lo apague, y su gschema sellado trae +# `enabled-extensions`— pero no hay ninguna que cargar. +# +# ══ LA FUENTE ES EL REPO DEL AUTOR, NO EL ZIP DE extensions.gnome.org ══════════════════════════ +# EGO publica un `.zip` por versión con URL inmutable, que parecía la fuente obvia. Dos razones +# para no usarlo: +# 1. **hammer no lo sabe abrir.** El fetch extrae con `tar -x` (fetch.rs:581) y GNU tar no lee +# zip — comprobado: «This does not look like a tar archive». Ninguna receta del corpus usa +# .zip. Soportarlo sería tocar el fetcher y sumarle una herramienta al host. +# 2. **Y aunque lo abriera, no es la fuente.** El zip de EGO es un ARTEFACTO que construye EGO a +# partir de este mismo repo. Pinear el zip es pinear el binario de un tercero; pinear el +# commit es pinear el código del autor, que es lo que hace el resto del corpus. +# El tag `v72` es el que EGO sirve para shell 48: verificado preguntándole +# (`extension-info/?uuid=blur-my-shell@aunetx&shell_version=48` → version 72) y confirmado en el +# `metadata.json` del propio zip, que declara shell-version ['46','47','48','49','50']. +# ⚠ Eso hay que preguntarlo por extensión, no asumirlo: nixpkgs va por GNOME 50 y hay extensiones +# que ya sólo declaran el major nuevo. +# +# ══ SE INSTALA A MANO Y NO CON `gnome-extensions pack` ═════════════════════════════════════════ +# El `make build` de upstream llama a `gnome-extensions pack`, que es el CLI `extensions-tool` del +# propio gnome-shell — y nuestra receta del shell va con `-Dextensions_tool=false`. Encenderlo +# costaría una receta nueva (gnome-autoar) y re-hashear gnome-shell entero. +# No hace falta: `pack` sólo arma el zip que después alguien descomprime. Lo que el shell lee es un +# DIRECTORIO en /usr/share/gnome-shell/extensions//, así que se copia el árbol directamente. +# El layout no se inventó: se leyó del zip de EGO v72, que es la salida de ese mismo `pack` — +# `src/*` va a la raíz, `resources/icons`→`icons/`, `resources/ui`→`ui/`, más metadata.json y +# LICENSE. +# +# ⚠ El zip de EGO **no trae `gschemas.compiled`** (verificado): trae el .xml y quien instala +# compila. Por eso `glib-compile-schemas` va en el install y `glib` en [deps] — sin eso la +# extensión carga y muere al abrir sus preferencias, que es el fallo que no se ve al sellar. +name = "gnome-shell-extension-blur-my-shell" +version = "72" +# licencia: el README del commit pineado lo dice con todas las letras — «This program is distributed +# under the terms of the GNU General Public License, version 3 or later». ⚠ La evidencia NO es el +# fichero LICENSE: ahí sólo está el texto del GPL, y su apéndice «How to Apply» contiene la frase +# «either version 3 … or any later version» SIEMPRE, así que grepearla da positivo aunque el +# proyecto sea -only. Y el árbol JS no lleva cabecera de licencia en ningún fichero (verificado). +license = "GPL-3.0-or-later" + +[source] +repo = "https://github.com/aunetx/blur-my-shell" +commit = "444df605b34529dfab7be77d0f434bf54a6dd4cc" # tag v72 (ADR 0006: commit fijo, nunca HEAD) + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +# No hay nada que compilar: son JS, XML de esquema y catálogos de traducción. +configure = "true" +compile = "true" +install = ''' +set -e +UUID="blur-my-shell@aunetx" +D="/out/usr/share/gnome-shell/extensions/$UUID" +mkdir -p "$D" + +# 1. El árbol, con la MISMA forma que produce `gnome-extensions pack` (leída del zip de EGO v72). +cp -r src/. "$D/" +cp metadata.json LICENSE "$D/" +cp -r resources/icons "$D/icons" +cp -r resources/ui "$D/ui" + +# 2. El esquema: se copia el .xml Y se compila. El shell abre las preferencias con +# Gio.SettingsSchemaSource.new_from_directory, que necesita el gschemas.compiled. +mkdir -p "$D/schemas" +cp schemas/*.gschema.xml "$D/schemas/" +glib-compile-schemas "$D/schemas" + +# 3. Traducciones: un .mo por idioma, nombrado por el UUID (así lo busca el shell). +for po in po/*.po; do + lang="$(basename "$po" .po)" + mkdir -p "$D/locale/$lang/LC_MESSAGES" + msgfmt -o "$D/locale/$lang/LC_MESSAGES/$UUID.mo" "$po" +done + +# 4. INSTALADA ≠ ACTIVA. El shell sólo carga las extensiones que estén en la clave +# `org.gnome.shell enabled-extensions`, así que sin esto el artefacto sella, el fichero está en +# la imagen y NO PASA NADA al arrancar — el mismo cuadro de «sellado ≠ instalado» que este repo +# ya se comió con foot, mpv y libnotify, un escalón más abajo. +# Se hace con un override de GSettings, que cambia el DEFAULT sin tocar la config del usuario +# (quien no la quiera la apaga y su dconf gana). El `gnome-start-qemu.sh` corre +# `glib-compile-schemas` sobre este directorio en el primer arranque, así que el override entra. +# +# ⚠ TRAMPA PARA LA SEGUNDA EXTENSIÓN: `enabled-extensions` es un ARRAY y esto lo escribe ENTERO. +# Si mañana otra receta instala su propio override para la misma clave, no se suman: gana el +# fichero que compile último (orden alfabético) y la otra extensión queda instalada y muerta, +# sin error. Cuando llegue la segunda, la lista pasa a un solo sitio que las liste a todas. +mkdir -p /out/usr/share/glib-2.0/schemas +cat > /out/usr/share/glib-2.0/schemas/60_hammer-extensiones.gschema.override <