78 votes

Comment changer l'arrière-plan du bureau à partir de la ligne de commande dans Unity?

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 ?

99voto

NotMyself Points 7567

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.

14voto

Indra Points 439

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

7voto

Sergiy Kolodyazhnyy Points 97292

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.

1voto

Alexander Points 11

Vous pouvez également utiliser ceci :

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/VOTRE_UTILISATEUR/bg.png'"

1voto

jerblack Points 140

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"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X