J'ai un script qui met à jour mon fond d'écran de bureau tous les jours avec le NASA APOD. Depuis la mise à niveau vers la version 11.10, ce script a cessé de fonctionner, vraisemblablement parce que j'utilise gconftool-2
pour mettre à jour réellement le fond d'écran de bureau. Existe-t-il un nouveau moyen de le faire sous Unity ?
Réponses
Trop de publicités?Unity et Gnome Shell (Gnome 3) utilisent désormais GSettings au lieu de GConf. Ainsi, dans Unity et Gnome Shell, vous pouvez utiliser l'outil en ligne de commande gsettings
pour cela. Comme gconftool
, il vous permet d'obtenir ou de définir une clé individuelle.
Vous pouvez obtenir l'URI actuel de l'image d'arrière-plan comme suit :
gsettings get org.gnome.desktop.background picture-uri
'file:///home/serrano/Pictures/x.jpg'
Et définir l'URI de l'arrière-plan comme suit (ce qui mettra immédiatement à jour votre arrière-plan de bureau) :
gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg
Remarquez que vous devez préfixer l'URI avec "file://" pour que cela fonctionne (contrairement à gconftool
).
Pour que votre script fonctionne à la fois avec Gnome 2 et Shell/Unity, vous pouvez lui faire effectuer d'abord une vérification de la version de Gnome :
gnome-session --version
Cela renverra la version de Gnome. Si le numéro de version commence par 3, alors gsettings
peut être utilisé. Si cela renvoie une version commençant par 2, laissez votre script utiliser gconftool
à la place.
Ce code change aléatoirement le papier peint à partir d'un répertoire donné.
#!/bin/bash
DIR="/home/indra/Images/fonds_ecran"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"
Enregistrez ce script et éditez votre avec la commande "crontab -e" (cela lance un éditeur où vous mettez cette ligne à la fin du fichier) :
*/1 * * * * /bin/bash /chemin/vers/script.sh
Introduction
Cette réponse est une modification de la réponse originale. Au fur et à mesure de mes études sur Ubuntu et Linux, j'ai découvert diverses approches et approfondi ma compréhension de la manière dont le réglage d'un fond d'écran fonctionne sous Ubuntu. Cette réponse est ma tentative de documenter au mieux ce que j'ai appris jusqu'à présent, et ce dans l'espoir que ce matériel puisse être utile à d'autres.
La partie importante est que pour définir un fond d'écran pour le bureau Unity en ligne de commande, vous pouvez utiliser
gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
Définition du fond d'écran dans Unity par rapport au bureau X minimaliste
Unity fonctionne de telle manière qu'il y a un bureau X minimaliste en dessous, et au-dessus se trouve la fenêtre du bureau Unity (qui est en fait une instance spéciale de la fenêtre de Nautilus, le gestionnaire de fichiers par défaut d'Ubuntu). Ainsi, lorsque vous appelez
gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
cela définit le fond d'écran pour cette fenêtre spéciale de Nautilus. Lorsque vous désactivez les icônes du bureau avec
gsettings set org.gnome.desktop.background show-desktop-icons false
cela tuera le bureau de Nautilus et vous montrera le bureau X minimaliste. Pour le bureau X minimaliste, vous pouvez utiliser le programme feh
. En particulier, cette commande :
feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg
Il existe également une alternative graphique à cela, nitrogen
. Les approches feh
et nitrogen
peuvent être utilisées avec des bureaux autres que Unity, tels que openbox
ou blackbox
. L'approche gsettings
peut être utilisée avec Unity ou d'autres bureaux basés sur GNOME.
Décortiquer la commande gsettings
Que fait exactement la commande gsettings
? Eh bien, tout d'abord, il y a une base de données de paramètres pour chaque utilisateur nommée dconf, qui est destinée à remplacer l'ancienne GConf obsolète, et elle est accessible via la commande dconf
ou gsettings
. En particulier, nous traitons ici du schéma org.gnome.desktop.background
et l'une de ses clés, picture-uri
.
URI, c'est-à-dire file:///home/JohnDoe/Pictures/cool_wallpaper.png
, signifie en fait Identifiant de Ressource Uniforme, qui a été créé à l'origine pour une utilisation sur Internet, mais il existe un schéma d'URI de fichier, c'est ce que nous voyons ici. Ce qu'il y a de bien avec URI, c'est qu'il donne un chemin encodé en octets si vous utilisez une locale non anglaise, par exemple avec mon bureau chinois, j'ai l'URI suivant pour mon fond d'écran : 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'
Scripting avec gsettings
Évidemment, écrire la commande à chaque fois est fastidieux et on peut utiliser un peu de magie du scripting. Par exemple, voici ce que j'ai mis dans mon ~/.bashrc
pour pouvoir changer de fond d'écran à volonté :
change_background() {
FILE="'file://$(readlink -e "$1" )'"
if [ "$FILE" != "'file://'" ]
then
gsettings set org.gnome.desktop.background picture-uri "$FILE"
else
echo "Le fichier n'existe pas"
fi
}
Cette fonction peut être appelée avec un chemin absolu comme
change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg
ou avec un chemin relatif depuis le répertoire de travail actuel
change_background Pictures/cool_wallpaper.jpg
Il vérifie également si le fichier existe et résout les liens symboliques. Cela peut être utilisé dans un script shell ou en tant que fonction autonome pour un usage quotidien.
Évidemment, ce n'est pas la seule méthode. Python dispose d'une API pour Gio (qui est la bibliothèque principale derrière gsettings
). J'ai écrit des fonctions gsettings_get
et gsettings_set
, qui étaient très utiles pour d'autres projets tels que Launcher List Indicator. En cas de définition d'un fond d'écran, cela peut également être utilisé et je l'ai utilisé récemment pour cette question. Voici une version simplifiée de cette même approche :
#!/usr/bin/env python3
"""
Auteur: Serg Kolo , <1047481448@qq.com>
Date: 21 décembre 2016
But: script pour définir un fond d'écran, à la manière pythonique
Écrit pour: https://askubuntu.com/q/66914/295286
"""
from gi.repository import Gio
import os,sys,random
def gsettings_set(schema, path, key, value):
"""Définir la valeur du schéma gsettings"""
if path is None:
gsettings = Gio.Settings.new(schema)
else:
gsettings = Gio.Settings.new_with_path(schema, path)
if isinstance(value, list):
return gsettings.set_strv(key, value)
if isinstance(value, int):
return gsettings.set_int(key, value)
if isinstance(value,str):
return gsettings.set_string(key,value)
def error_and_exit(message):
sys.stderr.write(message + "\n")
sys.exit(1)
def main():
gschema='org.gnome.desktop.background'
key='picture-uri'
if len(sys.argv) != 2:
error_and_exit('>>> Un chemin vers un fichier est requis')
if not os.path.isfile(sys.argv[1]):
error_and_exit('>>> Le chemin "' + sys.argv[1] + \
'" n\'est pas un fichier ou le fichier n\'existe pas')
full_path = os.path.abspath(sys.argv[1])
uri = Gio.File.new_for_path(full_path).get_uri()
gsettings_set(gschema,None,key,uri)
if __name__ == '__main__': main()
Évidemment, les mêmes règles s'appliquent aux scripts ici aussi : assurez-vous qu'il est exécutable avec chmod +x set_wallpaper.py
et stockez-le de préférence dans le dossier ~/bin
. L'utilisation est simple : ./set_wallpaper.py Image/cool_image.py
Le code source de ce script est également disponible sur mon dépôt GitHub avec de nombreux autres scripts également.
Grâce à la réponse impressionnante de Serrano, j'ai pu écrire ce script que j'utilise comme partie de mes nouveaux scripts de configuration de machine pour définir un arrière-plan noir :
#! /bin/bash
SRC_URI="https://i.imgur.com/uomkVIL.png"
FNAME="/home/$USER/Pictures/black.png"
wget "$SRC_URI" -O "$FNAME"
gsettings set org.gnome.desktop.background picture-uri "$FNAME"