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?

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.


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

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 , <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()

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.


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"

1

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

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.