Як я можу отримати екранне сповіщення за допомогою notify-osd, коли я підключаю / вимикаю зарядний пристрій?
Як я можу отримати екранне сповіщення за допомогою notify-osd, коли я підключаю / вимикаю зарядний пристрій?
Відповіді:
Перемикання між живленням змінного струму та живленням акумулятора повинно призвести до події на системній шині 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
Запустіть цей сценарій, коли ви хочете почати бачити сповіщення, або додайте його до запуску сеансу.
Деякі люди повідомили, що моє попереднє рішення 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
хороший вибір? Тому що він покладається на перевірку декількох підсистем. Він також забезпечує досить просту команду для роботи - результат є істинним, або хибним.
Таким чином, у нас є інструмент виявлення присутності, а як щодо логіки? Нам потрібно опитати наявність та виявити зміни в державі. Що ми можемо зробити, це зберігати статус виходу on_ac_power
та постійно порівнювати поточний стан із тим, що ми зберегли, як тільки він зміниться - надіслати повідомлення, зберегти стан ще раз і продовжувати порівнювати, циклічно. Основна ідея - використання прапорів.
Коротше кажучи, ми ініціалізуємо знімок стану, а потім постійно запитуємо про зміни на момент знімка; як тільки відбудеться зміна - сповістіть і скиньте знімок.