当底层图像文件被修改时自动更新桌面背景

当底层图像文件被修改时自动更新桌面背景

在 Ubuntu 20.04 中,我使用自定义 png 文件作为背景图像,以图形方式显示 CPU 使用率、磁盘空间等统计信息。将图像设置为背景效果很好(右键单击桌面 -> 设置 -> 背景 -> 添加图片)。

但是,当修改图像时,背景不会更新;即使重启后也是如此。(在 Ubuntu 18.04 中就是这种情况)

如何让 Ubuntu 在底层图像文件发生改变时自动更新背景?


混乱的解决方案:

根据 Vikki 和 vanadiums 的回复,我发现了一个可行的方法:

cd ~/.local/share/backgrounds
rm ./<copy_of_the_background_file>
ln -s <path_to_original_background_file> ./<copy_of_the_background_file>

安装一个 crontab 来执行

touch -h ~/.local/share/backgrounds/<copy_of_the_background_file>

以固定的时间间隔(例如每分钟左右)。

这样,如果<path_to_original_background_file>被新版本覆盖,符号链接将指向新文件。


有人知道更简洁的方法来做到这一点吗?有没有办法修改 gnome 寻找背景图像的路径?

答案1

当您从自定义图形设置背景时,文件.local/share/backgrounds夹中会创建该图形的副本。该副本将用作背景。因此,您需要修改该副本才能使其正常工作。

如果文件被修改,桌面将自动更新到位或者如果另一个图形被复制到文件上(cp <another_graphic> <yourbackground>),即假设文件 inode 不变。删除或移动文件,然后重命名另一个文件将不起作用:您的背景将变黑。在这种情况下,只有使用设置将其重新设置或注销然后重新登录才能恢复它。

答案2

使用inotifywait

这是一个更清洁的解决方案。

inotifywait当文件未被编辑时,不会浪费 CPU 资源来检查更改。相反,它只在文件被更改时返回一个值。这意味着我们可以在 while 循环中使用它:

# find your background file, which may be png or jpg.
BGfile = find ~/.local/share/backgrounds/ -iname '*.png' -or -iname '*.jpg' 

while inotifywait -e attrib /path/to/original/background/image.jpg
do 
  cp /path/to/original/background/image.jpg ${BGfile} # direct overwriting hack mentioned by @vanadium
done

此脚本启动一个实例来inotifywatch监视attrib原始背景图像文件的元数据 ( ) 的更改。当元数据最终更改时,inotifywatch 终止并返回真值。这会触发循环内的复制操作,然后在循环inotifywatch开始时while再次启动一个新的实例。


注意事项

  1. attrib根据操作系统的不同,计算机上可能需要的选项也不同。尝试一下,设置一些实验,找出你的操作系统和 Ubuntu 版本最适合哪一个。(我的旧 Ubuntu 18.04 适合close_write,但我的新 Ubuntu 22.04 最适合attrib
  2. 如果您希望在没有终端的情况下在后台运行此程序,则无需使用 crontab。您可以简单地将其包装起来nohup并放入脚本中,如下所示:
if [[ -z $(pgrep inotifywait) ]]; then # ignore this line if an "inotifywait" process is already running; ensures idempotency.
  nohup bash -c 'while inotifywait -e attrib /path/to/original/background/image.jpg; do cp /path/to/original/background/image.jpg ~/.local/share/backgrounds/<target_image.jpg>; done' &>/tmp/nohup-inotifywait.out &
fi

然后您可以从终端运行此脚本,然后该脚本将自行分离并将所有输出和错误打印到 /tmp/nohub-inotifywait.out。然后,即使您关闭终端,此 while 循环仍将存在于后台。

  1. 如果您希望此脚本在启动时运行,您可以使用“启动应用程序首选项”应用程序:

启动应用程序偏好设置

例如,我已命名我的脚本inotifyActions.sh并将其保存在~/

在此处输入图片描述

这样,您甚至不需要在每次启动计算机时启动终端并运行“~/inotifyActions.sh” - 它会在您启动时自动在后台运行。

(希望这能对其他人有所帮助!)

相关内容