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


63

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-2per aggiornare effettivamente lo sfondo del desktop. Esiste un nuovo modo per farlo in Unity?

Risposte:


82

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 gsettingsper questo. Ad esempio gconftool, ti consente di ottenere o impostare una chiave individuale.

È possibile 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 con "file: //" affinché funzioni (diversamente da gconftool).

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

gnome-session --version

Ciò restituirà la versione di Gnome. Se il numero di versione inizia con 3, gsettingspuò essere utilizzato. Se restituisce una versione che inizia con 2, utilizza gconftoolinvece lo script .


Ho usato questo comando in Ubuntu 12.04 e il sistema è

2
@YumYumYum: È molto insolito che i comandi sopra citati si blocchino il tuo sistema, a meno che non ci sia qualcos'altro nel tuo sistema.
Serrano,

Puoi aggiungere Cinnamon all'elenco di Desktop Environment usando gsettings;)
MrVaykadji

Si noti che è necessario anteporre l'URI con "file: //" affinché funzioni (diversamente da gconftool). <- Questo è importante! Non l'ho trovato menzionato esplicitamente altrove.
Tom

2
Questo va bene per l'utente attualmente connesso. Vorrei sapere come cambiare a livello di programmazione lo sfondo di un altro utente! Ho provato sudo --user = <nomeutente> gsettings ... ma non è riuscito.
kaiwan,

12

Questo codice cambia casualmente 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"

Salvare questo script e modificarlo con il comando "crontab -e" (avvia un editor in cui si inserisce questa riga alla fine del file):

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

1
La directory dello sfondo deve contenere solo file di sfondo e nessuna directory.
Loxaxs,

gsettings non funzionerà da cron, comunque. è necessario impostare la variabile di ambiente DBUS_SESSION_BUS_ADDRESS affinché gsettings funzioni. Puoi farlo aggiungendo queste due righe prima di gsettings (linee separate da punti e virgola :) PID = $ (pgrep gnome-session); export DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environment | cut -d = -f2-);
Willbradley,

6

introduzione

Questa risposta è una modifica della risposta originale. Mentre progredivo nei miei studi su Ubuntu e Linux, ho scoperto una varietà di approcci e approfondito la mia comprensione di come funziona l'impostazione di uno sfondo in Ubuntu. Questa risposta è il mio tentativo di documentare nel miglior modo possibile ciò che ho appreso finora, e si spera che questo materiale possa essere utile per gli altri.

La parte importante è che per impostare lo sfondo per il desktop Unity dalla riga di comando, è possibile utilizzare

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

Impostazione dello sfondo in Unity vs bare X desktop

Il modo in cui Unity funziona è tale che c'è un desktop X nudo sotto e sopra c'è la finestra desktop di Unity (che in realtà è 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 fa da sfondo a quella speciale finestra di Nautilus. Quando si disabilitano 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 bare-bones. Per il desktop X bare-bone è possibile utilizzare il fehprogramma. In particolare, questo comando:

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

C'è anche GUI alternativo a quello, nitrogen. Gli approcci fehe nitrogenpossono essere utilizzati con desktop diversi da Unity, come openboxo blackbox. L' gsettingsapproccio può essere utilizzato con Unity o altri desktop basati su GNOME.

Disabilitare il comando gsettings

Cosa fa esattamente il gsettingscomando? Bene, prima di tutto, esiste un database dconf di impostazioni per ciascun utente, che è inteso come sostituto di GConf obsoleto ed è accessibile tramite dconfcomando o gsettings. In particolare, abbiamo a che fare qui con org.gnome.desktop.backgroundschema e uno dei suoi tasti, picture-uri.

L'URI, in file:///home/JohnDoe/Pictures/cool_wallpaper.pngrealtà, sta per Uniform Resource Identifier , che originariamente è stato creato per l'utilizzo di Internet, ma esiste uno schema URI di file , che è quello che vediamo qui. La cosa interessante dell'URI è che fornisce un percorso con codifica byte se usi una locale non inglese, ad esempio con il mio desktop cinese, ho il seguente URI per il mio backgroun:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Scripting con gsettings

Naturalmente, scrivere il comando ogni volta è noioso e si può usare un po 'di magia per gli script. Ad esempio, ecco cosa ho impostato nel mio in ~/.bashrcmodo da poter cambiare lo sfondo a piacimento:

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 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.

Certo, questo non è l'unico modo. Python ha un'API per Gio (che è la libreria principale dietro gsettings). Ho scritto funzioni gsettings_gete gsettings_set, che sono state molto utili per altri progetti come Indicatore 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 di quello stesso approccio:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <1047481448@qq.com>
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, qui si applicano anche le stesse regole per gli script: assicurarsi che sia reso eseguibile con chmod +x set_wallpaper.pye memorizzarlo nella ~/bincartella (preferibilmente) . L'utilizzo è semplice: il ./set_wallpaper.py Picture/cool_image.py codice sorgente di questo script è disponibile anche sul mio repository GitHub con molti altri script.


1

Grazie alla fantastica risposta di Serrano, sono stato in grado di scrivere questo script che utilizzo come parte dei miei nuovi script di installazione 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"

1

Inoltre puoi usare questo:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.