最近想要给gnome实现定时的自动更换壁纸的功能,但现成的gnome扩展或搜索到的相关软件要么有这样那样的问题,要么完全不能用。于是我只能自己动手实现功能。
于是我就写出了一个脚本,进而写出了这篇文章。

写在正式开始前

由于需求高度明确,且我的脚本编写水平比较菜,导致文中的脚本功能比较固定,甚至缺乏一些自动化获取输入的能力,如果有人抄作业的话可以酌情修改、优化。

本文中的部分思路和几乎全部systemd的相关内容来自这篇文章

思路

  1. 从目标文件夹中随机选择一张图片
  2. 通过gsettings识别gnome目前的外观样式(亮色或暗色)
  3. 通过gsettings更换对应的壁纸
  4. 通过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

这里的PartOfWantBy保证在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图形化编辑器进行修改。
个人向arch linux壁纸自动切换脚本.webp

标签: archlinux, bash, gnome

添加新评论