ker*_*nic 9 battery notification notify-osd
当我插入/拔出充电器时,如何使用 notify-osd 获得屏幕通知?
有些人报告说我之前的 udev 解决方案在插入电源线时发送了太多次通知。我无法重现这一点,但我编写了这个 python 脚本来利用 dbus 而不是 udev。将其另存为.py
硬盘上某处的文件。通过运行将文件标记为可执行:
sudo chmod +x yourFile.py
Run Code Online (Sandbox Code Playgroud)
并将其添加到您的启动应用程序中,如此处所述。此脚本需要acpi
安装软件包。
sudo chmod +x yourFile.py
Run Code Online (Sandbox Code Playgroud)
通过一些实验(和一些帮助),我能够利用udev规则来实现这一点。有些人报告说它有时会多次发送通知,但我没有遇到任何问题。天啊。
创建一个包含以下内容的脚本:
#!/usr/bin/python
import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject
import subprocess
dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)
onMessage="Power plugged in!"
offMessage="Power unplugged!"
onImage="/usr/share/icons/gnome/32x32/devices/ac-adapter.png"
offImage="/usr/share/icons/gnome/32x32/status/battery-full.png"
def callback():
state = subprocess.check_output(["acpi", "-a"]).split(':')[1].strip()
if state == "on-line":
subprocess.call(["notify-send", "-i", onImage, onMessage])
elif state == "off-line":
subprocess.call(["notify-send", "-i", offImage, offMessage])
bus.add_signal_receiver(callback, 'Changed', 'org.freedesktop.UPower.Device', 'org.freedesktop.UPower', '/org/freedesktop/UPower/devices/line_power_AC')
loop = gobject.MainLoop()
loop.run()
Run Code Online (Sandbox Code Playgroud)
替换some_user
为您的用户名。通过运行将文件标记为可执行:
sudo chmod +x /path/to/script.sh
Run Code Online (Sandbox Code Playgroud)
替换/path/to/script.sh
为您保存脚本的路径。
接下来创建一个/etc/udev/rules.d
以10-power.rules
内容命名的文件:
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="0", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="off"
SUBSYSTEM=="power_supply", ACTION=="change", ENV{POWER_SUPPLY_ONLINE}=="1", OPTIONS+="last_rule", RUN+="/path/to/script.sh" ENV{POWER}="on"
Run Code Online (Sandbox Code Playgroud)
再次替换/path/to/script.sh
为您之前创建的脚本的路径。
现在通过运行重新加载 udev 规则:
sudo udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)
拔下电源线。你应该会收到通知。
在交流电源和电池电源之间切换应该会在D-Bus系统总线上产生一个事件。运行dbus-monitor --system
并观察系统上生成的事件。
#!/bin/sh
upower -m |
while read -r _time _2 _3 device; do
[ "$device" = "/org/freedesktop/UPower/devices/line_power_AC" ] || continue
notify-send "$(acpi -a)"
done
Run Code Online (Sandbox Code Playgroud)
您还可以从acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Run Code Online (Sandbox Code Playgroud)
当您想开始查看通知时运行此脚本,或将其添加到会话启动中。