Criando um Seletor de Wallpapers com o Rofi
08 May 2026 (updated: 08 May 2026 )
Estava querendo fazer algo legal no Openbox: Um seletor de Wallpaper, só que usando o Rofi. Com isso, fui em busca de uma base para fazer isso, até que encontrei um Script que foi feito por Ilya Senatorov. E era um Script que, pra mim, estava no caminho certo. Mas que precisava de algumas modificações. Entre elas:
- Detectar Wallpapers na pasta
/usr/share/backgroundse na pasta do usuário (seja em~/Imagens/Wallpapersou em~/Imagens/wallpapers); - Exibir as Miniaturas e apenas o nome do Arquivo;
- Ter opções para colocar a imagem escolhida como Wallpaper (seja Colorizando ou não) ou na Tela de Bloqueio.
Com isso, comecei a construir o Rofi Wal para uso no Nippybox.
Construindo o Script
Mas como construí esse Script? É isso que vou documentar nesse post!
Primeiramente, as variáveis
No começo do Script, há as variáveis que serão usadas pelo Script, e que são essas aqui:
RASI="$HOME/.config/rofi/wall.rasi"
confirmRASI="$HOME/.config/rofi/wallConfirm.rasi"
walDir="/usr/share/backgrounds" # Wallpapers do Sistema
wlist="$HOME/.cache/wlist" # Lista temporária de Wallpapers
userPicsDir=$(xdg-user-dir PICTURES) # Diretório de Imagens
IFS=$';' # Para fazer com que o laço FOR mantenha o nome dos arquivos intactos
Detectando Wallpapers
Para a Detecção dos Wallpapers, é usado o comando find; que é autoexplicativo ele procura arquivos de acordo com o nome, extensão e outros dados; e depois joga a saída dele para uma lista temporária de arquivos, que será usada mais tarde.
find $walDir -iname '*.png' -o -iname '*.jpg' > $wlist
E o primeiro local em que a busca dos Wallpapers ocorre é justamente na pasta do sistema, conforme definido nas variáveis, e como é o primeiro local é usado o redirecionamento > que sobrescreve todo o conteúdo de um arquivo.
Mas, o usuário não vai usar apenas os Wallpapers do sistema, mas pode usar os que eles já tem. Com isso, vem uma função para verificar quais pastas que há Wallpapers.
getWal () {
# Verificando se há alguma pasta de Wallpapers no Usuário
if [ -d "$userPicsDir/Wallpapers" ]; then
find $userPicsDir/Wallpapers -iname '*.png' -o -iname '*.jpg' >> $wlist
elif [ -d "$userPicsDir/wallpapers" ]; then
find $userPicsDir/wallpapers -iname '*.png' -o -iname '*.jpg' >> $wlist
else
mkdir "$userPicsDir/Wallpapers"
fi
}
E como no Linux, os nomes dos arquivos tem uma diferenciação entre Maíusculas e Minúsculas, optei por colocar as duas variantes (Wallpapers e wallpapers). Se não existisse uma pasta para os Wallpapers do usuário, o próprio Script cria essa pasta. Com a lista dos Wallpapers pronta, é hoje de ir para o próximo passo.
Listando os Wallpapers e Exibindo Miniaturas
Para esse passo, é usado um laço while, para ler cada uma das linhas da lista de Wallpapers.
while IFS= read -r tempWal; do
walName="$(cat $wlist | grep $tempWal | sed 's#.*/##')"
echo -en "$walName\0icon\x1f$tempWal\n"
done < $wlist
A primeira coisa a ser feita, é extrair o nome do arquivo. Ao invés do arquivo ficar como “/usr/share/backgrounds/Autumm by jwvein.png”, ele deve ser simplificado para ser “Autumm by jwvein.png”. Mas como fazer isso? Com esse trecho do comando:
walName="$(cat $wlist | grep $tempWal | sed 's#.*/##')"
Primeiramente, é exibida toda a lista, com o cat $wlist, depois é filtrado apenas pelo nome do Wallpaper que está sendo manipulado com o grep $tempWal e por fim, o nome do arquivo é extraído com o sed 's#.*/##'.
E claro, tudo é envolvido com aspas, justamente para que os espaços possam ser preservados e o nome é guardado na variável walName.
Agora a questão é: Como colocar o nome do arquivo junto com a miniatura da imagem? De acordo com essa discussão no GitHub do Rofi, esse é a forma para exibir as miniaturas:
echo -en "$walName\0icon\x1f$tempWal\n"
Basicamente, o echo -en permite que o texto possa ser formatado e que não adicione uma nova linha no final da saída. Depois, vem o $walName\0icon\x1f$tempWal\n que exibe o nome do Wallpaper, e transforma a outra variável num ícone e por fim, pula uma nova linha.
Beleza. Foi feito tudo isso para poder exibir as miniaturas no Rofi. Agora, está na hora de exibir o Rofi com os Wallpapers, para podermos escolher a imagem desejada.
Exibindo o Rofi e escolhendo o Wallpaper
E como escolher o Wallpaper? Basicamente, colocamos uma variável que será alimentada pelo comando walList | rofi -dmenu -theme $RASI.
wallpaper=$(walList | rofi -dmenu -theme $RASI) # Mostra o Rofi para escolher o Wallpaper
Mas há um porém: A variável terá apenas o nome do Wallpaper, algo como “Autumm by jwvein.png”. Mas para aplicar, o Wallpaper, teremos que ter o caminho completo. É por conta disso, que a lista temporária de Wallpapers é criada e para recuperar o caminho completo do arquivo, vem outra variável.
walPath=$(cat $wlist | grep $(echo ${wallpaper#[[:space:]]*}))
E o que esse trecho de comando faz? Basicamente ele exibe toda a lista temporária dos Wallpapers e procura pelo nome do Wallpaper.
Até poderia usar um grep $wallpaper para buscar todos os Wallpapers, mas isso tem um problema: A saída da variável $wallpaper é “ Autumm by jwvein.png” ao invés de “Autumm by jwvein.png”.
A diferença é sutil, mas importante. Para retirar esse espaço no começo, é usado o $(echo ${wallpaper#[[:space:]]*})) para tratar essa variável, e assim ter o caminho completo do Wallpaper. Nesse caso, o /usr/share/backgrounds/Autumm by jwvein.png.
Mas ainda tem um detalhe: E se o usuário apenas sair do Rofi, sem escolher um Wallpaper? Esse trecho do Script serve para exatamente isso:
if [ x"Current" = x"${wallpaper}" ]; then
exit
elif [ -n "${wallpaper}" ]; then
selectMode
fi
Se o Wallpaper não for escolhido, o Rofi não faz nada. Se for escolhido um Wallpaper, o Rofi irá aplicar ele ou dar a escolha do que fazer.
Escolhendo o que fazer com o Wallpaper
Eu poderia simplesmente colocar o comando para aplicar o Wallpaper, mas decidi melhorar um pouco mais. Precisei de mais três funções para dar a escolha do que fazer.
A primeira função, monta a lista com as escolhas e que a princípio são três: Aplicar o Wallpaper e pintar alguns elementos da interface com as cores do Wallpaper, apenas Aplicar o Wallpaper ou aplicar ele na tela de bloqueio.

Com isso montado, é a hora de ir para a segunda parte: Montar a lista e jogar para o Rofi.
runRofiMode () {
echo -e "$option1\n$option2\n$option3" | rofi -dmenu -theme $confirmRASI
}
E a última função, “amarra” as outras duas e executa a opção escolhida.
selectMode () {
rofiMode
choose=$(runRofiMode)
case ${choose} in
$option1)
nippy-wal --colorize "$walPath"
;;
$option2)
nippy-wal --wallpaper "$walPath"
;;
$option3)
nippy-wal --lockscreen "$walPath"
;;
esac
}
esac
}
Com o rofiMode as variáveis da lista são alimentadas, depois vem a escolha do que fazer com o choose=$(runRofiMode) e por fim, é usado um laço case para finalmente executar os comandos.
Pequenos ajustes no Rofi
Mas isso não é tudo. Ainda precisamos de ajustes no tema do Rofi. Primeiramente, colocar mais colunas para serem exibidas no Rofi, alterando as variáveis columns e lines. No meu caso, deixei o meu Rofi com 5 colunas e 2 linhas.
listview {
enabled: true;
columns: 5;
lines: 2;
cycle: true;
dynamic: true;
scrollbar: true;
layout: vertical;
reverse: false;
fixed-height: true;
fixed-columns: true;
spacing: 10px;
margin: 10px;
padding: 0px;
border: 0px solid;
border-radius: 0px;
border-color: @border-colour;
background-color: transparent;
text-color: @foreground-colour;
cursor: "default";
}
Isso vai fazer o Rofi ficar assim:

Mas isso não é tudo. Precisamos alterar a disposição dos elementos, alterando a variável orientation de “horizontal” para “vertical”.
element {
enabled: true;
spacing: 15px;
margin: 0px;
padding: 20px 10px;
border: 0px solid;
border-radius: 10px;
border-color: @selected;
background-color: transparent;
text-color: @foreground;
orientation: vertical;
cursor: pointer;
}
Com essa alteração, o Rofi ficará assim:

Mas as miniaturas estão muito pequenas. Nisso, teremos que alterar mais uma variável. Nesse caso, a size que coloquei em 128px.
element-icon {
background-color: transparent;
text-color: inherit;
size: 128px;
cursor: inherit;
}
E isso faz com que o Rofi exiba as minuaturas em um tamanho maior.

E com isso, concluímos o seletor de Wallpapers.