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?
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.
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.
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:
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
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 importGioimport os,sys,randomdef gsettings_set(schema, path, key, value):"""Set value of gsettings schema"""if path isNone:
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')ifnot 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.
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:
Esse código altera aleatoriamente o papel de parede de um determinado diretório.
Salve este script e edite-o com o comando "crontab -e" (ele inicia um editor onde você coloca esta linha no final do arquivo):
fonte
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
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
que define o plano de fundo para a janela especial do Nautilus. Quando você desativa os ícones da área de trabalho com
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
feh
programa. Particularmente, este comando:Também há uma interface gráfica alternativa a isso
nitrogen
. As abordagensfeh
enitrogen
podem ser usadas com desktops diferentes do Unity, comoopenbox
oublackbox
. Agsettings
abordagem pode ser usada com o Unity ou outro desktop baseado no GNOME.Desativando o comando gsettings
O que exatamente o
gsettings
comando 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 viadconf
comando ougsettings
. Em particular, estamos lidando aqui com oorg.gnome.desktop.background
esquema e uma de suas chavespicture-uri
,.URI,
file:///home/JohnDoe/Pictures/cool_wallpaper.png
na 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,
~/.bashrc
para que eu possa mudar o plano de fundo à vontade:Essa função pode ser chamada com caminho absoluto, como
ou com caminho relativo do diretório de trabalho atual
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çõesgsettings_get
egsettings_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:Obviamente, as mesmas regras para scripts também se aplicam aqui: verifique se ele é executável
chmod +x set_wallpaper.py
e armazene-o na~/bin
pasta (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.fonte
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:
fonte
Também você pode usar isso:
fonte