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

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

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

答案1

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

如果你有优力运行时,您会收到更多专门的通知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

您还可以从以下位置获取事件acpi_listen

#!/bin/sh
acpi_listen |
while read -r what junk; do
  [ "$what" = "ac_adapter" ] || continue
  notify-send "$(acpi -a)"
done

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

答案2

在此处输入图片描述 在此处输入图片描述

总线

有人报告说,我之前的 udev 解决方案在插入电源线时发送了太多次通知。我无法重现这种情况,但我编写了这个 python 脚本来利用 dbus 而不是 udev。将其保存为.py硬盘上的某个文件。通过运行将文件标记为可执行文件:

sudo chmod +x yourFile.py  

并将其添加到您的启动应用程序中如这里所述。此脚本需要acpi安装该包。

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

udev

通过一些实验(和一些帮助),我能够利用udev规则来实现这一点。有些人报告说它有时会多次发送通知,但我没有遇到任何问题。YMMV。

创建一个脚本,内容如下:

#!/bin/bash

# Set this to your username
USER="some_user"

if [ "$POWER" == "on" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/devices/ac-adapter.png "Power cable plugged in."'
elif [ "$POWER" == "off" ]
  then
  DISPLAY=:0 /bin/su $USER -c '/usr/bin/notify-send -i /usr/share/icons/gnome/32x32/status/battery-full.png "Power cable unplugged."'
fi

替换some_user为您的用户名。通过运行以下命令将文件标记为可执行文件:

sudo chmod +x /path/to/script.sh  

替换/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"

再次替换/path/to/script.sh为您之前创建的脚本的路径。

现在通过运行以下命令重新加载 udev 规则:

sudo udevadm control --reload-rules                              

拔掉电源线。您应该会收到通知。

答案3

脚本源

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: March 11, 2016
# Purpose: Script to detect connection/disconnection
#          of the ac adapter
#          
# 
# Written for: http://askubuntu.com/q/542986/295286
# Tested on: Ubuntu 14.04 LTS
# Version: 0.2
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use, copy, modify, and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
#set -x
ARGV0="$0"
ARGC=$#

test_presence()
{
  on_ac_power
  echo $?
}

notify_change()
{
   pgrep -f '/usr/bin/X' > /dev/null && GUI=true
   connected='AC adapter connected'
   disconnected='AC adapter disconnected'

   if [ $1 -eq 0 ]
   then
           wall <<< $connected        
           $GUI && DISPLAY=:0 notify-send 'AC adapter connected'

   else
           wall <<< $connected
           $GUI && DISPLAY=:0 notify-send 'AC adapter disconnected'
   fi
}

main()
{
  FLAG=$(test_presence)

  while true
  do
     STATUS=$(test_presence)

     if [ $STATUS -eq $FLAG   ]
     then
        continue
     else
        notify_change $STATUS
        FLAG=$STATUS
     fi

  sleep 3 #0.25
  done
}  

main 

获取脚本

脚本也添加到我的github;该版本将会进行更新和进一步开发。

您可以通过以下步骤获取它:

  1. sugo apt-get install git
  2. cd /opt

  3. git clone https://github.com/SergKolo/sergrep.git

脚本将位于/opt/sergrep名为notify_ac_change.sh

概念设计

关键问题是“我们如何检查交流适配器是否存在?”“我们如何发现变化?”

其实这个问题早就被其他开发人员解决了。Ubuntu 默认自带了一个名为on_ac_power,存储在 中/usr/bin/on_ac_power。电源适配器可以在内核的不同子系统( ACPI 或 APM )下提及,但此脚本使我们的工作更简单 - 作者已经涵盖了许多可能的变化。它仅返回退出状态,因此适合在if语句中使用。

为什么这是on_ac_power个不错的选择?因为它依赖于检查多个子系统。它还提供了足够简单的命令来使用 - 结果要么是真,要么是假。

因此,我们有了存在检测工具,但逻辑呢?我们需要轮询存在并检测状态的变化。我们可以做的是存储退出状态on_ac_power并不断将当前状态与我们保存的状态进行比较,一旦它发生变化 - 发送通知,再次保存状态,并继续再次比较,循环。基本思想是使用标志。

简而言之,我们初始化状态快照,然后不断轮询快照中的变化;一旦发生变化 - 通知并重置快照。

相关内容