个人向arch linux壁纸自动切换脚本
最近想要给gnome实现定时的自动更换壁纸的功能,但现成的gnome扩展或搜索到的相关软件要么有这样那样的问题,要么完全不能用。于是我只能自己动手实现功能。
于是我就写出了一个脚本,进而写出了这篇文章。
写在正式开始前
由于需求高度明确,且我的脚本编写水平比较菜,导致文中的脚本功能比较固定,甚至缺乏一些自动化获取输入的能力,如果有人抄作业的话可以酌情修改、优化。
本文中的部分思路和几乎全部systemd的相关内容来自这篇文章
思路
- 从目标文件夹中随机选择一张图片
- 通过
gsettings
识别gnome目前的外观样式(亮色或暗色) - 通过
gsettings
更换对应的壁纸 - 通过
systemd
实现定时更换
实现
bash脚本
随机选择图片
从目标文件夹中随机选择一张图片可能有很多具体的实现,我这里仅叙述我的做法。
首先,生成一个随机数,代表图片序号。
random=$(( (RANDOM % 41) + 1 ))
这样就可以生成在 [1,41] 范围内的序号,其中「41」为目标文件夹中的图片数量。
然后,从ls
获取的图片列表中选择对应序号的图片,并拼装成完整路径。
pic_id="${random}p"
pic_filename=$(ls /path/to/pic | sed -n ${pic_id})
pic_uri="/path/to/pic/${pic_filename}"
这样就达成了随机选择一张图片。
识别gnome外观样式
一行脚本可以解决。
这行脚本完成的事情仅仅是获取并暂存dconf
中相关的gnome设置项。
using_color_scheme=$(gsettings get org.gnome.desktop.interface color-scheme)
更换对应的壁纸
通过分析当前gnome外观样式,使用gsettings
设置对应情况下的壁纸。
if [[ "$using_color_scheme" == "'prefer-dark'" ]];
then
gsettings set org.gnome.desktop.background picture-uri-dark ${pic_uri}
else
gsettings set org.gnome.desktop.background picture-uri ${pic_uri}
fi
需要注意的是,「"'prefer-dark'"」这个写法是由于gsettings
读取到的gnome外观样式对应字符串就是「'prefer-dark'」「'prefer-light'」之类带单引号的字符串。
完整脚本
#!/usr/bin/env bash
set -Eeo pipefail
random=$(( (RANDOM % 41) + 1 ))
pic_id="${random}p"
pic_filename=$(ls /home/fnxf/.local/share/backgrounds | sed -n ${pic_id})
pic_uri="/home/fnxf/.local/share/backgrounds/${pic_filename}"
using_color_scheme=$(gsettings get org.gnome.desktop.interface color-scheme)
if [[ "$using_color_scheme" == "'prefer-dark'" ]];
then
gsettings set org.gnome.desktop.background picture-uri-dark ${pic_uri}
else
gsettings set org.gnome.desktop.background picture-uri ${pic_uri}
fi
systemd
这里的配置几乎完全照搬coda在他的文章里面的内容,我只是去掉了我不需要的输入参数部分。
background.service
这里的%h
对于systemd --user
而言相当于$HOME
的作用。
[Unit]
Description=Select a random wallpaper
[Service]
Type=oneshot
ExecStart=%h/path/to/script.sh
background.timer
这里的PartOf
和WantBy
保证在gnome桌面环境下才会触发定时任务。
[Unit]
Description=Select a random wallpaper every 1 hour
PartOf=graphical-session.target
[Timer]
OnStartupSec=1
OnUnitActiveSec=1hours
AccuracySec=1s
[Install]
WantedBy=gnome-session.target
启动timer
由于我不需要将路径作为参数输入,因此启动过程也简单一些。
install -m640 background.service background.timer ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now background.timer
关于壁纸渲染模式
壁纸渲染模式一般不需要在脚本中进行设置,因为更换前后的壁纸会遵循相同的设置。
可选的修改方式有:
通过gsettings
gsettings set org.gnome.desktop.background picture-options 'zoom'
其中「zoom」为具体的渲染模式,可选值有:“none”(无)、“wallpaper”(壁纸)、“centered”(居中)、“scaled”(扩展)、“stretched”(拉伸)、“zoom”(缩放)、“spanned”(平铺)。
亦可通过dconf-editor
图形化编辑器进行修改。