如何让Nautilus的‘Set as Background’按钮调用自定义bash脚本?
如何让Nautilus的‘Set as Background’按钮调用自定义bash脚本?
嘿,这个问题我在Hyprland下也碰到过——Nautilus默认依赖GNOME的DBus壁纸门户接口,但Hyprland压根没实现这个,所以才会报那个错。既然你已经有能用的bash壁纸脚本,咱们有几种办法让Nautilus的「Set as Background」按钮乖乖调用它,挑适合你的来:
方法一:模拟DBus壁纸门户接口(推荐,保留默认按钮)
这个方法是让系统以为存在那个缺失的DBus接口,实际调用你的脚本,完美适配Nautilus的默认按钮:
- 写个DBus服务中间层
因为bash脚本没法直接处理DBus调用,我们用Python写个简单的中间脚本(需要先装python-dbus和python-gi包)。创建~/.local/bin/wallpaper-portal.py,内容如下:
import dbus import dbus.service import subprocess from dbus.mainloop.glib import DBusGMainLoop import gi gi.require_version('GLib', '2.0') from gi.repository import GLib class WallpaperPortal(dbus.service.Object): def __init__(self): bus_name = dbus.service.BusName('org.freedesktop.portal.Wallpaper', bus=dbus.SessionBus()) dbus.service.Object.__init__(self, bus_name, '/org/freedesktop/portal/desktop') @dbus.service.method('org.freedesktop.portal.Wallpaper', in_signature='sbb', out_signature='u') def SetWallpaper(self, uri, show_preview, allow_modify): # 把Nautilus传的file://路径转成本地绝对路径 local_path = uri.replace('file://', '') # 调用你的bash壁纸脚本,传入图片路径 subprocess.run(['/path/to/your/actual-wallpaper-script.sh', local_path]) # 按门户协议要求返回一个随机uint就行 return 1 if __name__ == '__main__': DBusGMainLoop(set_as_default=True) portal = WallpaperPortal() loop = GLib.MainLoop() loop.run()
记得把/path/to/your/actual-wallpaper-script.sh换成你自己的脚本路径。
- 注册DBus服务
创建~/.local/share/dbus-1/services/org.freedesktop.portal.Wallpaper.service,内容:
[D-BUS Service] Name=org.freedesktop.portal.Wallpaper Exec=/usr/bin/python3 ~/.local/bin/wallpaper-portal.py User=%u
- 重启生效
注销再登录,或者重启DBus会话,之后Nautilus点「Set as Background」就会触发你的脚本了。
方法二:给Nautilus加自定义脚本菜单(简单直接)
如果不想折腾DBus,直接给Nautilus加个右键菜单选项,虽然不是替换默认按钮,但用起来也方便:
- 创建脚本文件
在~/.local/share/nautilus/scripts/下新建文件Set as Wallpaper,内容:
#!/bin/bash # 获取Nautilus选中的图片路径 IMAGE_PATH="$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" # 调用你的壁纸脚本 /path/to/your/actual-wallpaper-script.sh "$IMAGE_PATH"
- 加执行权限
打开终端跑这个命令:
chmod +x ~/.local/share/nautilus/scripts/Set\ as\ Wallpaper
- 重启Nautilus
nautilus -q
之后右键图片,在「Scripts」菜单里就能看到这个选项,点它就会调用你的脚本。
方法三:监听GNOME背景设置变化
Nautilus默认会修改GNOME的gsettings背景项,我们可以监听这个变化,触发你的脚本:
- 写监听脚本
创建~/.local/bin/gsettings-wallpaper-listener.sh,内容:
#!/bin/bash # 初始化当前壁纸路径 current_uri="" while true; do # 获取当前GNOME背景设置的URI new_uri=$(gsettings get org.gnome.desktop.background picture-uri | tr -d "'") # 如果路径变化了,调用脚本 if [ "$new_uri" != "$current_uri" ]; then current_uri="$new_uri" local_path=${new_uri//file:\/\//} /path/to/your/actual-wallpaper-script.sh "$local_path" fi sleep 1 done
- 设置开机自启
打开你的Hyprland配置文件~/.config/hyprland/hyprland.conf,加一行:
exec-once = ~/.local/bin/gsettings-wallpaper-listener.sh
重启Hyprland后,Nautilus点默认的「Set as Background」时,这个监听脚本就会触发你的壁纸脚本。
备注:内容来源于stack exchange,提问作者Bartek Masiak
相关产品推荐
相关产品推荐

