web-dev-qa-db-fra.com

Comment changer le fond d'écran de la ligne de commande dans Unity?

J'ai un script qui met à jour mon fond d'écran tous les jours avec l'APOD de la NASA. Depuis la mise à niveau vers 11.10, ce script a cessé de fonctionner, probablement parce que j'utilise gconftool-2 pour mettre à jour l'arrière-plan du bureau. Y at-il une nouvelle façon de faire cela sous Unity?

62
Shaddi

Unity et Gnome Shell (Gnome 3) utilisent maintenant GSettings au lieu de GConf. Donc, dans Unity et Gnome Shell, vous pouvez utiliser l'outil de 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éfinissez l’URI d’arrière-plan comme suit (qui mettra immédiatement à jour l’arrière-plan de votre bureau):

gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg

Notez que vous devez ajouter l'URI avec "fichier: //" pour que cela fonctionne (contrairement à gconftool).

Pour que votre script fonctionne avec Gnome 2 et Shell/Unity, vous pouvez le laisser effectuer 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, gsettings peut être utilisé. S'il renvoie une version commençant par 2, laissez votre script utiliser gconftool à la place.

81
Serrano

Ce code modifie de manière aléatoire le papier peint d'un répertoire donné.

#!/bin/bash

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"

Sauvegardez ce script et éditez-le avec la commande "crontab -e" (il lance un éditeur dans lequel vous mettez cette ligne à la fin du fichier):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
12
Indra

Introduction

Cette réponse est une édition de la réponse d'origine. Au fur et à mesure de mes études sur Ubuntu et Linux, j'ai découvert diverses approches et approfondi ma compréhension de la définition d'un contexte dans Ubuntu. Cette réponse est ma tentative de documenter au mieux ce que j’ai appris jusqu’à présent, et elle est faite dans l’espoir que ce matériel puisse être utile à d’autres.

La partie importante est que pour définir l’arrière-plan du bureau Unity à partir de la ligne de commande, vous pouvez utiliser

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

Définition de l'arrière-plan dans Unity vs Bureau nu X

Le fonctionnement de Unity est tel qu'il existe un bureau X nu au-dessous et au-dessus se trouve la fenêtre du bureau de 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'

qui définit le fond 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 tuerait le bureau Nautilus et vous montrerait un bureau X épuré. Pour le bureau X nu, 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, nitrogen. Les approches feh et nitrogen peuvent être utilisées avec des ordinateurs de bureau autres que Unity, tels que openbox ou blackbox. L'approche gsettings peut être utilisée avec Unity ou un autre bureau basé sur GNOME.

Désactivation de la commande gsettings

Que fait exactement la commande gsettings? Tout d’abord, il existe dconf une base de données de paramètres pour chaque utilisateur, destinée à remplacer le mot obsolète GConf , et elle est accessible via la commande dconf ou gsettings. En particulier, nous traitons ici du schéma org.gnome.desktop.background et de l’une de ses clés, picture-uri.

L'URI, que file:///home/JohnDoe/Pictures/cool_wallpaper.png, signifie en réalité identificateur de ressource uniforme , qui a été créé à l'origine pour une utilisation Internet, mais il existe un schéma fichier URI , comme nous le voyons ici. Ce qui est bien avec URI, c’est qu’il donne un chemin codé en octets si vous utilisez des paramètres régionaux autres que l’anglais, par exemple avec mon bureau chinois, j’ai l’URI suivant pour mon motif: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Script avec gsettings

Bien sûr, écrire la commande à chaque fois est fastidieux et on peut utiliser un peu de magie de script. Par exemple, voici ce que j'ai défini dans mon ~/.bashrc pour pouvoir changer de fond à volonté:

change_background() {
    FILE="'file://$(readlink -e "$1" )'" 
    if [ "$FILE" != "'file://'" ] 
    then
        gsettings set org.gnome.desktop.background picture-uri "$FILE" 
    else
        echo "File doesn't exist" 
    fi 
} 

Cette fonction peut être appelée avec un chemin absolu tel que

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

ou avec le chemin relatif du 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 une utilisation quotidienne.

Bien sûr, ce n'est pas le seul moyen. Python possède une API pour Gio (qui est la bibliothèque principale derrière gsettings). J'ai écrit les fonctions gsettings_get et gsettings_set, qui étaient très utiles pour d'autres projets tels que indicateur de liste de lanceurs . Dans le cas de la configuration d'un fond, il 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
"""
Author: Serg Kolo , <[email protected]>
Date: December, 21,2016
Purpose: script for setting wallpaper, the Pythonic way
Written for: https://askubuntu.com/q/66914/295286
"""
from gi.repository import Gio
import os,sys,random

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    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('>>> Path to a file is required')
    if not os.path.isfile(sys.argv[1]):
        error_and_exit('>>> Path "' + sys.argv[1] + \
                       '" isn\'t a file or file doesn\'t exit')
    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 __== '__main__': main()

Bien entendu, les mêmes règles s'appliquent aux scripts: veillez à ce qu'il soit rendu exécutable avec chmod +x set_wallpaper.py et stockez-le dans le dossier (de préférence) ~/bin. L'utilisation est simple: ./set_wallpaper.py Picture/cool_image.py Le code source de ce script est également disponible sur mon GitHub référentiel avec de nombreux autres scripts.

6

Grâce à la réponse impressionnante de Serrano, j'ai pu écrire ce script que j'utilise dans le cadre 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"
1
jerblack

Aussi, vous pouvez utiliser ceci:

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