Wie ändere ich den Desktop-Hintergrund über die Befehlszeile in Unity?

63

Ich habe ein Skript, das meinen Desktop-Hintergrund täglich mit dem NASA APOD aktualisiert. Seit dem Upgrade auf 11.10 funktioniert dieses Skript nicht mehr, vermutlich, weil ich gconftool-2den Desktop-Hintergrund tatsächlich aktualisiere. Gibt es einen neuen Weg, dies unter Unity zu tun?

Shaddi
quelle

Antworten:

82

Sowohl Unity als auch Gnome Shell (Gnome 3) verwenden jetzt GSettings anstelle von GConf. In Unity und Gnome Shell können Sie dafür das Befehlszeilentool verwenden gsettings. Auf gconftooldiese Weise können Sie einen einzelnen Schlüssel abrufen oder festlegen.

Sie können die aktuelle URI des Hintergrundbilds wie folgt abrufen:

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

Und stellen Sie den Hintergrund-URI wie folgt ein (wodurch Ihr Desktop-Hintergrund sofort aktualisiert wird):

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

Beachten Sie, dass Sie dem URI "file: //" voranstellen müssen, damit dies funktioniert (im Gegensatz zu gconftool).

Damit Ihr Skript sowohl mit Gnome 2 als auch mit Shell / Unity funktioniert, können Sie zunächst eine Gnome-Versionsprüfung durchführen lassen:

gnome-session --version

Das wird die Version von Gnome zurückgeben. Wenn die Versionsnummer mit 3 beginnt, gsettingskann verwendet werden. Wenn es eine Version zurückgibt, die mit 2 beginnt, verwenden Sie gconftoolstattdessen Ihr Skript .

Serrano
quelle
Ich habe diesen Befehl in Ubuntu 12.04 verwendet und das System ist abgestürzt
YumYumYum
2
@YumYumYum: Es ist sehr ungewöhnlich, dass die obigen Befehle Ihr System zum Absturz bringen, es sei denn, in Ihrem System ist etwas anderes los.
Serrano
Sie können Zimt zur Liste der Desktop-Umgebung mit gsettings hinzufügen;)
MrVaykadji
Beachten Sie, dass Sie dem URI "file: //" voranstellen müssen, damit dies funktioniert (im Gegensatz zu gconftool). <- Das ist wichtig! Ich fand das nirgendwo anders explizit erwähnt.
Tom
2
Dies ist in Ordnung für den aktuell angemeldeten Benutzer. Ich möchte wissen, wie man programmatisch das Hintergrundbild eines anderen Benutzers ändert ! Ich habe versucht, sudo --user = <Benutzername> gsettings ... aber das ist fehlgeschlagen.
Kaiwan
12

Dieser Code ändert zufällig das Hintergrundbild aus einem bestimmten Verzeichnis.

#!/bin/bash

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

Speichern Sie dieses Skript und bearbeiten Sie es mit dem Befehl "crontab -e" (es startet einen Editor, in dem Sie diese Zeile am Ende der Datei einfügen):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Indra
quelle
1
Das Hintergrundbildverzeichnis darf nur Hintergrundbilddateien und kein Verzeichnis enthalten.
Loxax
gsettings funktioniert jedoch nicht mit cron. Sie müssen die Umgebungsvariable DBUS_SESSION_BUS_ADDRESS festlegen, damit gsettings funktioniert. Sie können dies tun, indem Sie diese beiden Zeilen vor gsettings hinzufügen (durch Semikolon getrennte Zeilen :) PID = $ (pgrep gnome-session); export DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environ | cut -d = -f2-);
Willbradley
6

Einführung

Diese Antwort ist eine Bearbeitung der ursprünglichen Antwort. Als ich in meinen Ubuntu- und Linux-Studien Fortschritte gemacht habe, habe ich eine Vielzahl von Ansätzen entdeckt und mein Verständnis dafür vertieft, wie das Festlegen eines Hintergrunds in Ubuntu funktioniert. Diese Antwort ist mein Versuch, das, was ich bisher gelernt habe, so gut wie möglich zu dokumentieren, und ich hoffe, dass dieses Material für andere nützlich sein kann.

Der wichtige Teil ist, dass Sie den Hintergrund für den Unity-Desktop über die Befehlszeile festlegen können

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

Hintergrundeinstellung in Unity vs Bare X Desktop

Die Art und Weise, wie Unity funktioniert, ist so, dass sich darunter ein nackter X-Desktop befindet, und darüber befindet sich das Desktop-Fenster von Unity (das in der Tat eine spezielle Instanz von Nautilus 'Fenster ist, dem Standard-Dateimanager von Ubuntu). Also, wenn du anrufst

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

Damit wird der Hintergrund für dieses spezielle Nautilus-Fenster festgelegt. Wenn Sie Desktopsymbole mit deaktivieren

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

Dadurch wird der Nautilus-Desktop beendet und der Bare-Bones-X-Desktop angezeigt. Für den Bare-Bone-X-Desktop können Sie das fehProgramm verwenden. Insbesondere dieser Befehl:

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

Es gibt auch eine GUI-Alternative dazu nitrogen. Die Ansätze fehund nitrogenkönnen mit anderen Desktops als Unity verwendet werden, z. B. openboxoder blackbox. Der gsettingsAnsatz kann mit Unity oder einem anderen GNOME-basierten Desktop verwendet werden.

Deaktivieren des Befehls gsettings

Was genau macht der gsettingsBefehl? Nun, zuallererst gibt es für jeden Benutzer eine dconf- Datenbank mit Einstellungen, die als Ersatz für veraltete GConf gedacht ist , und auf die über einen dconfBefehl oder zugegriffen werden kann gsettings. Insbesondere haben wir es hier mit dem org.gnome.desktop.backgroundSchema und einem seiner Schlüssel zu tun picture-uri.

URI, das file:///home/JohnDoe/Pictures/cool_wallpaper.pngheißt eigentlich Uniform Resource Identifier , der ursprünglich für die Internetnutzung erstellt wurde, aber es gibt ein Datei-URI- Schema, wie wir es hier sehen. Das Coole an URI ist, dass es einen byte-codierten Pfad gibt, wenn Sie ein nicht-englisches Gebietsschema verwenden, z. B. mit meinem chinesischen Desktop. Ich habe folgenden URI für mein Backgroun:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Scripting mit gsettings

Natürlich ist es mühsam, den Befehl jedes Mal aufzuschreiben, und man kann ein bisschen Skriptmagie verwenden. Zum Beispiel ist hier, was ich in meinem eingestellt habe, ~/.bashrcdamit ich Hintergrund nach Belieben ändern kann:

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 
} 

Diese Funktion kann mit absoluten Pfad wie aufgerufen werden

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

oder mit dem relativen Pfad vom aktuellen Arbeitsverzeichnis

change_background Pictures/cool_wallpaper.jpg

Außerdem wird geprüft, ob eine Datei vorhanden ist, und Symlinks werden aufgelöst. Dies kann in einem Shell-Skript oder als Standalone-Funktion für den täglichen Gebrauch verwendet werden.

Dies ist natürlich nicht der einzige Weg. Python hat eine API für Gio (die die Hauptbibliothek dahinter ist gsettings). Ich habe ein gsettings_getund gsettings_setFunktionen geschrieben, die für andere Projekte wie Launcher List Indicator sehr nützlich waren . Wenn Sie einen Hintergrund festlegen, kann dieser auch verwendet werden, und ich habe ihn erst kürzlich für diese Frage verwendet . Hier ist eine vereinfachte Version desselben Ansatzes:

#!/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()

Natürlich gelten auch hier die gleichen Regeln für Skripte: chmod +x set_wallpaper.pyStellen Sie sicher, dass sie ausführbar sind, und speichern Sie sie im (vorzugsweise) ~/binOrdner. Die Verwendung ist einfach: Der ./set_wallpaper.py Picture/cool_image.py Quellcode dieses Skripts ist auch in meinem GitHub- Repository mit vielen anderen Skripts verfügbar .

Sergiy Kolodyazhnyy
quelle
1

Dank der großartigen Antwort von Serrano konnte ich dieses Skript schreiben, das ich als Teil meiner neuen Maschinen-Setup-Skripte verwende, um einen schwarzen Hintergrund festzulegen:

#! /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"
jerblack
quelle
1

Auch Sie können dies verwenden:

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