it-swarm-eu.dev

Jak změnit pozadí plochy z příkazového řádku v Unity?

Mám skript, který každý den aktualizuje pozadí mé plochy pomocí NASA APOD. Od upgradu na 11.10 tento skript přestal fungovat, pravděpodobně proto, že používám gconftool-2 pro skutečnou aktualizaci pozadí plochy. Existuje v Unity nový způsob, jak toho dosáhnout?

69
Shaddi

Unity i Gnome Shell (Gnome 3) používají nyní místo GConf GSettings. Takže v Unity and Gnome Shell můžete použít nástroj příkazového řádku gsettings. Stejně jako gconftool umožňuje získat nebo nastavit individuální klíč.

Aktuální URI obrázku na pozadí můžete získat následovně:

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

A nastavte URI pozadí následovně (což okamžitě aktualizuje pozadí vašeho počítače):

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

Všimněte si, že musíte URI předponou „file: //“, aby to fungovalo (na rozdíl od gconftool).

Aby váš skript fungoval s Gnome 2 i Shell/Unity, můžete nechat nejprve zkontrolovat verzi Gnome:

gnome-session --version

To vrátí verzi Gnome. Pokud číslo verze začíná na 3, lze použít gsettings. Pokud vrátí verzi začínající na 2, nechte místo toho skript použít gconftool.

88
Serrano

Tento kód náhodně změní tapetu z daného adresáře.

#!/bin/bash

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

Uložte tento skript a upravte ho příkazem „crontab -e“ (spustí editor, do kterého umístíte tento řádek na konec souboru):

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

Úvod

Tato odpověď je úpravou původní odpovědi. Jak jsem postupoval ve svých studiích Ubuntu a Linuxu, objevil jsem řadu přístupů a prohloubil jsem své chápání toho, jak nastavení pozadí funguje v Ubuntu. Tato odpověď je můj pokus dokumentovat co nejlépe to, co jsem se dosud naučil, a je to v naději, že tento materiál může být užitečný pro ostatní.

Důležitou součástí je, že pro nastavení pozadí pro pracovní plochu Unity z příkazového řádku můžete použít

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

Nastavení pozadí na ploše Unity vs holé X plochy

Způsob, jakým Unity funguje, je takový, že pod holým stolem je holá plocha X a nad ním je okno na ploše Unity (což je ve skutečnosti zvláštní instance okna Nautilus, výchozí správce souborů Ubuntu). Když tedy voláte

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

které nastaví pozadí pro toto speciální okno Nautilus. Když deaktivujete ikony na ploše pomocí

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

který zabije plochu Nautilus a ukáže vám holé kosti X plochy. Pro pracovní plochu holé kosti X můžete použít program feh. Tento příkaz zejména:

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

K tomu je také alternativa GUI, nitrogen. Přístupy feh a nitrogen lze použít u stolních počítačů jiných než Unity, jako je například openbox nebo blackbox. Přístup gsettings lze použít s jednotkou Unity nebo jinou pracovní plochou založenou na GNOME.

Zjištění příkazu gsettings

Co přesně příkaz gsettings dělá? V první řadě existuje dconf databáze nastavení pro každého uživatele, která je určena jako náhrada za zastaralé GConf a je přístupný pomocí příkazu dconf nebo gsettings. Zejména zde jednáme s org.gnome.desktop.background schéma a jeden z jeho klíčů, picture-uri.

URI, že file:///home/JohnDoe/Pictures/cool_wallpaper.png, ve skutečnosti znamená Uniform Resource Identifier , který byl původně vytvořen pro použití na internetu, ale existuje soubor URI schéma, což vidíme zde. Co je v pohodě na URI, je to, že dává byte-zakódovanou cestu, pokud používáte neanglické národní prostředí, například u mé čínské plochy, mám následující URI pro své poza: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Skriptování s gsettings

Vypisování příkazu je samozřejmě zdlouhavé a člověk může použít trochu skriptovací magie. Zde je například to, co jsem nastavil ve svém ~/.bashrc, abych mohl pozadí libovolně měnit:

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 
} 

Tuto funkci lze nazvat absolutní cestou, jako je

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

nebo s relativní cestou z aktuálního pracovního adresáře

change_background Pictures/cool_wallpaper.jpg

Provede také kontrolu, zda soubor existuje, a řeší odkazy na odkazy. To lze použít ve skriptu Shell nebo jako samostatnou funkci pro každodenní použití.

To samozřejmě není jediný způsob. Python má API pro Gio (což je hlavní knihovna za gsettings). Napsal jsem gsettings_get a gsettings_set funkce, které byly docela užitečné pro jiné projekty, jako je Indikátor seznamu spouštěčů . V případě nastavení pozadí ho lze také použít a nedávno jsem jej použil pro tuto otázku . Zde je zjednodušená verze stejného přístupu:

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

Samozřejmě platí zde také stejná pravidla pro skripty: zajistěte, aby byly proveditelné pomocí chmod +x set_wallpaper.py a uložte jej (nejlépe) ~/bin složka. Použití je jednoduché: ./set_wallpaper.py Picture/cool_image.py Zdrojový kód tohoto skriptu je k dispozici také v mém úložišti GitHub s mnoha dalšími skripty.

7

Díky úžasné odpovědi Serrano jsem dokázal napsat tento skript, který používám jako součást svých nových skriptů pro nastavení stroje pro nastavení černého pozadí:

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

Můžete také použít:

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