Jak zmienić tło pulpitu z wiersza poleceń w Unity?

63

Mam skrypt, który codziennie aktualizuje tło pulpitu za pomocą NASA APOD. Od czasu uaktualnienia do wersji 11.10 skrypt przestał działać, prawdopodobnie dlatego, że używam gconftool-2do aktualizacji tła pulpitu. Czy istnieje nowy sposób na zrobienie tego w ramach Jedności?

Shaddi
źródło

Odpowiedzi:

82

Zarówno Unity, jak i Gnome Shell (Gnome 3) używają teraz GSettings zamiast GConf. Więc w Unity i Gnome Shell możesz do tego użyć narzędzia wiersza poleceń gsettings. Jak gconftool, pozwala uzyskać lub ustawić indywidualny klucz.

Możesz uzyskać bieżący identyfikator URI obrazu tła w następujący sposób:

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

I ustaw identyfikator URI tła w następujący sposób (który natychmiast zaktualizuje tło pulpitu):

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

Zauważ, że musisz dodać identyfikator URI z „file: //”, aby to zadziałało (w przeciwieństwie do gconftool).

Aby skrypt działał zarówno z Gnome 2, jak i Shell / Unity, możesz najpierw pozwolić na sprawdzenie wersji Gnome:

gnome-session --version

To zwróci wersję Gnome. Jeśli numer wersji zaczyna się od 3, gsettingsmożna go użyć. Jeśli zwraca wersję zaczynającą się od 2, pozwól skryptu użyć gconftoolzamiast tego.

Serrano
źródło
Użyłem tego polecenia w Ubuntu 12.04 i system się
zawiesił
2
@YumYumYum: powyższe polecenia powodują awarię systemu, chyba że dzieje się coś innego.
Serrano
Możesz dodać Cynamon do listy Środowiska pulpitu za pomocą gsettings;)
MrVaykadji
Zauważ, że musisz dodać identyfikator URI z „file: //”, aby to zadziałało (w przeciwieństwie do gconftool). <- To ważne! Nigdzie indziej nie znalazłem tego wyraźnie wymienionego.
Tom
2
To jest w porządku dla zalogowanego użytkownika. Chciałbym wiedzieć, jak programowo zmienić tapetę innego użytkownika! Próbowałem sudo --user = <nazwa użytkownika> ustawienia ... ale to się nie udało.
kaiwan
12

Ten kod losowo zmienia tapetę z danego katalogu.

#!/bin/bash

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

Zapisz ten skrypt i edytuj go za pomocą polecenia „crontab -e” (uruchamia edytor, w którym umieszczasz ten wiersz na końcu pliku):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Indra
źródło
1
Katalog tapet musi zawierać tylko pliki tapet i żaden katalog.
loxaxs
gsettings nie będą jednak działać z crona. musisz ustawić zmienną środowiskową DBUS_SESSION_BUS_ADDRESS, aby ustawienia działały. Możesz to zrobić, dodając te dwie linie przed ustawieniami (linie oddzielone średnikami :) PID = $ (pgrep gnome-session); eksport DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environment | cut -d = -f2-);
willbradley,
6

Wprowadzenie

Ta odpowiedź jest edycją oryginalnej odpowiedzi. W miarę postępów w badaniach nad Ubuntu i Linuksem odkryłem różne podejścia i pogłębiłem wiedzę o tym, jak ustawienie tła działa w Ubuntu. Ta odpowiedź jest moją próbą udokumentowania jak najlepiej tego, czego się nauczyłem do tej pory, i mam nadzieję, że ten materiał może być przydatny dla innych.

Ważną częścią jest to, że możesz ustawić tło pulpitu Unity z wiersza poleceń, możesz użyć

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

Ustawianie tła w Unity vs goły pulpit X.

Sposób działania Unity polega na tym, że poniżej znajduje się pusty pulpit X, a powyżej okno pulpitu Unity (które w rzeczywistości jest specjalną instancją okna Nautilusa, domyślnego menedżera plików Ubuntu). Tak więc, kiedy dzwonisz

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

który ustawia tło dla tego specjalnego okna Nautilus. Po wyłączeniu ikon pulpitu za pomocą

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

który zabije pulpit Nautilus i pokaże pulpit X od podstaw. W przypadku pulpitu X goły kość można użyć fehprogramu. W szczególności to polecenie:

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

Jest także alternatywą dla GUI, że nitrogen. fehI nitrogenpodejścia mogą być stosowane z pulpitów innych niż jedność, jak openboxi blackbox. gsettingsPodejście może być używany z Jedności lub innego GNOME oparte.

Disecting polecenia gsettings

Co dokładnie robi gsettingspolecenie? Po pierwsze, istnieje baza danych dconf z ustawieniami dla każdego użytkownika, która ma zastąpić przestarzały GConf i jest dostępna za pomocą dconfkomendy lub gsettings. W szczególności, mamy tu do czynienia ze org.gnome.desktop.backgroundschematem a jednym z jej kluczy picture-uri.

Identyfikator URI, który file:///home/JohnDoe/Pictures/cool_wallpaper.pngfaktycznie oznacza Uniform Resource Identifier , który pierwotnie został stworzony do użytku w Internecie, ale istnieje schemat pliku URI , który widzimy tutaj. Co fajne w URI jest to, że daje ścieżkę zakodowaną w bajtach, jeśli używasz ustawień narodowych innych niż angielski, na przykład na moim chińskim pulpicie, mam następujący URI dla mojego tła:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Skrypty z ustawieniami

Oczywiście pisanie polecenia za każdym razem jest żmudne i można użyć odrobiny magii skryptowej. Na przykład oto, co ustawiłem, ~/.bashrcaby móc dowolnie zmieniać tło:

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 
} 

Tę funkcję można wywołać za pomocą ścieżki bezwzględnej, takiej jak

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

lub ze względną ścieżką z bieżącego katalogu roboczego

change_background Pictures/cool_wallpaper.jpg

Sprawdza również, czy plik istnieje i rozwiązuje dowiązania symboliczne. Może to być użyte w skrypcie powłoki lub jako samodzielna funkcja do codziennego użytku.

Oczywiście nie jest to jedyny sposób. Python ma interfejs API dla Gio (który jest główną biblioteką gsettings). Napisałem a gsettings_geti gsettings_setfunkcje, które były całkiem przydatne dla innych projektów, takich jak Launcher List Indicator . W przypadku ustawienia tła można go również użyć i użyłem go niedawno do tego pytania . Oto uproszczona wersja tego samego podejścia:

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

Oczywiście obowiązują tu również te same zasady dla skryptów: upewnij się, że jest on wykonywalny chmod +x set_wallpaper.pyi przechowuj go (najlepiej) w ~/binfolderze. Użycie jest proste: ./set_wallpaper.py Picture/cool_image.py kod źródłowy tego skryptu jest również dostępny w moim repozytorium GitHub z wieloma innymi skryptami.

Sergiy Kolodyazhnyy
źródło
1

Dzięki niesamowitej odpowiedzi Serrano udało mi się napisać ten skrypt, którego używam jako części moich nowych skryptów konfiguracji maszyny, aby ustawić czarne tło:

#! /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
źródło
1

Możesz także użyć tego:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Alexander
źródło