Ceci est une ancienne révision du document !



Personnaliser l'arrière-plan de GDM

GDM est le gestionnaire de sessions de l'environnement GNOME et son bureau GNOME Shell.

Son arrière-plan par défaut est (selon les versions) soit gris avec une légère texture, soit violet uniforme. Ce n'est pas forcément très chaleureux, on va donc voir comment modifier cet arrière-plan.

GDM n'a pas été conçu d'une manière facilement configurable. Les manipulations qui vont suivre sont par conséquent risquées pour votre système. Faites attention à :
  • Avoir sauvegardé une version originale des données que vous modifiez ;
  • Avoir la version concernée par la partie que vous appliquez ;
  • Ne pas faire la moindre faute de frappe.
Les mises à jour de GNOME Shell vont systématiquement réinitialiser vos configurations : il faudra alors les refaire.

Cette manipulation n'aura pas un rendu adapté sur les configurations avec plusieurs écrans.

Ce tutoriel a été écrit et testé à partir d'installations d'Ubuntu 17.04 et 17.10 (GNOME Shell 3.24 et 3.26), les versions plus anciennes pourraient rencontrer des problèmes.

Les droits d'administrations seront nécessaires afin d'utiliser la commande sudo.

L'image à mettre en arrière-plan doit être au format .png (et si possible ne pas contenir de transparence). L'image doit être assez sombre (au moins en son centre) pour que les informations affichées par dessus soient lisibles.

À partir d'Ubuntu 17.10, le thème de GDM est modifié par les développeurs d'Ubuntu afin d'assurer une cohérence visuelle avec la session "Ubuntu" par défaut1).

Si vous installez le paquet gnome-session, il est possible de récupérer le thème par défaut "gris-bleu" de GDM en lançant la commande suivante en tant qu'administrateur :
update-alternatives --config gdm3.css

Choisissez alors gnome-shell.css en tapant le numéro adéquat.

En fonction de si vous utilisez (ou non) un thème GDM "violet-orange", les manipulations vont différer :

Exemple de résultat obtenu
Exemple de résultat obtenu (GDM 3.26)

L'image

Par défaut, l'image utilisée par gdm est l'image noise-texture.png du thème principal (par exemple /usr/share/gnome-shell/theme/Yaru/). Il est possible de la remplacer par une autre, renommée (en mode administrateur. Avec Wayland, vous pouvez accéder aux privilèges d'administration dans Nautilus en faisant précéder le chemin de "admin:") noise-texture.png et placée dans le répertoire du thème d'origine mais il est tout à fait possible de pointer vers une autre image présente sur le disque.

Dans l'hypothèse où vous décidez de ne pas modifier noise-texture.png, passez à l'étape suivante une fois repérée l'image choisie (au format png comme rappelé ci-dessus) et son chemin.

Le fichier CSS

Pour personnaliser l'affichage, vous devez intervenir en en tant qu'administrateur dans le fichier css de gdm. Suivant les versions d'Ubuntu, il peut s'agir de :

Version Nom du fichier Remarque
17.10 /usr/share/gnome-shell/theme/ubuntu.css
18.04 /etc/alternatives/gdm3.css
18.10 /etc/alternatives/gdm3.css
19.04 /etc/alternatives/gdm3.css Ce fichier est également accessible par un lien symbolique dans le répertoire /usr/share/gnome-shell/theme/ voire /usr/share/gnome-shell/theme/Yaru/
19.04 /usr/share/gnome-shell/theme/gnome-shell.css Selon les versions et les configurations, il faudra soit modifier ce fichier, soit le fichier gdm3.css. Testez les deux options.

Avant toute intervention, réalisez une copie de secours du fichier css d'origine. En cas de problème, vous pourrez ainsi rétablir le système dans son état d'origine :

usr@pc:~$ sudo cp /etc/alternatives/gdm3.css /etc/alternatives/gdm3.css.anc

Vous devez éditer (avec un éditeur de texte, vim pour les amateurs de la ligne de commande mais gedit fait aussi bien les choses en mode graphique avec sudo -H gedit /etc/alternatives/gdm3.css) le fichier css pour faire correspondre (en remplaçant /usr/share/backgrounds/Aardvark_Wallpaper_Grey_4096x2304.png par le chemin absolu de l'image que vous avez choisie, ou par /usr/share/gnome-shell/theme/noise-texture.png si vous avez choisi de remplacer ce fichier par le votre) la section #lockDialogGroup à :

#lockDialogGroup {
  background: #2c001e url(file:///usr/share/backgrounds/Aardvark_Wallpaper_Grey_4096x2304.png);
  background-repeat: no-repeat;
  background-size: cover;
  background-position: center; }
Il est important de bien veiller au respect de la syntaxe css et à remplacer url(resource: par url(file:.
Le "#2c001e" correspond à la couleur, en hexadécimal, qui s'affiche si l'image est mal cadrée ou transparente, sa valeur (violet) n'est pas très importante ici.

Si l'option "cover" ne vous convient pas (image trop déformée),vous devrez sans doute spécifier la résolution de GDM - ce n'est pas forcément celle de l'image - avec le paramètre ci-dessous à intégrer dans la section #lockDialogGroup (bien sûr, [WIDTH] et [HEIGHT] sont à remplacer par vos valeurs) :

background-size: [WIDTH]px [HEIGHT]px;

Un script pour automatiser la modification de l'écran de connexion

Un ubuntero belge propose sur son site en anglais un script permettant d'automatiser ces modifications en mode graphique. Le script utilise le paquet yad pour fonctionner.

#!/bin/bash
	lesFichiersCss=( "/etc/alternatives/gdm3.css" "/usr/share/gnome-shell/theme/gdm3.css"  "/usr/share/gnome-shell/theme/Yaru/gnome-shell.css" "/usr/share/gnome-shell/theme/gnome-shell.css" )
	repDestImageDeFond="/usr/share/backgrounds/"

	if [[ "${repDestImageDeFond: -1}" != "/" ]]; then	#	Chemin doit se terminer par /
		repDestImageDeFond="$repDestImageDeFond""/"
	fi

################################################################
# Script_Name : Modification-fond-d-ecran-Gdm-1.0.sh
# Description : Personnalisation du fond d'écran de la fenêtre de connexion de GDM sur Ubuntu 19.04
# Date : December 2017 - revu juillet 2019
# écrit par : Griffon (traduit en français et un peu revu lors de sa publication sur le site ubuntu-fr.org)
# Web Site :http://www.c-nergy.be - http://www.c-nergy.be/blog
# Version : 1.0
# Remarque importante : Ce script est mis à disposition sans aucune garantie, à utiliser à vos risques et périls....
##################################################################


#---------------------------------------------------#
# Étape 0 - Credits .... 
#---------------------------------------------------#

/bin/echo -e "\e[1;32m###########################################################\e[0m"
/bin/echo -e "\e[1;32mModification-fond-d-ecran-Gdm-1.0.sh\e[0m"
/bin/echo -e "\e[1;32m"$(basename "$0")"\e[0m"
/bin/echo -e "\e[1;32mwritten by Griffon - December 2017 - Version 1.0 - modifié juillet 2019 - Modification-fond-d-ecran-Gdm-1.0.sh\e[0m"
/bin/echo -e "\e[1;32mTraduit en français et un peu revu lors de sa publication sur le site ubuntu-fr.org\e[0m"
/bin/echo -e "\e[1;32m###########################################################\e[0m"
echo

#---------------------------------------------------#
# Étape 1 - Vérification de la présence du paquet yad (zenity utilisé dans le script initial, yad est un "fork" plus puissant)
#---------------------------------------------------#
if [[ $(dpkg -s yad 2>/dev/null | grep Status | cut -d' ' -f4) != "installed" ]]; then
  yad --image=error --title="Installez le paquet yad" --text="Le paquet <b>yad</b> est nécessaire au bon fonctionnement de ce script.\n\nInstallez le paquet par <b>sudo apt-get install yad</b>\n\nArrêt du traitement. Erreur 10."

  exit 10;
fi

#---------------------------------------------------#
# Étape 2 - Choix du fichier css à modifier
#---------------------------------------------------#
	#	Index des fichiers
	NombreDeFichiersPotentiels="${#lesFichiersCss[@]}"
	if [[ "$NombreDeFichiersPotentiels" -gt "0" ]]; then
		listeIndexFichiersPotentiels="0"
		compteur=1 
		while [[ "$compteur" -lt "$NombreDeFichiersPotentiels" ]]; do 
			listeIndexFichiersPotentiels="$listeIndexFichiersPotentiels"" ""$compteur";
			let "compteur++"; 
		done;
	else
		 yad --image=error --title="Aucun fichier à modifier" --text="Aucun chemin de fichier css n'a été indiqué.\nArrêt du traitement.\nErreur 20." 2>/dev/null
		exit 20;
	fi

	#	Constitution de la liste des éléments à afficher par yad	
	ResultatAnalyse=""
	for i in $listeIndexFichiersPotentiels; do

		if [[ -f "${lesFichiersCss[$i]}" ]]; then
			Present["$i"]="0"
			if [[ -L "${lesFichiersCss[$i]}" ]]; then
				FichierLien["$i"]="0"
			else
				FichierLien["$i"]="1"
			fi
		else
			Present["$i"]="1"
			FichierLien["$i"]="1"
		fi

		if [[ "$ResultatAnalyse" == "" ]]; then
			ResultatAnalyse="False ${lesFichiersCss[$i]} £${Present[$i]}£ £${FichierLien[$i]}£"
		else
			ResultatAnalyse="$ResultatAnalyse False ${lesFichiersCss[$i]} £${Present[$i]}£ £${FichierLien[$i]}£"
		fi
	done

	ResultatAnalyse=$(echo "$ResultatAnalyse" | sed 's/£1£/Non/g;s/£0£/Oui/g')

	#	Affichage de la fenêtre de choix
	Selection=$(yad --title="Fichier CSS à modifier" --width 800 --height 200 --text-align="center" --list --radiolist --column="Sélectionné" --column="Fichier" --column="Présent sur le disque" --column="Fichier lien" $ResultatAnalyse 2>/dev/null)

	#	Abandon par l'utilisateur #############
	retour="$?"
	if [[ "$retour" == "1" ]] || [[ "$retour" == "252" ]] ; then
		echo "Arrêt. Traitement terminé. Erreur 30.";
		yad --image=error --title="Abandon" --text="Vous avez abandonné.\nArrêt du traitement.\nErreur 30." 2>/dev/null
		exit 30 ;
	fi
	###########################################	

	LeFichierCSS=$(echo "$Selection" | cut -d'|' -f2)
	echo "Le fichier $LeFichierCSS sera modifié"

	#	Contrôle de sécurité. Est-ce que le fichier existe ?
	if [[ ! -e "$LeFichierCSS" ]]; then 
		echo "Erreur dans le nom du fichier. $LeFichierCSS n'existe pas. Arrêt du traitement. Erreur 40."
		yad --image=error --title="Abandon" --text="$LeFichierCSS n'existe pas.\nArrêt du traitement.\nErreur 40." 2>/dev/null
		exit 40 ;
	fi

#---------------------------------------------------#
# Étape 2 - Choix de l'image retenue.... 
#---------------------------------------------------#

echo
/bin/echo -e "\e[1;32m###########################################################\e[0m"
/bin/echo -e "\e[1;32mChoix du fond d'écran...En cours\e[0m"
/bin/echo -e "\e[1;32m###########################################################\e[0m"
echo

	ImageDeFondOriginelle=$(yad --file --title="Choisissez le nouveau fond d'écran de la fenêtre de connexion" --filename="$HOME/.local/share/backgrounds/*" 2>/dev/null)

	#	Abandon par l'utilisateur #############
	retour="$?"
	if [[ "$retour" == "1" ]] || [[ "$retour" == "252" ]] ; then
		echo "Arrêt. Traitement terminé. Erreur 50.";
		yad --image=error --title="Abandon" --text="Vous avez abandonné.\nArrêt du traitement.\nErreur 50." 2>/dev/null
		exit 50 ;
	fi

	echo "Le fond d'écran choisi est : ""$ImageDeFondOriginelle"

	###########################################	

	# Récupération du nom court du fichier
	NomImageDeFond=$(basename $ImageDeFondOriginelle)
	NomImageDeFond="${NomImageDeFond%${NomImageDeFond: -4}}"
	NomImageDeFond="${NomImageDeFond%640x480}"
	NomImageDeFond="$NomImageDeFond""640x480.png"

	if [[ -e "$repDestImageDeFond$NomImageDeFond" ]]; then	# Si une image du même nom existe déjà dans le répertoire de destination
		echo "$repDestImageDeFond$NomImageDeFond existe déjà."
		index=0
		while [[ -e "$repDestImageDeFond$NomPropose" ]]; do  
			NomPropose=$(basename $ImageDeFondOriginelle)
			NomPropose="${NomPropose%${NomPropose: -4}}"
			NomPropose="${NomPropose%640x480}"
			NomPropose="$NomPropose""640x480_""$index"".png"
			let "index++"
		done

		yad --image=important --text="Saisie incorrecte. Une image à ce nom existe déjà. Acceptez vous le nom suivant ? : \nEn cliquant sur <connserver> l'image existante sera utilisée en lieu et place de celle que vous avez sélectionnée à l'étape précédente<b>$NomPropose</b>" --title="Modification du nom du fichier image" --width=500 --button="Annuler"\!gtk-no:1 --button="Conserver":2 --button="Accepter le nouveau nom"\!gtk-ok:0 2>/dev/null
		#	Abandon par l'utilisateur #############
		retour="$?"
		if [[ "$retour" == "1" ]] || [[ "$retour" == "252" ]] ; then
			echo "Arrêt. Traitement terminé. Erreur 60.";
			yad --image=error --title="Abandon" --text="Vous avez abandonné.\nArrêt du traitement.\nErreur 60." 2>/dev/null
			exit 60 ;
		###########################################

		elif [[ "$retour" == "0" ]] ; then	#	On n'utilise pas une image existante
			NomImageDeFond="$NomPropose"

		elif [[ "$retour" != "2" ]] ; then	#	autre cas -> pb
			echo "Erreur yad. Erreur 70."
			yad --image=error --title="Erreur" --text="Yad a rencontré un problème.\nArrêt du traitement.\nErreur 70." 2>/dev/null
			exit 70 ;
		fi

		NomCompletImageDeFond="$repDestImageDeFond$NomImageDeFond"
		
	fi

	#	Contrôle de sécurité. Est-ce que le fichier existe ?
	if [[ ! -e "$ImageDeFondOriginelle" ]]; then 
		echo "Erreur dans le nom du fichier. $ImageDeFondOriginelle n'existe pas. Arrêt du traitement. Erreur 80."
		yad --image=error --title="Le fichier n'existe pas" --text="$ImageDeFondOriginelle n'existe pas.\nArrêt du traitement.\nErreur 80." 2>/dev/null
		exit 80 ;
	fi

#---------------------------------------------------#
# Étape 3 - Copie du fichier image dans le répertoire /usr/share/background ($repDestImageDeFond)
#	Je convertis en 640x480, c'est probablement inutile
#---------------------------------------------------#

	if [[ "$retour" != "2" ]]; then	#	Evidemment si on utilise une image déjà présente, on saute l'étape 3

		echo
		/bin/echo -e "\e[1;32m###########################################################\e[0m"
		/bin/echo -e "\e[1;32mCopie du fichier dans le répertoire $repDestImage...En cours\e[0m"
		/bin/echo -e "\e[1;32m###########################################################\e[0m"
		echo

		sudo convert -geometry 640x480 "$ImageDeFondOriginelle" "$NomCompletImageDeFond"
		if [[ "$?" != "0" ]]; then
			echo "Erreur convert. Erreur 90."
			yad --image=error --title="Erreur" --text="Convert a rencontré un problème.\nArrêt du traitement.\nErreur 90." 2>/dev/null
		  exit 90 ;
		fi

		echo "Conversion de $ImageDeFondOriginelle en $NomCompletImageDeFond"

	fi
#---------------------------------------------------#
# Étape 4 - Mise à jour du fichier css
#---------------------------------------------------#

	echo
	/bin/echo -e "\e[1;32m###########################################################\e[0m"
	/bin/echo -e "\e[1;32mMise à jour du fichier $LeFichierCSS....En cours\e[0m"
	/bin/echo -e "\e[1;32m###########################################################\e[0m"
	echo

	if [[ ! -e "$LeFichierCSS"".anc" ]]; then   #  Conservation de toutes les versions du fichier modifié
		sudo cp "$LeFichierCSS"  "$LeFichierCSS"".anc"
		if [[ "$?" != "0" ]]; then
			echo "Erreur cp. Erreur 100."
			yad --image=error --title="Erreur" --text="cp a rencontré un problème.\nArrêt du traitement.\nErreur 100." 2>/dev/null
		  exit 100 ;
		fi
		echo "Création du fichier de sauvegarde ""$LeFichierCSS"".anc"
	else
		i=0
		while [[ ! -e "$LeFichierCSS"".anc""$i" ]]; do
			let "i+=1"
		done
		sudo cp "$LeFichierCSS"  "$LeFichierCSS"".anc""$i"
		if [[ "$?" != "0" ]]; then
			echo "Erreur cp. Erreur 110."
			yad --image=error --title="Erreur" --text="cp a rencontré un problème.\nArrêt du traitement.\nErreur 110." 2>/dev/null
		  exit 110 ;
		fi
		echo "Création du fichier de sauvegarde ""$LeFichierCSS"".anc""$i"
	fi

	sudo sed -i "/#lockDialogGroup/a background: #2c001e url(file://${NomCompletImageDeFond});\nbackground-repeat: no-repeat;\nbackground-size: cover;\nbackground-position: center;\n}\nTexteAEffacerParLeScript" "$LeFichierCSS"
		if [[ "$?" != "0" ]]; then
			echo "Erreur sed. Erreur 120."
			yad --image=error --title="Erreur" --text="sed a rencontré un problème.\nArrêt du traitement.\nErreur 120." 2>/dev/null
		  exit 120 ;
		fi
	sudo sed -i '/TexteAEffacerParLeScript/,+2d' "$LeFichierCSS"
		if [[ "$?" != "0" ]]; then
			echo "Erreur sed. Erreur 130."
			yad --image=error --title="Erreur" --text="sed a rencontré un problème.\nArrêt du traitement.\nErreur 120." 2>/dev/null
		  exit 130 ;
		fi

#---------------------------------------------------#
# Étape 5 - Invite de l'utilisateur à réinitialiser le système
#---------------------------------------------------#

	echo
	echo "Vous devez redémarrer votre appareil pour voir les effets de la mise à jour....:-)"
	echo
	

	yad --text "Il faut redémarrer votre session pour prendre en compte vos modifications.\nVoulez vous : " --button="Ne rien faire"\!gtk-no:1 --button="Redémarrer":2 --button="Fermer la session":0 2>/dev/null
	retour="$?"
	case "$retour" in
	"0" )
		pkill -9 -u "$USER"
	;;
	"2" )
		sudo reboot
	esac

exit 0;

Une copie de sauvegarde du fichier sauvegardé est réalisée.

Exemple de résultat obtenu
Exemple de résultat obtenu (GDM 3.24)

Depuis la version GNOME 3.16, les thèmes de GNOME Shell (et donc de GDM) sont par défaut stockés dans des fichiers binaires (au format gresource)2). On va extraire le thème de ce fichier, le modifier, puis le recompiler.

Extraire le thème utilisé

Pour extraire le thème par défaut, vous pouvez utiliser le script extractgst.sh suivant :

#!/bin/bash
 
rsrc='gnome-shell-theme.gresource'
gst="/usr/share/gnome-shell/$rsrc"
 
workdir="$HOME/shell-theme/theme"
xmlFile="$workdir/$rsrc.xml"
 
test -d "$workdir" || mkdir -p "$workdir"
 
cat <<eof >"$xmlFile" 
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/org/gnome/shell/theme">
eof
 
while read -r file
do
    filename="${file##*/}"
    echo "  	<file>$filename</file>" >>"$xmlFile"
    gresource extract "$gst" "$file" >"$workdir/$filename"
done < <(gresource list "$gst")
 
cat <<eof >>"$xmlFile"
  </gresource>
</gresources>
eof

Exécutez ce script.

Modifier le thème

Après avoir exécuté le script, ouvrez le répertoire shell-theme créé dans votre dossier personnel. Vous devriez y trouver, dans un dossier theme, les fichiers du thème qui ont été extraits.

L'image

Renommer votre image de fond d'écran en noise-texture.png, puis copiez-la dans le dossier shell-theme (écrasez l'ancienne version).

Le fichier XML

Ensuite, toujours dans ce répertoire, vous pouvez vérifier que le fichier gnome-shell-theme.gresource.xml correspond au contenu suivant :

<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/org/gnome/shell/theme">
    <file>calendar-arrow-left.svg</file>
    <file>calendar-arrow-right.svg</file>
    <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>close-window.svg</file>
    <file>close.svg</file>
    <file>corner-ripple-ltr.png</file>
    <file>corner-ripple-rtl.png</file>
    <file>dash-placeholder.svg</file>
    <file>filter-selected-ltr.svg</file>
    <file>filter-selected-rtl.svg</file>
    <file>gnome-shell.css</file>
    <file>gnome-shell-high-contrast.css</file>
    <file>logged-in-indicator.svg</file>
    <file>more-results.svg</file>
    <file>no-events.svg</file>
    <file>no-notifications.svg</file>
    <file>noise-texture.png</file>
    <file>page-indicator-active.svg</file>
    <file>page-indicator-inactive.svg</file>
    <file>page-indicator-checked.svg</file>
    <file>page-indicator-hover.svg</file>
    <file>process-working.svg</file>
    <file>running-indicator.svg</file>
    <file>source-button-border.svg</file>
    <file>summary-counter.svg</file>
    <file>toggle-off-us.svg</file>
    <file>toggle-off-intl.svg</file>
    <file>toggle-on-hc.svg</file>
    <file>toggle-on-us.svg</file>
    <file>toggle-on-intl.svg</file>
    <file>ws-switch-arrow-up.png</file>
    <file>ws-switch-arrow-down.png</file>
  </gresource>
</gresources>

Le fichier CSS

Ouvrez le fichier gnome-shell.css pour vérifier que la section #lockDialogGroup correspond bien à :

#lockDialogGroup {
  background: #2e3436 url(resource:///org/gnome/shell/theme/noise-texture.png);
  background-repeat: no-repeat;
}
Le "#2e3436" correspond à la couleur, en hexadécimal, qui s'affiche si l'image est mal cadrée ou transparente, sa valeur (gris) n'est pas très importante ici.

Vous devrez sans doute spécifier la résolution de GDM - ce n'est pas forcément celle de l'image - avec le paramètre ci-dessous à ajouter à la section #lockDialogGroup (bien sûr, [WIDTH] et [HEIGHT] sont à remplacer par vos valeurs) :

background-size: [WIDTH]px [HEIGHT]px;

Compiler

Enfin, ouvrez un terminal pour recompiler votre thème avec les commandes suivantes :

cd ~/shell-theme/theme/
glib-compile-resources gnome-shell-theme.gresource.xml
Si la compilation renvoie une erreur à propos de more-results.svg, retirez la ligne suivante du fichier XML précédemment créé :
    <file>more-results.svg</file>

Puis recompilez.

Mettre le thème en place

Il ne vous reste plus qu'à déplacer vers /usr/share/gnome-shell le fichier gnome-shell-theme.gresource qui vient de se créer.

Il est prudent de faire une copie de sauvegarde de son thème par défaut avant d'écraser le fichier d'origine :
cp /usr/share/gnome-shell/gnome-shell-theme.gresource ~/shell-theme/gnome-shell-theme.gresource.old
sudo mv ~/shell-theme/theme/gnome-shell-theme.gresource /usr/share/gnome-shell

Les modifications prendront effet au redémarrage de l'ordinateur.


2)
Ce comportement n'est pas présent avec la session "Ubuntu", mais il impacte les sessions "GNOME", notamment dans feu Ubuntu GNOME.
  • tutoriel/changer_arriere_plan_gdm.1580678072.txt.gz
  • Dernière modification: Le 02/02/2020, 22:14
  • par 84.101.133.214