gnome: cursor visible, iconos y el setuid del launch-helper de D-Bus

adwaita-icon-theme b3:429aef43 + hicolor-icon-theme. No es cosmética: con el cursor por
SOFTWARE —obligatorio en virtio-gpu— mutter dibuja la imagen que le da el tema, y sin
tema el puntero se movía INVISIBLE. Ahora se ve en la captura, y la notificación del
shell tiene su icono. Colores distintos 582 → 618.

hicolor arrastrada por `Inherits=hicolor` del index.theme de Adwaita: la cadena de
fallback tiene que terminar en algo que sea un TEMA (con su index.theme), no sólo un
directorio. No trae un solo icono propio — es el contrato, no el contenido.

Dos gotchas medidos:
- **hicolor 0.18 pasó de autotools a meson**: su tarball ya no trae `configure` (127).
- adwaita declara `gtk-update-icon-cache` como `required: true` para un
  `add_install_script` que **su propio autor marcó `skip_if_destdir: true`** — exige un
  binario que en un build empaquetado no puede ejecutar. Se borran los dos bloques.
  `required: false` NO alcanza: meson no propaga el disabler dentro de
  add_install_script y revienta con «Unhandled python exception». Se descartó declarar
  gtk4 como dep: acoplaría el hash de un paquete de DATOS al del toolkit.

**El setuid del launch-helper es la causa raíz de dos síntomas, no de uno.** El
`dbus-daemon-launch-helper` comprueba sus propios permisos antes de activar nada y se
niega si no es setuid root — de ahí el «The permission of the setuid helper is not
correct» de colord. Sin eso NINGUNA activación por bus de sistema funciona, que es
también por qué UPower timeouteaba a los 25s. La imagen ahora lo deja root:messagebus 4750.

Y `gnome-start` lanza upowerd, pero **verificando**: la primera versión decía «lanzado»
y el shell seguía esperando 25s. Un pid no es un servicio. Ahora comprueba que siga vivo
y, si murió, vuelca su log. Además crea los directorios de estado que upower deriva de
--prefix y sin los cuales se muere en silencio.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 18:59:46 -04:00
co-authored by Claude Opus 5
parent df43352786
commit 3999b421da
5 changed files with 144 additions and 0 deletions
+33
View File
@@ -38,6 +38,14 @@ export XDG_SESSION_TYPE=wayland
export HOME=/root
export GSETTINGS_SCHEMA_DIR=/usr/share/glib-2.0/schemas
export LANG=C.UTF-8
# XCURSOR_PATH/XCURSOR_THEME: sin tema de cursor mutter avisa «No cursor theme available» y —con el
# cursor por software, que en virtio-gpu es obligatorio— el puntero se mueve INVISIBLE. Lo provee
# `adwaita-icon-theme`, y el nombre del tema tiene que coincidir con el directorio bajo
# /usr/share/icons. El `org.gnome.desktop.interface cursor-theme` de GSettings dice lo mismo, pero
# estas variables las lee también libXcursor/wayland-cursor sin pasar por GSettings.
export XCURSOR_PATH=/usr/share/icons
export XCURSOR_THEME=Adwaita
export XCURSOR_SIZE=24
# --- render por software sobre virtio-gpu (los mismos fixes que costaron la campaña KDE) ---
export LIBGL_ALWAYS_SOFTWARE=1
@@ -221,6 +229,31 @@ else
say "!! sin /usr/libexec/accounts-daemon — el menú de usuario del shell va a fallar"
fi
# upowerd: el servicio de energía. Mismo caso que accounts-daemon —el shell lo consulta por D-Bus
# para el indicador de batería— y el mismo motivo para lanzarlo a mano: sin esto la activación por bus
# se queda esperando y el log lo dice sin ambigüedad,
# Error calling StartServiceByName for org.freedesktop.UPower:
# Failed to activate service ... timed out (service_start_timeout=25000ms)
# o sea VEINTICINCO SEGUNDOS de arranque tirados esperando algo que nunca iba a venir.
# Los directorios de estado los deriva upower de --prefix (historydir/statedir vacíos ⇒
# $prefix/var/lib/upower); si no existen, arranca y se muere sin ruido.
mkdir -p /usr/var/lib/upower /var/lib/upower
if [ -x /usr/libexec/upowerd ]; then
/usr/libexec/upowerd >/tmp/upowerd.log 2>&1 &
UPOWERD_PID=$!
say "upowerd lanzado (pid $UPOWERD_PID)"
# Chequeo real, no «lo lancé y confío»: la primera versión reportaba «lanzado» y el shell seguía
# esperando 25s por org.freedesktop.UPower. Un pid no es un servicio.
sleep 1
if alive $UPOWERD_PID; then
say "upowerd sigue vivo"
else
say "!! upowerd MURIÓ al arrancar:"; dump /tmp/upowerd.log
fi
else
say "!! sin upowerd — el shell va a esperar 25s a su activación D-Bus y seguir sin batería"
fi
if [ "${DIAG:-1}" = 1 ]; then
ulimit -c unlimited 2>/dev/null || true
echo '/core.%e.%p' > /proc/sys/kernel/core_pattern 2>/dev/null || true
+4
View File
@@ -47,6 +47,10 @@ else
# (GTK3/X11) pero el shell lee sus esquemas al construir los quick settings, y si faltan la
# excepción ocurre DENTRO de Main.start() ⇒ el panel no se arma y la pantalla queda negra.
recipes/incoming-gnome/gsd-schemas.toml
# Ni typelib ni esquema: DATOS. `adwaita-icon-theme` trae los iconos y —lo que importa para que
# el escritorio sea usable— los CURSORES. Con el cursor por software (obligatorio en virtio-gpu)
# y sin tema, el puntero se mueve invisible. Arrastra hicolor-icon-theme por `Inherits=hicolor`.
recipes/incoming-gnome/adwaita-icon-theme.toml
)
fi
+15
View File
@@ -140,6 +140,21 @@ for f in passwd:messagebus:x:81:81:messagebus:/dev/null:/sbin/nologin group:mess
fi
done
# El launch-helper del bus de SISTEMA tiene que ser setuid root. Es el que dbus-daemon ejecuta para
# activar un servicio bajo demanda, y comprueba SUS PROPIOS permisos antes de hacer nada: si no es
# setuid root, se niega, y el cliente recibe
# Error calling StartServiceByName for <servicio>: The permission of the setuid helper is not correct
# que es exactamente lo que reportaba colord al arrancar la sesión. Sin esto **ninguna** activación
# por bus de sistema funciona; con esto, cualquier servicio con su `.service` instalado arranca solo y
# no hace falta lanzarlo a mano desde `gnome-start`.
for h in usr/libexec/dbus-daemon-launch-helper usr/lib/dbus-1.0/dbus-daemon-launch-helper; do
if [ -f "$MERGED/$h" ]; then
chown 0:81 "$MERGED/$h" 2>/dev/null || true # root:messagebus
chmod 4750 "$MERGED/$h"
echo " ✓ setuid en /$h"
fi
done
# GNOME_MODE se hornea como fichero: el getty ejecuta gnome-start sin ambiente heredable.
printf 'GNOME_MODE=%s\n' "${GNOME_MODE:-drm}" > "$MERGED/etc/gnome-mode"
echo "==> modo de arranque: ${GNOME_MODE:-drm}"