Come cambiare lo sfondo del desktop dalla riga di comando in Unity?

60

Ho uno script che aggiorna il mio sfondo del desktop ogni giorno con l'APOD della NASA. Dall'aggiornamento alla 11.10, quello script ha smesso di funzionare, presumibilmente perché sto usando gconftool-2 per aggiornare effettivamente lo sfondo del desktop. C'è un nuovo modo per farlo sotto Unity?

    
posta Shaddi 15.10.2011 - 17:25

5 risposte

79

Sia Unity che Gnome Shell (Gnome 3) ora usano GSettings invece di GConf. Quindi in Unity e Gnome Shell puoi usare lo strumento da riga di comando gsettings per quello. Come gconftool , ti consente di ottenere o impostare una singola chiave.

Puoi ottenere l'URI corrente dell'immagine di sfondo come segue:

gsettings get org.gnome.desktop.background picture-uri
'file:///home/serrano/Pictures/x.jpg'

E imposta l'URI di sfondo come segue (che aggiornerà immediatamente lo sfondo del desktop):

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

Si noti che è necessario anteporre l'URI a "file: //" perché funzioni (diversamente da gconftool ).

Per far funzionare lo script sia con Gnome 2 sia con Shell / Unity, puoi lasciarlo fare prima un controllo della versione di Gnome:

gnome-session --version

Questo restituirà la versione di Gnome. Se il numero di versione inizia con 3, è possibile utilizzare gsettings . Se restituisce una versione che inizia con 2, lascia che lo script utilizzi invece gconftool .

    
risposta data Serrano 20.10.2011 - 00:16
11

Questo codice cambia in modo casuale lo sfondo da una determinata directory.

#!/bin/bash

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

Salva questo script e modificalo con il comando "crontab -e" (avvia un editor in cui inserisci questa riga alla fine del file):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
    
risposta data Indra 12.08.2014 - 09:09
5

Introduzione

Questa risposta è una modifica della risposta originale. Come ho progredito nei miei studi su Ubuntu e Linux, ho scoperto una varietà di approcci e ho approfondito la mia comprensione di come impostare uno sfondo funziona in Ubuntu. Questa risposta è il mio tentativo di documentare al meglio ciò che ho imparato fino ad ora, ed è fatto nella speranza che questo materiale possa essere utile per gli altri.

La parte importante è che per impostare lo sfondo per Unity dal desktop dalla riga di comando, puoi usare

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

Impostazione dello sfondo su Unity vs desktop X nudo

Il modo in cui Unity funziona è tale che sotto c'è il desktop X nudo, e sopra c'è la finestra del desktop di Unity (che di fatto è un'istanza speciale della finestra di Nautilus, il file manager predefinito di Ubuntu). Quindi, quando chiami

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

che imposta lo sfondo per quella speciale finestra di Nautilus. Quando disabiliti le icone del desktop con

gsettings set org.gnome.desktop.background show-desktop-icons false

che ucciderà il desktop Nautilus e ti mostrerà il desktop X di ossa nude. Per il desktop X bare-bone puoi utilizzare il programma feh . In particolare, questo comando:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg

C'è anche una GUI alternativa a questo, nitrogen . Gli approcci feh e nitrogen possono essere utilizzati con desktop diversi da Unity, come openbox o blackbox . L'approccio gsettings può essere utilizzato con Unity o altri desktop basati su GNOME.

Disinfezione del comando gsettings

Che cosa fa esattamente il comando gsettings ? Beh, prima di tutto, esiste dconf database di impostazioni per ogni utente, che è inteso come sostituto di deprecato < a href="https://en.wikipedia.org/wiki/GConf"> GConf , ed è accessibile tramite il comando dconf o gsettings . In particolare, ci stiamo occupando qui org.gnome.desktop.background schema e una delle sue chiavi, picture-uri .

L'URI, che file:///home/JohnDoe/Pictures/cool_wallpaper.png , rappresenta attualmente Identificatore di risorse uniformi , che originariamente è stato creato per l'utilizzo di Internet, ma c'è lo schema file URI , che è quello che vediamo qui. La cosa interessante di URI è che fornisce un percorso codificato in byte se si utilizza un locale non inglese, ad esempio con il mio desktop cinese, ho l'URI seguente per il mio backgroun: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Scripting con gsettings

Ovviamente, scrivere il comando ogni volta è noioso e si può usare un po 'di magia di scripting. Ad esempio, ecco cosa ho impostato nel mio ~/.bashrc in modo da poter modificare lo sfondo a piacere:

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 
} 

Questa funzione può essere chiamata con un percorso assoluto come

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

o con percorso relativo dalla directory di lavoro corrente

change_background Pictures/cool_wallpaper.jpg

Esegue anche un controllo se il file esiste e risolve i collegamenti simbolici. Questo può essere usato in uno script di shell o come funzione autonoma per l'uso quotidiano.

Naturalmente, questo non è l'unico modo. Python ha un'API per Gio (che è la libreria principale dietro gsettings ). Ho scritto le funzioni gsettings_get e gsettings_set , che erano abbastanza utili per altri progetti come Indicatore dell'elenco di avvio . In caso di impostazione di uno sfondo, può anche essere utilizzato e l'ho usato solo di recente per questa domanda . Ecco una versione semplificata dello stesso approccio:

#!/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 __name__ == '__main__': main()

Naturalmente, anche qui si applicano le stesse regole per gli script: assicurati che sia reso eseguibile con chmod +x set_wallpaper.py e memorizzalo nella cartella (preferibilmente) ~/bin . L'utilizzo è semplice: ./set_wallpaper.py Picture/cool_image.py Il codice sorgente di questo script è disponibile anche sul mio repository GitHub con anche molti altri script.

    
risposta data Sergiy Kolodyazhnyy 23.11.2015 - 07:49
1

Puoi anche usare questo:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
    
risposta data Alexander 06.08.2015 - 07:08
0

Grazie alla straordinaria risposta di Serrano, sono riuscito a scrivere questo script che utilizzo come parte dei miei nuovi script di configurazione della macchina per impostare uno sfondo nero:

#! /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"
    
risposta data jerblack 23.05.2016 - 01:45

Leggi altre domande sui tag