Ir al contenido principal

Cambiar fondo de pantalla de Gnome Display Manager (GDM)


 
Logotipo de Gnome con referencia a GDM

Después de la parada por vacaciones vuelvo otra vez con nuevas entradas para el blog. Por recomendación he dejado de lado, por un tiempo, el tema de la programación. Pues como bien me dijeron este es un blog de Ubuntu y debería escribir algo más que sobre temas de programación.
Me decidí por hacer esta entrada sobre el gestor de pantalla de Gnome pensando que iba a ser un artículo fácil que no me llevaría mucho tiempo. ¡Qué equivocado estaba! La documentación oficial del GDM está obsoleta. Por lo que he tenido que investigar, leer y practicar lo que voy a explicar en este artículo. Así que lo que inicialmente pensaba me iba a llevar poco tiempo, me ha llevado más de una semana realizarlo. Después de esta diatriba es hora de comenzar.

¿Qué es el GDM? 

GNOME Display Manager (GDM) es un administrador de pantalla (un administrador de inicio de sesión gráfico) para los sistemas de ventanas X11 y Wayland. También se le conoce como Gestor de Entrada. Esto quiere decir que este programa es el encargado de permitir la entrada de los usuarios en las sesiones gráficas de los citados sistemas de ventanas. Actualmente, en Ubuntu se usa el sistema Wayland

GDM está compuesto por los siguientes componentes:
  • Chooser: un programa usado para seleccionar un host (equipo) remoto para administrar una pantalla de forma remota (gdm-host-chooser).
  • Greeter:  la ventana gráfica de inicio de sesión. Proporcionado por Gnome Shell.
  • PAM: módulo de autentificiación conectable (Pluggable Authentification Module). Encargado de verificar que el usuario que intenta acceder está definido en el sistema y dispone de las credenciales de acceso correctas.
  • X Display Manager Control Protocol (XDMCP): es el protocolo utilizado para manejar las peticiones, y por tanto la comunicación, entre el servidor gráfico y el gestor de entrada.
Desgraciadamente, la configuración de GDM no es tan fácil como debería ser. Por ejemplo, desde la versión 3.16 de Gnome los archivos de temas de Gnome Shell se almacenan en binario (gresource). Esto hace que la edición de los temas sea más complicada. En este momento no existe una utilidad gráfica que permita modificar estos temas. Yo, personalmente, he intentado cambiar el fondo de GDM usando Gnome Tweaks (Retoques de Gnome). Un programa que nos permite personalizar la apariencia del Gnome Shell. Sin embargo, en la sección de apariencia de esta herramienta se puede observar que no es posible seleccionar un tema para Gnome Shell. Por lo tanto, deberemos realizar los retoques que queramos para el GDM usando otros métodos.
Captura del Gnome Tweak en la que se muestra cómo está bloqueado la selección para el tema de Gnome Shell

Cambiar el fondo de pantalla del GDM

Para poder cambiar el fondo de pantalla del GDM podemos utilizar dos métodos. Uno más manual y otro por medio de un script que recomiendo por su facilidad. Explico el método manual porque así podremos ver las tripas del tema de Gnome Shell, y también podremos realizar el cambio del fondo de pantalla si nos fallara el script en las siguientes actualizaciones de Ubuntu.

Método manual

Lo primero que debemos hacer para poder cambiar el fondo de pantalla utilizando este método es extraer el tema del Gnome Shell del archivo binario. Lo podemos hacer de una forma manual pura o asistiéndonos de un script para la extracción.
El método manual puro implica la utilización del comando gresource.
En Ubuntu 20.04 por defecto viene instalado el tema Yaru, por lo que el archivo de recursos que debemos modificar será el que se encuentra en /usr/share/gnome-shell/theme/Yaru/gnome-shell-theme.gresource. Si tuviéramos otro tema instalado debemos utilizar el archivo de recursos correspondiente a ese tema. Todas las operaciones para la extracción del contenido de este archivo de recursos se harán en la terminal. Por lo tanto, debemos abrir una usando la secuencia CTRL+ALT+T.
A continuación guardaremos una copia de seguridad del tema original en un directorio de nuestro home, que será donde realizaremos la extracción:

mkdir /home/usuario/shell-theme

cp /usr/share/gnome-shell/theme/Yaru/gnome-shell-theme.gresource /home/usuario/shell-theme

Una vez hecho esto, nos posicionamos en la carpeta y examinamos el contenido del fichero de recursos usando:

gresource list gnome-shell-theme.gresource

Se nos mostrará algo así como esto:
Salida del comando gresource
Con esto en pantalla debemos recrear la estructura de directorios en nuestra carpeta temporal. Obviaremos /org/gnome/shell y comenzaremos a partir de theme.

mkdir -p theme/Yaru-dark

mkdir -p theme/Yaru

mkdir -p theme/icons/scalable/actions

mkdir -p theme/icons/scalable/status

Una vez que tenemos creada la estructura de directorios, procederemos a la extracción del contenido del fichero de recursos (un comando para cada uno de los ficheros):

gresource extract gnome-shell-theme.gresource /org/gnome/shell/theme/Yaru-dark/gnome-shell-high-contrast.css > theme/Yaru-dark/gnome-shell-high-contrast.css

gresource extract gnome-shell-theme.gresource /org/gnome/shell/theme/Yaru-dark/gnome-shell.css > theme/Yaru-dark/gnome-shell.css

gresource extract gnome-shell-theme.gresource /org/gnome/shell/theme/calendar-today.svg > theme/calendar-today.svg

.

.

.

gresource extract gnome-shell-theme.gresource /org/gnome/shell/theme/toggle-on.svg > theme/toggle-on.svg

Todo este trabajo manual nos lo podemos ahorrar si utilizamos un script que, tras mucho buscar, he obtenido de la página de ArchWiki. El script lo crearemos en una carpeta temporal y le daremos los permisos de ejecución necesarios. Es decir, crearemos un fichero llamado extractgst.sh y le pondremos el contenido que se detalla a continuación (Sólo lo que está a partir de la línea). Asignaremos los permisos por terminal con la orden chmod 775 extractgst.sh (si estamos en el mismo directorio que el script).

extractgst.sh


#!/bin/sh

gst=/usr/share/gnome-shell/theme/Yaru/gnome-shell-theme.gresource

workdir=${HOME}/shell-theme

for r in `gresource list $gst`; do

r=${r#\/org\/gnome\/shell/}

if [ ! -d $workdir/${r%/*} ]; then

  mkdir -p $workdir/${r%/*}

fi

done

for r in `gresource list $gst`; do

    gresource extract $gst $r  > $workdir/${r#\/org\/gnome\/shell/}

done

Este script revisa el contenido del fichero /usr/share/gnome-shell/theme/Yaru/gnome-shell-theme.gresource y genera un directorio en el home del usuario llamado shell-theme con todo el contenido del tema del Gnome Shell. La estructura de esa nueva carpeta será:

Salida del comando tree con la estructura generada por el script de extracción


Una vez generado el directorio con el tema, entramos y en el directorio theme, copiamos la imagen que queremos poner como fondo del GDM. Debe estar en formato JPG o PNG:

cp /ruta a la imagen/fondo-gdm.jpg ~/shell-theme/theme

A continuación editamos el fichero gdm3.css y buscamos dentro de él la cadena de caracteres #lockDialogGroup.
Vemos que esa sección tiene el siguiente contenido:

#lockDialogGroup {

  background-color: #4f194c; }

Sustituimos esa sección por este otro valor:

#lockDialogGroup {

background: url('resource:///org/gnome/shell/theme/fondo-gdm.jpg');

background-size: cover; }"

Ahora llega el momento de volver a compilar el fichero de recursos. Para eso utilizaremos el comando glib-compile-resources. Sin embargo, antes de la compilación debemos crear un fichero XML con la definición del contenido del fichero de recursos. El fichero debe contener todos los ficheros de nuestro árbol y debería quedar más o menos así. 
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/org/gnome/shell/theme"> <file>calendar-today.svg</file> <file>checkbox-focused.svg</file> <file>checkbox-off-focused.svg</file> <file>checkbox-off.svg</file> <file>checkbox.svg</file> <file>dash-placeholder.svg</file> <file>gdm3.css</file> <file>Yaru-dark/gnome-shell-high-contrast.css</file> <file>Yaru-dark/gnome-shell.css</file> <file>Yaru/gnome-shell-high-contrast.css</file> <file>Yaru/gnome-shell.css</file> <file>icons/scalable/actions/pointer-double-click-symbolic.svg</file> <file>icons/scalable/actions/pointer-drag-symbolic.svg</file> <file>icons/scalable/actions/pointer-primary-click-symbolic.svg</file> <file>icons/scalable/actions/pointer-secondary-click-symbolic.svg</file> <file>icons/scalable/status/eye-not-looking-symbolic.svg</file> <file>icons/scalable/status/eye-open-negative-filled-symbolic.svg</file> <file>icons/scalable/status/keyboard-caps-lock-filled-symbolic.svg</file> <file>icons/scalable/status/keyboard-enter-symbolic.svg</file> <file>icons/scalable/status/keyboard-hide-symbolic.svg</file> <file>icons/scalable/status/keyboard-layout-filled-symbolic.svg</file> <file>icons/scalable/status/keyboard-shift-filled-symbolic.svg</file> <file>icons/scalable/status/message-indicator-symbolic.svg</file> <file>no-events.svg</file> <file>no-notifications.svg</file> <file>pad-osd.css</file> <file>process-working.svg</file> <file>toggle-off-dark.svg</file> <file>toggle-off-hc.svg</file> <file>toggle-off.svg</file> <file>toggle-on-dark.svg</file> <file>toggle-on-hc.svg</file> <file>toggle-on.svg</file> <file>fondo-gdm.jpg</file> </gresource> </gresources>
Con el fichero de definición ya preparado procedemos a compilar el recurso:

glib-compile-resources gnome-shell-theme.gresource.xml

Puede ser que te de un error, en ese caso debes instalar la librería libglib2.0-dev-bin para tener disponible la herramienta de compilación. 
Tras la compilación se habrá creado un fichero con el nombre gnome-shell-theme.gresource. Este fichero tendremos que copiarlo a la ruta del tema.

sudo cp gnome-shell-theme.gresource /usr/share/gnome-shell/Yaru/gnome-shell-theme.gresource

Finalmente nos queda sólo reiniciar el servicio GDM (sudo service gdm3 restart). Sin embargo, reiniciar el GDM cerrará todas las sesiones abiertas en el sistema, así que asegúrate de haber grabado lo que tengas pendiente. Quizás prefieras reiniciar el equipo.

Usando un script para la configuración

Todo este trabajo se puede simplificar usando un script que lo haga  automáticamente por nosotros. Este script existe y, de casualidad, lo encontré en esta página https://github.com/thiggy01/change-gdm-background. Los pasos a seguir están explicados en la propia página de GitHub, aunque en inglés. Para facilitar las cosas a aquellos que no entiendan ese idioma los pondré a continuación.
Antes que nada he de advertirles que el script sólo funciona con Ubuntu 20.04, 21,10 y 21.04.

Prerrequisitos

En primer lugar hay que instalar la librería libglib2.0-dev-bin, si no la tienes ya instalada.

sudo apt install libglib2.0-dev-bin

Lo siguiente es descargar el script desde la terminal:

wget github.com/thiggy01/change-gdm-background/raw/master/change-gdm-background

Y, por último, hacerlo ejecutable:

chmod +x change-gdm-background


Modo de usarlo

Suponiendo que estamos en la misma carpeta que el script, hay que ejecutarlo con privilegios de superusuario, por lo que lo haremos con el siguiente comando:

sudo ./change-gdm-background /ruta-a-la-imagen

Si tras la ejecución se muestra el mensaje login image sucessfully changed, entonces, cuando reinicies el GDM o el ordenador, se mostrará la imagen que se seleccionó como fondo de pantalla del GDM.
Se puede restaurar la configuración original del tema de GDM usando el script de esta manera:

sudo ./change-gdm-background --restore

Por último, nos queda añadir que si en vez de querer poner un fondo de pantalla lo que queremos es cambiar el color del fondo actual, lo podemos hacer también con este script. Lo que debemos pasar como parámetro el código hexadecimal del color que queremos en vez de la ruta de la imagen. De este modo la línea de comandos quedaría de la siguiente manera:

sudo ./change-gdm-background \#código_color_hexadecimal

El formato de color hexadecimal debería ser de seis caracteres como \#40f46a o de tres caracteres como \#3df.

Conclusión

Bueno, ya conocemos la forma de cambiar el fondo de pantalla del GDM. No ha sido fácil, pero vale la pena si queremos darle un aspecto más personalizado a nuestro Ubuntu.
Antes de terminar debo hacer una aclaración, al principio del artículo digo que no existe una utilidad gráfica para realizar esta personalización. Sin embargo, escribí eso no sabía que existía el script change-gdm-background. Su autor dice que ha creado de una GUI que se puede descargar y compilar desde aquí. Yo no la he probado, lo dejo ahí para aquel que tenga curiosidad. 

Comentarios

Entradas populares de este blog

Atom ha muerto, viva Zed

El día 8 de junio de 2022, Microsoft anunció que a partir del día 31 de diciembre de este mismo año dejaría de dar soporte para el editor de código Atom .  ¿En qué nos afecta esto a nosotros? Bueno, pues si me han seguido en artículos anteriores saben que tras una comparativa de varios IDEs había decidido utilizar Atom para los ejemplos que tuviera que hacer en este blog. Sobre todo los artículos que prepararé para ilustrar el uso de Laravel . Amén de los miles de programadores que actualmente usan Atom  en sus proyectos, claro. Pero, ¿qué editor de código abierto podremos utilizar para sustituir a Atom ? En el mismo comunicado, Microsoft explicaba que el abandono del proyecto Atom  se debía a que querían volcar todos sus esfuerzos en el Visual Studio Code y, por supuesto, recomendó a los usuarios de Atom la utilización del mismo como alternativa natural. No quiero entrar en las bondades o defectos del Visual Studio Code  si quieres elegirlo como tu IDE para desarrollo predeterm

Zed: ahora un editor de código de código abierto

  Zed: ahora un editor de código de código abierto Introducción Como ya les comenté en un artículo anterior  Atom ha muerto, viva ZED , Microsoft dejó de dar soporte para el editor de código Atom en el año 2022 en beneficio del Visual Studio Code . En aquel artículo les comentaba que para mi el sucesor de Atom era Zed pues era un editor que se estaba creando por el mismo grupo de trabajo que creó el Atom . Además de que parecía que iba a seguir con la misma filosofía con la que nació  Atom . El editor Zed, una descripción de sus características Zed es un editor de código desarrollado en Rust que, como deberíamos saber, es un lenguaje de programación de sistemas que se enfoca en la seguridad, el rendimiento y la concurrencia. Pues, como decíamos, Zed acaba de dar el salto a ser de código abierto bajo la licencia GPL v3 . Este cambio no solo representa una nueva era para Zed , sino que también nos dirige a un nuevo mundo de colaboración y desarrollo en el ámbito de la programación.

Gestión de la red usando la línea de comandos (III): gestión DNS

  Introducción En este nuevo artículo de la serie vamos a hablar de la gestión del DNS, Domain Name System. El sistema de resolución de nombres nos permite traducir los nombres de los dominios de Internet en direcciones IP númericas. Más difíciles de recordar para los humanos.  El DNS fue concebido a mediados de los años 80. Hasta esa época, los ordenadores conectados a una red disponían de una dirección numérica, la dirección IP. Pero con el tiempo, cada vez había más ordenadores conectados a las redes. Esto hacía que cada vez fuera más difícil recordar las direcciones IP. Sobre el año 1983, Paul Mockapetris , un informático estadounidense, desarrolló un sistema jerárquico de nombres para identificar a los ordenadores conectados a una red. Y, a mediados de la década, ya se convirtió en un estándar. Pueden consultar más información sobre el sistema DNS consultando el artículo de la Wikipedia: Sistema de nombres de dominio . En este artículo, no vamos a explicar como montar un servidor