O que muda o papel de parede
No caso do comportamento padrão do Ubuntu quando se trata de planos de fundo, isso é definido através de gsettings
. Em um nut shell, é uma forma de banco de dados para configurações de vários aplicativos. O comando simples é este:
gsettings set org.gnome.desktop.background picture-uri "$FILE"
, onde "$FILE"
é a variável de script de shell que contém o caminho completo para a imagem no formato file:///path/to/image.png
Isso é um pouco diferente de outros ambientes de área de trabalho. Pense no Unity e no Gnome do Ubuntu como tendo uma camada acima do típico servidor X11 (ou seja, a camada acima do ambiente GUI). Em ambientes como blackbox
ou openbox
você precisaria chamar um programa externo. Por exemplo, feh --bg-scale /path/to/image
Suponho que você queira lidar com o ambiente padrão - o Unity do Ubuntu.
Fazendo uma função de shell
Veja um exemplo do que eu uso no meu arquivo .bashrc
.
function chbackground {
FILE="'file://$(readlink -f "$1" )'"
echo changing to "$FILE"
gsettings set org.gnome.desktop.background picture-uri "$FILE"
}
A função pode ser chamada assim
chbackground WALLPAPERS-FOLDER/cool-background.png
Esta função tem duas partes importantes. Primeiro, podemos ter caminho completo ou parcial para o arquivo - é para isso que readlink -f "$1"
cuida - ele retorna o caminho completo para a imagem. Então transformamos isso em uma string combinando a saída de readlink -f "$1"
e file://
. Lembre-se, o caminho do Unix está sempre começando com a pasta raiz, /
, então precisamos apenas de levar duas barras por lá. O resultado seria file:///home/user/WALLPAPERS-FOLDER/cool-background.png
string e armazenado na variável FILE
.
Finalmente, chamamos gsettings
com FILE
como argumento.
Esta função pode fazer parte de qualquer script e ser chamada com qualquer caminho parcial ou completo como parâmetro
Juntando um script
Aqui está um roteiro que eu esbocei em cerca de 15 minutos que irá fazer uma lista de imagens, e então selecionar uma imagem aleatória para fora daquela lista, e definir o plano de fundo para essa imagem. O script também é colocado no meu github , sergrep repositório de repositórios e será desenvolvido apenas um pouco mais para incluir funcionalidade extra, mas na maior parte, a versão de código aqui faz o trabalho principal.
Para automatizar este script, consulte Como faço para que um programa seja iniciado automaticamente toda vez que eu fizer login?
#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected]
# Date: March 10th 2016
# Purpose: Set random wallpaper
# To make it start automatically, add it as one of
# the Startup Applications in Ubuntu's Unity
# or Gnome
#
# Written for: https://askubuntu.com/q/744464/295286
# Tested on: Ubuntu 14.04 LTS
###########################################################
# Copyright: Serg Kolo , 2016
#
# Permission to use, copy, modify, and distribute this software is hereby granted
# without fee, provided that the copyright notice above and this permission statement
# appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
ARGV0="$0"
ARGC=$#
change_background()
{
FILE="'file://$(readlink -f "$1" )'"
echo changing to "$FILE"
gsettings set org.gnome.desktop.background picture-uri "$FILE"
}
make_list()
{
# -max-depth may be optional , if you want to
# traverse subdirectories,too
find "$1" -maxdepth 1 -type f > "$2"
}
main()
{
# Variables
local DISPLAY=:0 # ensure this is set
local DIR="$1"
local LIST="/tmp/wallpaper.list"
local TIME="$2"
# cat $LIST # for debugging only
make_list "$DIR" "$LIST"
while true
do
change_background $( shuf $LIST | head -n 1 )
sleep "$TIME"
done
}
main "$@"