所以,我知道互联网上已经有一些程序可以实现这个技巧。但我想这个程序应该很容易制作。
我可以和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 环境之上的层)上有一个层。在这样的环境中,blackbox
您openbox
需要调用外部程序。例如,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 "$@"