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

63

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

Shaddi
fonte

Respostas:

82

O Unity e o Gnome Shell (Gnome 3) agora usam GSettings em vez do GConf. Portanto, no Unity e no Gnome Shell, você pode usar a ferramenta de linha de comando gsettingspara isso. Assim gconftool, ele permite que você obtenha ou defina uma chave individual.

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

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

E defina o URI em segundo plano da seguinte maneira (que atualizará imediatamente o plano de fundo da área de trabalho):

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

Observe que você deve acrescentar o URI com "file: //" para que isso funcione (ao contrário 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, gsettingspode ser usado. Se ele retornar uma versão iniciada com 2, use seu script gconftool.

Serrano
fonte
Eu usei esse comando no Ubuntu 12.04 e sistema caiu
YumYumYum
2
@YumYumYum: É altamente incomum que os comandos acima travem seu sistema, a menos que haja algo acontecendo no seu sistema.
Serrano
Você pode adicionar o Cinnamon à lista de ambiente de área de trabalho usando gsettings;)
MrVaykadji
Observe que você deve acrescentar o URI com "file: //" para que isso funcione (diferente do gconftool). <- Isso é importante! Não encontrei isso mencionado explicitamente em nenhum outro lugar.
Tom
2
Isso é bom para o usuário atual conectado. Gostaria de saber como alterar programaticamente o papel de parede de outro usuário! Eu tentei sudo --user = <nome do usuário> gsettings ... mas isso falhou.
Kaiwan #
12

Esse 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 com o comando "crontab -e" (ele inicia um editor onde você coloca esta linha no final do arquivo):

*/1     *     *     *     *         /bin/bash /path/to/script.sh
Indra
fonte
11
O diretório do papel de parede deve conter apenas arquivos de papel de parede e nenhum diretório.
Loxaxs
No entanto, o gsettings não funcionará no cron. você precisa definir a variável de ambiente DBUS_SESSION_BUS_ADDRESS para que o gsettings funcione. Você pode fazer isso adicionando essas duas linhas antes de gsettings (linhas separadas por ponto e vírgula :) PID = $ (pgrep gnome-session); exportar DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environ | cut -d = -f2-);
precisa saber é o seguinte
6

Introdução

Esta resposta é uma edição da resposta original. À medida que progredi nos meus estudos sobre Ubuntu e Linux, descobri uma variedade de abordagens e aprofundou minha compreensão de como funciona um cenário em segundo plano no Ubuntu. Essa resposta é minha tentativa de documentar da melhor maneira possível o que aprendi até agora e é feita na esperança de que esse material possa ser útil para outras pessoas.

A parte importante é que, para definir o plano de fundo da área de trabalho do Unity na 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 x no desktop X vazio

A maneira como o Unity funciona é tal que existe um desktop X vazio abaixo e acima 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ê chama

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

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

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

Isso matará a área de trabalho do Nautilus e mostrará a você uma área de trabalho X básica. Para o desktop X básico, você pode usar o fehprograma. Particularmente, este comando:

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

Também há uma interface gráfica alternativa a isso nitrogen. As abordagens fehe nitrogenpodem ser usadas com desktops diferentes do Unity, como openboxou blackbox. A gsettingsabordagem pode ser usada com o Unity ou outro desktop baseado no GNOME.

Desativando o comando gsettings

O que exatamente o gsettingscomando faz? Bem, primeiro de tudo, existe um banco de dados de configurações do dconf para cada usuário, que se destina a substituir o GConf obsoleto , e pode ser acessado via dconfcomando ou gsettings. Em particular, estamos lidando aqui com o org.gnome.desktop.backgroundesquema e uma de suas chaves picture-uri,.

URI, file:///home/JohnDoe/Pictures/cool_wallpaper.pngna verdade, significa Uniform Resource Identifier , originalmente criado para uso da Internet, mas existe um esquema de URI de arquivo , que é o que vemos aqui. O que é interessante sobre o URI é que ele fornece um caminho codificado por bytes se você usar um código de idioma que não seja o inglês, por exemplo, na 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

Obviamente, escrever o comando toda vez é entediante e pode-se usar um pouco de magia de script. Por exemplo, aqui está o que defini no meu, ~/.bashrcpara que eu possa mudar 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 
} 

Essa 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

Ele também verifica se o arquivo existe e resolve os links simbólicos. Isso pode ser usado em um script de shell ou como função autônoma para uso diário.

Claro, este não é o único caminho. O Python possui uma API para Gio (que é a principal biblioteca por trás gsettings). Escrevi as funções gsettings_gete gsettings_set, que foram bastante úteis para outros projetos, como o Indicador de lista de iniciantes . No caso de definir um plano de fundo, ele também pode ser usado e eu o usei recentemente para esta pergunta . Aqui está uma versão simplificada dessa 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()

Obviamente, as mesmas regras para scripts também se aplicam aqui: verifique se ele é executável chmod +x set_wallpaper.pye armazene-o na ~/binpasta (preferencialmente) . O uso é simples: o ./set_wallpaper.py Picture/cool_image.py código fonte desse script também está disponível no meu repositório GitHub com muitos outros scripts também.

Sergiy Kolodyazhnyy
fonte
1

Graças à incrível resposta de Serrano, consegui escrever este script que eu uso como parte dos meus novos scripts de configuração da máquina para definir um 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"
jerblack
fonte
1

Também você pode usar isso:

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