terça-feira, 1 de janeiro de 2008

Papel de parede aleatório

Este artigo é para aqueles que, como eu, usam gerenciadores de janela alternativos.

A maior parte das pessoas que entram no maravilhoso mundo livre do GNU/Linux ou fica nadando no rasinho da piscina – digo, KDE e Gnome – ou mergulha na escuridão negra da linha de comando…

Poucos são os que exploram saídas alteranativas, como ambientes desktop mais leves ou combinações de aplicações gráficas e gerenciadores de janela.

Nesses casos, há algumas aplicações que gerenciam papel de parede, como xv, xsetroot e wmsetbg.

Pessoalmente prefiro usar wmsetbg, que faz parte do pacote do Window Maker, mas pode ser usado com qualquer gerenciador de janela. Algumas vantagens são a flexibilidade para lidar com imagens e permitir recursos de transparência dos gerenciadores de menu.

Sabendo disso, uma coisa legal que podemos fazer com Shell é escolher um papel de parede aleatório a cada login.

Vamos aqui criar um script que faça isso.

O script deve começar indicando qual o interpretador a ser usado:
#!/bin/bash


Vamos agora listar as imagens que queremos em uma variável. Vamos chamá-la IMGLIST.

A ideia aqui é listar os diretórios onde estarão as imagens:
IMGLIST=$(
ls \
/home/Imagens/OndeEhOParaiso/*.jpg \
/home/Imagens/OndeEhOParaiso/*.png \
/home/Imagens/Virtual/*.jpg \
/home/Imagens/Virtual/*.png \
/home/Imagens/Wallpapers/*.jpg \
/home/Imagens/Wallpapers/*.png \
/home/Imagens/digitalblasphemy/*.jpg \
/home/Imagens/digitalblasphemy/*.png \
/home/Imagens/heise.de/*.jpg \
/home/Imagens/heise.de/*.png \
2>/dev/null
)


A estrutura $(…) levanta um sub-shell e retorna sua saída padrão.

Agora precisamos determinar o tamanho da lista para podermos escolher um índice:
LENGTH=$(wc -l <<< "$IMGLIST")


Temos novamente o sub-shell. O comando wc conta caracteres, palavras e linhas, com a opção -l, apenas linhas. Como cada linha em IMGLIST representa uma imagem, contanto as linhas, contamos as imagens.

Em bash, <<< retorna o conteúdo de uma string como um arquivo virtual, de forma semelhante a <<EOF.

Podemos agora escolher aleatoriamente um índice, maior ou igual a um e menor ou igual à quantidade de imagens.

Para isso usaremos dois recursos: o ambiente aritmético do bash, ((…)), e a variável especial RANDOM, que retorna um valor aleatório entre zero e 32767:
((IMGINDEX = (RANDOM * LENGTH / 32768) + 1))


Por final, podemos usar uma combinação dos comandos tail e head.

O comando tail seleciona todo o «arquivo» a partir de uma determinada linha, e o comando head seleciona n linhas do começo do «arquivo»:
IMGFILE=$(tail +$IMGINDEX <<< "$IMGLIST" | head -n1)


Tendo selecionado a imagem e armazenado seu path na variável IMGFILE, basta carregá-la como papel de parede:
wmsetbg -s "$IMGFILE"


E está pronto nosso script!

Para usá-lo podemos colocá-lo como parte do conteúdo de ~/.xinitrc, ou carregá-lo a partir de ~/.xinitrc com o comando source, ou ainda ajustar o arquivo como executável e chamá-lo a partir do startup do geranciador de janelas escolhido.

[]'s
Cacilhas, La Batalema
blog comments powered by Disqus