cosmic: recetas del compositor, del fondo y del tema de iconos (cola incoming-cosmic)

cosmic-comp es LA pieza y la receta salió casi gratis: mirada-compositor ya
probó que smithay construye en este lab, y las deps en C de smithay dependen de
las features del backend, no del compositor. La lista es la misma menos
linux-pam y más libdisplay-info.

libdisplay-info y hwdata entran COPIADAS byte a byte de la cola GNOME (idénticas
a las de KDE): las deps resuelven hermano→padre, así que desde incoming-cosmic
no se ven las de otra cola. Verificado que el hash NO se mueve (b3:260f0519 y
b3:bdc36cf9) ⇒ los artefactos ya sellados sirven y la copia no cuesta un build.

cosmic-bg va antes que el resto de los clientes porque separa dos preguntas:
habla Wayland por smithay-client-toolkit y NO toca libcosmic/iced, así que si el
fondo pinta y el panel no, el problema es de la capa de UI y no del transporte.

Toda la suite está tagueada epoch-1.5.0, confirmado repo por repo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 10:43:23 -04:00
co-authored by Claude Opus 5
parent e1564614e1
commit bc6f664650
5 changed files with 191 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
# cosmic-bg — el que pinta el fondo de pantalla. Es un cliente Wayland normal, uno de los que
# `cosmic-session` levanta después del compositor.
#
# ── POR QUÉ ES EL SEGUNDO CLIENTE QUE SE CONSTRUYE ──────────────────────────────────────────────
# Porque separa dos preguntas que en el resto de la suite vienen pegadas. cosmic-bg habla Wayland con
# `smithay-client-toolkit` —la implementación en Rust del protocolo, sin libwayland— y decodifica
# imágenes con crates puros (image, jxl-oxide, fast_image_resize). **No toca libcosmic ni iced.**
# Así que si el fondo pinta y el panel no, el problema es de la capa de UI, no del transporte.
#
# De ahí que vaya `link = "static"`, a diferencia del compositor: acá no hay una sola dep en C.
#
# El árbol es un workspace con `config/` como miembro (cosmic-bg-config), que es lo que leen los
# demás componentes para saber qué fondo hay puesto. Los defaults van a `/usr/share/cosmic/<APPID>/`
# con la misma convención de cosmic-config que en cosmic-comp: **el nombre del fichero ES la clave**.
name = "cosmic-bg"
version = "1.5.0"
[source]
tarball = "https://github.com/pop-os/cosmic-bg/archive/epoch-1.5.0/cosmic-bg-epoch-1.5.0.tar.gz"
sha256 = "12b30c60e15ac6c0f4b3eca8c37642145683e830833b429958222dfc395db177"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
# Un único target para `cargo rustc --` (ver el comentario de cosmic-comp): el workspace trae también
# la lib de config.
flags = ["--bin", "cosmic-bg"]
[build.phases]
install = '''
mkdir -p /out/usr/bin /out/usr/share/cosmic/com.system76.CosmicBackground
cp target/release/cosmic-bg /out/usr/bin/cosmic-bg
chmod 755 /out/usr/bin/cosmic-bg
cd data && find v1 -type f -exec install -Dm0644 {} /out/usr/share/cosmic/com.system76.CosmicBackground/{} \;
'''
+73
View File
@@ -0,0 +1,73 @@
# cosmic-comp — el compositor Wayland de COSMIC (System76), sobre smithay. **Es LA pieza**: el resto
# de la suite son clientes suyos, así que si esto no construye, COSMIC no existe en hammer.
#
# ── POR QUÉ ESTA RECETA ES CASI GRATIS DE ESCRIBIR ──────────────────────────────────────────────
# `mirada-compositor` ya es un compositor smithay construido por este lab, y las deps en C de smithay
# no dependen del compositor sino de las features del backend: drm-sys→libdrm, gbm-sys→mesa,
# libseat-sys→seatd, input-sys→libinput, libudev-sys→libudev-zero, y wayland-server.pc→libffi/expat.
# La lista de abajo es LA MISMA que la de mirada, menos linux-pam (cosmic-comp no autentica: eso es de
# cosmic-greeter) y más `libdisplay-info`. Ese es el rédito de haber hecho mirada primero.
#
# ── LAS TRES FEATURES QUE ASUSTAN Y NO CUESTAN DEPS DE BUILD ────────────────────────────────────
# smithay entra con `backend_vulkan`, `backend_x11` y `xwayland` prendidas (están fijas en su
# Cargo.toml, no se eligen desde la CLI), y ninguna agrega una librería a enlazar:
# · `backend_vulkan` → el crate `ash`, que carga Vulkan por **dlopen**;
# · `backend_x11` → `x11rb` con `dl-libxcb`, que hace lo mismo con libxcb;
# · `xwayland` → `x11rb` puro; lo que hace falta es el BINARIO Xwayland, y eso es runtime.
# O sea que libxcb/vulkan-loader son deuda de RUNTIME (y viven hoy sólo en la cola KDE), no un muro
# de compilación. Si algo de esto se rompe, el error va a ser en runtime y va a decir cuál falta.
#
# `libdisplay-info` sí es real: el crate 0.3 es un binding -sys que resuelve por pkg-config. La receta
# entra COPIADA byte a byte de la cola GNOME (y es idéntica a la de KDE), así que su hash no se mueve
# —b3:260f0519— y el artefacto ya sellado sirve tal cual: la copia no cuesta un build.
#
# `default = ["systemd"]` queda: el crate `libsystemd` es una **reimplementación en Rust**, no un
# binding a la C, así que no arrastra systemd; y `logind` habla `org.freedesktop.login1`, que en hammer
# lo sirve arje-logind-compat. Igual criterio que cosmic-session.
#
# Enlace DINÁMICO como mirada-compositor: smithay enlaza libdrm/gbm/seat/input de verdad y hace dlopen
# de EGL/wayland/xkbcommon; un estático acá no es una postura, es una mentira.
name = "cosmic-comp"
version = "1.5.0"
[source]
tarball = "https://github.com/pop-os/cosmic-comp/archive/epoch-1.5.0/cosmic-comp-epoch-1.5.0.tar.gz"
sha256 = "ebdc79bd667b6ee167fcf5c4a616f56db7c24adfabc11ab3c3e572c5b2a52421"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
# `--bin cosmic-comp` no es cosmético: la fase compile del lab usa `cargo rustc -- -C …`, y
# `cargo rustc` EXIGE un único target cuando hay flags después del `--`. El paquete trae binario +
# lib + ejemplos, así que sin el filtro corta con «extra arguments to `rustc` can only be passed to
# one target». Mismo motivo por el que helix lleva `--bin hx`.
flags = ["--bin", "cosmic-comp"]
[build.phases]
# El `install` del Makefile de upstream, sin las unidades de systemd (acá el que supervisa es arje) y
# sin `cosmic-service`, que sólo existe para ellas.
#
# ⚠ Las dos rutas largas NO son decorativas y no se pueden «ordenar»: cosmic-config guarda cada clave
# en UN FICHERO cuyo NOMBRE ES LA CLAVE, bajo `<componente>/v1/`. O sea que
# `.../CosmicSettings.Shortcuts/v1/defaults` significa la clave `defaults` del componente Shortcuts.
# Renombrar el fichero o aplanar el árbol no rompe el build: deja el escritorio SIN ATAJOS DE TECLADO,
# que en un compositor teselante es quedarse sin manejarlo.
#
# Y NO se instala el `data/cosmic.desktop` de este repo, aunque exista: es el de la «bare session»
# —arrancar el compositor sin gestor de sesión—, su `Exec` apunta a `/usr/bin/cosmic-service` (que
# vive en la rama de systemd que acá no va) y **colisiona en la misma ruta** con el que ya instala
# cosmic-session. Dos artefactos escribiendo `/usr/share/wayland-sessions/cosmic.desktop` es una
# carrera de orden de hidratación, y la que perdería es la entrada BUENA.
install = '''
mkdir -p /out/usr/bin \
/out/usr/share/cosmic/com.system76.CosmicSettings.Shortcuts/v1 \
/out/usr/share/cosmic/com.system76.CosmicSettings.WindowRules/v1
cp target/release/cosmic-comp /out/usr/bin/cosmic-comp
chmod 755 /out/usr/bin/cosmic-comp
cp data/keybindings.ron /out/usr/share/cosmic/com.system76.CosmicSettings.Shortcuts/v1/defaults
cp data/tiling-exceptions.ron /out/usr/share/cosmic/com.system76.CosmicSettings.WindowRules/v1/tiling_exception_defaults
'''
[deps]
build = ["mesa", "wayland", "wayland-protocols", "libdrm", "seatd", "libinput", "libudev-zero", "libevdev", "mtdev", "libxkbcommon", "pixman", "expat", "zlib", "zstd", "libffi", "pkgconf", "libdisplay-info"]
+34
View File
@@ -0,0 +1,34 @@
# cosmic-icons — el tema de iconos «Cosmic» de COSMIC. Sin código: SVGs y un `index.theme`.
#
# Es dep de RUNTIME de casi toda la suite (panel, launcher, settings, app-library) y de ninguna en
# build. Va primero igual porque cuesta segundos y porque la lección ya la pagó GNOME dos veces: un
# escritorio sin tema de iconos no se ve «sin iconos», se ve ROTO — y con el cursor por software
# (obligatorio en render por CPU) directamente no se ve el puntero.
#
# `just install` de upstream traducido: son tres `find -exec install` a `/usr/share/icons/Cosmic`.
# `extra/` no es opcional pese al nombre: ahí viven los iconos propios de COSMIC (los de freedesktop
# son los estándar). Falta `hicolor-icon-theme`, que es de quien hereda cualquier tema: ya está en el
# corpus por la campaña GNOME y entra por la imagen, no por acá.
name = "cosmic-icons"
version = "1.5.0"
[source]
tarball = "https://github.com/pop-os/cosmic-icons/archive/epoch-1.5.0/cosmic-icons-epoch-1.5.0.tar.gz"
sha256 = "e6caffc4c93f5afdaae3fbda4f3cc14363d3539cda1b0c5f478d32a8bb141c4c"
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "dynamic"
flags = []
[build.phases]
configure = 'true'
compile = 'true'
install = '''
ICONS=/out/usr/share/icons/Cosmic
mkdir -p "$ICONS"
install -Dm0644 index.theme "$ICONS/index.theme"
cd freedesktop && find ./scalable -type f -exec install -Dm0644 {} "$ICONS"/{} \; && cd ..
cd extra && find ./scalable -type f -exec install -Dm0644 {} "$ICONS"/{} \; && cd ..
'''
+24
View File
@@ -0,0 +1,24 @@
# hwdata 0.393 — bases de datos de IDs de hardware (pnp.ids, pci.ids, usb.ids) + hwdata.pc. Sin código:
# sólo datos. Campaña KDE (ADR 0011): lo exige libdisplay-info en tiempo de build (dependency('hwdata')
# native → pkgdatadir/pnp.ids) y kwin como RUNTIME (find_package(hwdata) TYPE RUNTIME, tabla PNP de EDID).
# `configure` es un script shell propio (no autoconf); no compila nada.
name = "hwdata"
version = "0.393"
[source]
tarball = "https://github.com/vcrhonek/hwdata/archive/refs/tags/v0.393.tar.gz"
sha256 = "322add86944680e99d04468d49de180a7ce0c77fb406f7abde8ab14f2d161051"
[build]
compiler = "gcc"
target = "x86_64-linux-musl"
link = "dynamic"
flags = []
[build.phases]
configure = './configure --prefix=/usr --libdir=/usr/lib --datadir=/usr/share'
compile = 'true'
install = 'make install DESTDIR=/out'
[deps]
build = ["pkgconf"]
@@ -0,0 +1,24 @@
# libdisplay-info 0.2.0 — parseo de EDID/DisplayID (libdisplay-info.so). Campaña KDE (ADR 0011): sustrato
# de kwin (pkg_check_modules(libdisplay-info>=0.2.0) REQUIRED, lectura de EDID de los monitores). Meson.
# En build necesita pnp.ids: usa dependency('hwdata') native → si no está, cae a /usr/share/hwdata/pnp.ids
# y meson `files()` EXIGE que exista ⇒ hwdata es dep de build. Sin di-edid-decode (tool) para evitar más deps.
name = "libdisplay-info"
version = "0.2.0"
[source]
tarball = "https://gitlab.freedesktop.org/emersion/libdisplay-info/-/archive/0.2.0/libdisplay-info-0.2.0.tar.gz"
sha256 = "f7331fcaf5527251b84c8fb84238d06cd2f458422ce950c80e86c72927aa8c2b"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
zig_version = "0.13.0"
[build.phases]
configure = "PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig meson setup output --prefix=/usr --buildtype=release"
compile = "ninja -C output"
install = "DESTDIR=/out ninja -C output install"
[deps]
build = ["meson", "samurai", "python3", "pkgconf", "hwdata"]