插入/卸下充电器后,如何使用Notify-OSD接收通知?


9

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


我可以编写一个脚本来执行此操作..但这不是一个非常优雅的解决方案。
赛斯2014年

@Seth这样的脚本看起来如何?您可以在答案中发布吗?我对您如何识别“充电器未插电”事件特别感兴趣……
landroni 2015年

@landroni哦,没有意识到您不是OP。我在下面发布了答案。它对我来说很好,但是我的一些朋友遇到了问题。让我知道这是否对您不起作用。在我们讲话时,我正在尝试一种更好的方法。
赛斯2015年

@Seth非常感谢您对此进行调查。碰巧的是,我的电池没电了,很快就死了,所以到现在为止我的查询还有些争议。但是我会在将来牢记这种解决方案。
landroni 2015年

Answers:


6

交流电源和电池电源之间的切换应在D-Bus系统总线上产生一个事件。运行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

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


6

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

公交车

有人报告说,当电源线插入时,我较早的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规则完成此任务。有人报告说它有时会多次发送通知,但我没有任何问题。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                              

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


那行得通,但是需要root访问权限和复杂的机制才能将通知发送到桌面,或者像您一样对用户进行硬编码。我认为您还需要设置XAUTHORITY一些显示管理器,例如gdm。
吉尔(Gilles)'所以

@Gilles IMO“需要root”,并且硬编码的用户是非常愚蠢的nitpicks,但是如果您认为这很重要,我将在稍后出于完整性考虑添加cron解决方案。我很高兴这在GDM下有效,但我会仔细检查。
塞斯2015年

1
我还研究了python-dbus和udev的dbus消息传递API,也许创建了一个守护程序,该守护程序将与这些udev规则做相同的事情,但是唯一的问题是它将需要不断运行并在任何情况下重新启动故障,我相信这已经为相当不错的解决方案增加了更多的复杂性。但是,如果有更好的解决方案,我很高兴听到它们。
joshumax 2015年

并非每个人都将Ubuntu作为单用户系统运行。Cron在这里没有用。我知道您需要额外的步骤来查找X cookie文件Gdm的较早版本的位置,我不知道最新版本,但是我认为这没有改变。KDM也有同样的问题。@joshumax您可以从其他来源获取信息,甚至可以通过dbus使用dbus-monitor。看我的答案。
吉尔斯(Gilles)'所以别再邪恶了'

2

脚本源

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: 1047481448@qq.com 
# 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是好的选择?因为它依赖于检查多个子系统。它还提供了足够简单的命令来使用-结果为true或false。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.