Como alterar o plano de fundo da área de trabalho a partir da linha de comando no Unity?

62

Eu tenho um script que atualiza meu plano de fundo da área de trabalho todos os dias com o APOD da NASA. Desde a atualização para 11.10, esse script parou de funcionar, presumivelmente porque estou usando gconftool-2 para realmente atualizar o plano de fundo da área de trabalho. Existe uma nova maneira de fazer isso em Unity?

    
por Shaddi 15.10.2011 / 17:25

5 respostas

80

Tanto o Unity quanto o Gnome Shell (Gnome 3) usam o GSettings agora em vez do GConf. Portanto, no Unity e no Gnome Shell, você pode usar a ferramenta de linha de comando gsettings para isso. Como gconftool , permite obter ou definir uma chave individual.

Você pode obter o URI atual da imagem de plano de fundo da seguinte forma:

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

Defina o URI de segundo plano da seguinte maneira (que atualizará imediatamente o plano de fundo da sua área de trabalho):

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

Observe que você deve prefixar o URI com "file: //" para que isso funcione (diferente de gconftool ).

Para que seu script funcione com o Gnome 2 e o Shell / Unity, você pode fazer uma verificação da versão do Gnome primeiro:

gnome-session --version

Isso retornará a versão do Gnome. Se o número da versão começar com 3, então gsettings poderá ser usado. Se ele retornar uma versão que comece com 2, deixe seu script usar gconftool .

    
por Serrano 20.10.2011 / 00:16
12

Este código altera aleatoriamente o papel de parede de um determinado diretório.

#!/bin/bash

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

Salve este script e edite o seu com o comando "crontab -e" (ele lança um editor onde você coloca essa linha no final do arquivo):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
    
por Indra 12.08.2014 / 09:09
6

Introdução

Esta resposta é uma edição da resposta original. Conforme progredi em meus estudos do Ubuntu e do Linux, descobri uma variedade de abordagens e aprofundei meu entendimento de como configurar um plano de fundo funciona no Ubuntu. Esta resposta é a minha tentativa de documentar da melhor forma possível o que aprendi até agora, e é feito na esperança de que este material possa ser útil para os outros.

A parte importante é que para definir o plano de fundo para a área de trabalho do Unity a partir da linha de comando, você pode usar

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

Definindo o plano de fundo no Unity vs no desktop X puro

A forma como o Unity funciona é tal que existe um X desktop abaixo, e acima está a janela do Unity (que na verdade é uma instância especial da janela do Nautilus, o gerenciador de arquivos padrão do Ubuntu). Assim, quando você liga

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

que define o plano de fundo para essa janela especial do Nautilus. Quando você desativa os ícones da área de trabalho com

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

que matará a área de trabalho do Nautilus e mostrará a área de trabalho básica do X. Para a área de trabalho X bare-bone, você pode usar o programa feh . Particularmente, este comando:

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

Há também uma alternativa de GUI, nitrogen . As abordagens feh e nitrogen podem ser usadas com áreas de trabalho diferentes de Unity, como openbox ou blackbox . A abordagem gsettings pode ser usada com o Unity ou outro desktop baseado no GNOME.

Disecting the gsettings command

O que exatamente o comando gsettings faz? Bem, em primeiro lugar, existe um dconf banco de dados de configurações para cada usuário, que se destina a substituir GConf , e é acessível através do comando dconf ou gsettings . Em particular, estamos lidando aqui com org.gnome.desktop.background schema e uma de suas chaves, picture-uri .

URI, que file:///home/JohnDoe/Pictures/cool_wallpaper.png significa, na verdade, Uniform Resource Identifier , originalmente criado para uso da Internet, mas existe o esquema URI , que é o que vemos aqui. O que é legal sobre o URI é que ele fornece um caminho codificado por byte se você usar uma localidade que não seja em inglês, por exemplo, com minha área de trabalho chinesa, tenho o seguinte URI para o meu background: 'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Script com gsettings

É claro que escrever o comando a cada vez é tedioso e é possível usar um pouco de mágica de script. Por exemplo, aqui está o que eu configurei no meu ~/.bashrc para que eu possa alterar o plano de fundo à vontade:

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 
} 

Esta função pode ser chamada com caminho absoluto, como

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

ou com caminho relativo do diretório de trabalho atual

change_background Pictures/cool_wallpaper.jpg

Também executa uma verificação se o arquivo existe e resolve links simbólicos. Isso pode ser usado em um script de shell ou como uma função independente para uso diário.

Claro que este não é o único caminho. O Python tem uma API para o Gio (que é a principal biblioteca por trás do gsettings ). Escrevi as funções gsettings_get e gsettings_set , que foram bastante úteis para outros projetos, como o Indicador de lista de inicialização . No caso de definir um plano de fundo, ele também pode ser usado e eu usei recentemente para esta pergunta . Aqui está uma versão simplificada da mesma abordagem:

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

Naturalmente, as mesmas regras para os scripts se aplicam aqui também: certifique-se de que ela se torne executável com chmod +x set_wallpaper.py e armazene-a na pasta (preferrably) ~/bin . O uso é simples: ./set_wallpaper.py Picture/cool_image.py O código-fonte deste script também está disponível no meu repositório GitHub com muitos outros scripts também.

    
por Sergiy Kolodyazhnyy 23.11.2015 / 07:49
1

Além disso, você pode usar isto:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
    
por Alexander 06.08.2015 / 07:08
0

Graças à resposta incrível de Serrano, consegui escrever este script que uso como parte dos meus novos scripts de configuração de máquina para definir um plano de fundo preto:

#! /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"
    
por jerblack 23.05.2016 / 01:45