充电时自动更换壁纸的脚本

充电时自动更换壁纸的脚本

有没有办法制作一个 bash 脚本(或 gnome 扩展)来在切换到 AC/Battery 时设置自定义壁纸?

答案1

你可以通过三个步骤完成。首先,你需要创建一个 udev 规则。我以我的鼠标为例。

/etc/udev/rules.d/99-battery.rules:

ACTION=="change", \
KERNEL=="hidpp_battery_0", \
SUBSYSTEM=="power_supply", \
ATTR{model_name}=="Performance MX", \
TAG+="systemd", \
ENV{SYSTEMD_READY}="1", \
ENV{SYSTEMD_USER_WANTS}="battery@%E{POWER_SUPPLY_STATUS}.service"

如果您对 udev 规则进行任何更改并且设备已连接,则必须使用 再次明确应用您的规则udevadm trigger

查找设备有用属性的最简单方法是启动 udev 监视器,连接充电线。现在您应该可以看到 udev 路径和环境属性。

$ udevadm monitor --udev --environment

使用你的 udev 路径,你可以查询设备的其余属性(就我的情况而言):

$ udevadm info -a --path='/sys/devices/pci0000:00/0000:00:13.1/usb6/6-3/6-3:1.2/0003:046D:C52B.0006/0003:046D:101A.0007/power_supply/hidpp_battery_0'

接下来,您需要创建一个 systemd 模板。这样的服务称为“实例化”服务。它使得可以通过服务名称发送单个参数成为可能。使用 % 说明符,可以访问服务内的“参数”。

/etc/systemd/用户/[电子邮件保护]

[Unit]
Description=Logitech Battery Service

[Service]
ExecStart=/opt/bin/battery.sh %i

KDE 中没有 dbus 方法来更改背景(至少我知道的),所以我不得不使用 javascript 片段。

/opt/bin/battery.sh:

#!/bin/bash

declare -l status=$1

[[ ! $status \
=~ (full|(dis)?charging) ]] && exit 0

if [[ $XDG_SESSION_DESKTOP = KDE ]]; then

javascript=$(cat << EOF
const o = {
    wallpaperPlugin: 'org.kde.image',
    currentConfigGroup: [
        'Wallpaper', 'org.kde.image', 'General'
    ]
}
for (i in (d = desktops())) {
    Object.assign(d[i], o).writeConfig('Image', 'file:///opt/wallpapers/battery_$status.png');
}
EOF
)
    busctl --user call org.kde.plasmashell /PlasmaShell org.kde.PlasmaShell evaluateScript s "$javascript"

elif [[ $XDG_SESSION_DESKTOP = GNOME ]]; then

    dconf gsettings set org.gnome.desktop.background picture-uri "'file:///opt/wallpapers/battery_$status.png'"
fi

该脚本将在目录中查找名为battery_full.pngbattery_charging.png和的图像。battery_discharging.png/opt/wallpapers/

相关内容