Как я могу получить уведомление на экране, используя notify-osd, когда я подключаю / отключаю зарядное устройство?
Как я могу получить уведомление на экране, используя notify-osd, когда я подключаю / отключаю зарядное устройство?
Ответы:
Переключение между питанием от сети и аккумулятором должно генерировать событие на системной шине 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
Вы также можете получить события от acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Запустите этот скрипт, если вы хотите начать видеть уведомления, или добавьте его в свой сеанс запуска.
Некоторые люди сообщали, что мое предыдущее решение 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
Отключите кабель питания. Вы должны получить уведомление.
XAUTHORITY
некоторые дисплеи, такие как gdm.
dbus-monitor
. Смотри мой ответ.
Источник скрипта
#!/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 ; эта версия будет обновлена и разработана чуть больше.
Вы можете получить это, выполнив следующие действия:
sugo apt-get install git
cd /opt
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
и постоянно сравнивать текущее состояние с тем, что мы сохранили, как только оно изменится - отправьте уведомление, сохраните статус снова и продолжите сравнение, повторяя цикл. Основная идея - использование флагов.
Короче говоря, мы инициализируем снимок состояния, а затем постоянно запрашиваем изменения из снимка; как только произойдет изменение - сообщите и сбросьте снимок.