Algoritmo para alterar o papel de parede do desktop ubuntu

1

Então, eu sei que já existem alguns programas na internet que fazem esse truque. Mas imagino que esse seja um programa muito simples de se fazer.

Posso fazer isso com C e / ou script de shell ? Eu quero fazer uma função que faz algo como bool setDesktopBG(ImagePath path) quais são as principais chamadas que devo fazer para fazer isso? Quais pacotes devo acessar para fazer isso? Eu nunca codifiquei nada relacionado ao sistema operacional como este, então não sei exatamente por onde começar?

Além disso, esta pergunta é mais adequada ao Stack Overflow? Se for o caso, vou apagá-lo e postar lá. Agradecemos antecipadamente.

    
por fabionr 10.03.2016 / 23:48

1 resposta

2

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 "$@"
    
por Sergiy Kolodyazhnyy 11.03.2016 / 00:15