更改 Ubuntu 桌面壁纸的算法

更改 Ubuntu 桌面壁纸的算法

所以,我知道互联网上已经有一些程序可以实现这个技巧。但我想这个程序应该很容易制作。

我可以和C和/或shell 脚本?我想创建一个函数来执行一些操作,例如,bool setDesktopBG(ImagePath path)为了执行此操作我必须进行哪些主要调用?我应该访问哪些数据包来执行此操作?我从未编写过与操作系统相关的任何代码,所以我不知道从哪里开始?

另外,这个问题是否更适合 Stack Overflow?如果是的话,我会删除它并发布在那里。提前致谢。

答案1

壁纸有什么变化

如果 Ubuntu 默认设置背景,则通过 进行设置gsettings。简而言之,它是各种应用程序设置的数据库形式。简单的命令如下:

gsettings set org.gnome.desktop.background picture-uri "$FILE" 

,其中"$FILE"shell 脚本变量保存了图像的完整路径,格式为file:///path/to/image.png

这与其他桌面环境有些不同。可以想象 Ubuntu 的 Unity 和 Gnome 在典型的 X11 服务器(即 GUI 环境之上的层)上有一个层。在这样的环境中,blackboxopenbox需要调用外部程序。例如,feh --bg-scale /path/to/image

我假设您想要处理默认环境——Ubuntu 的 Unity。

制作 shell 函数

这是我在文件中使用的示例.bashrc

function chbackground {
    FILE="'file://$(readlink -f "$1" )'" 
    echo changing to "$FILE" 
    gsettings set org.gnome.desktop.background picture-uri "$FILE" 
}

该函数可以像这样调用

chbackground WALLPAPERS-FOLDER/cool-background.png

此函数有两个重要部分。首先,我们可以拥有文件的完整路径或部分路径 - 这就是readlink -f "$1"需要注意的 - 它返回图像的完整路径。然后我们通过组合readlink -f "$1"和的输出将其转换为字符串file://。请记住,Unix 路径始终以根文件夹开头,/因此我们只需要在那里以两个斜杠开头。结果将是file:///home/user/WALLPAPERS-FOLDER/cool-background.png字符串并存储在FILE变量中。

最后我们gsettings用它FILE作为参数进行调用。

此函数可以是任何脚本的一部分,并以任何部分或完整路径作为参数进行调用。

编写脚本

这是我在大约 15 分钟内草拟的脚本,它将列出图像列表,然后从该列表中选择随机图像,并将该图像设置为背景。该脚本也放在我的github塞尔格里普存储库存储库,并且将进行一点点开发以包含额外的功能,但在大多数情况下,这里的代码版本完成了大工作。

为了自动化此脚本,请参阅如何使程序在每次登录时自动启动?

#!/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 "$@"

相关内容