如何在插入/移除充电器时使用 Notify-OSD 获得通知?

ker*_*nic 9 battery notification notify-osd

当我插入/拔出充电器时,如何使用 notify-osd 获得屏幕通知?

Set*_*eth 7

在此处输入图片说明 在此处输入图片说明

总线

有些人报告说我之前的 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.d10-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)

拔下电源线。你应该会收到通知。


Gil*_*il' 6

在交流电源和电池电源之间切换应该会在D-Bus系统总线上产生一个事件。运行dbus-monitor --system并观察系统上生成的事件。

如果您正在运行upower,您会从upower -m.

#!/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)

当您想开始查看通知时运行此脚本,或将其添加到会话启动中。