Jak mogę otrzymać powiadomienie na ekranie za pomocą powiadomienia-osd, kiedy podłączam / odłączam ładowarkę?
Jak mogę otrzymać powiadomienie na ekranie za pomocą powiadomienia-osd, kiedy podłączam / odłączam ładowarkę?
Odpowiedzi:
Przełączanie między zasilaniem AC i akumulatorem powinno generować zdarzenie na magistrali systemowej D-Bus . Uruchom dbus-monitor --system
i obserwuj, jakie zdarzenia są generowane w twoim systemie.
Jeśli masz wyższą wydajność , otrzymujesz bardziej wyspecjalizowane powiadomienia od 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
Możesz także otrzymywać wydarzenia od acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Uruchom ten skrypt, jeśli chcesz zacząć widzieć powiadomienia, lub dodaj go do uruchamiania sesji.
Niektóre osoby zgłosiły, że moje wcześniejsze rozwiązanie udev wysłało powiadomienie zbyt wiele razy, gdy kabel zasilający był podłączony. Nie mogłem tego odtworzyć, ale napisałem ten skrypt Pythona, aby używać dbus zamiast udev. Zapisz go jako .py
plik gdzieś na dysku twardym. Zaznacz plik wykonywalny, uruchamiając:
sudo chmod +x yourFile.py
i dodaj go do aplikacji startowych zgodnie z opisem tutaj . Ten skrypt wymaga acpi
zainstalowania pakietu .
#!/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()
Przy odrobinie eksperymentów (i niewielkiej pomocy) udało mi się zastosować regułę udev, aby to osiągnąć. Niektóre osoby zgłosiły, że czasami wysyła powiadomienie więcej niż raz, ale nie miałem żadnych problemów. YMMV.
Utwórz skrypt o następującej treści:
#!/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
zastępując some_user
swoją nazwę użytkownika. Zaznacz plik wykonywalny, uruchamiając:
sudo chmod +x /path/to/script.sh
zastępując /path/to/script.sh
ścieżką do miejsca, w którym zapisałeś skrypt.
Następnie utwórz plik o /etc/udev/rules.d
nazwie 10-power.rules
z zawartością:
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"
ponownie zastępując /path/to/script.sh
ścieżką do wcześniej utworzonego skryptu.
Teraz ponownie załaduj reguły udev, uruchamiając:
sudo udevadm control --reload-rules
Odłącz kabel zasilający. Powinieneś otrzymać powiadomienie.
XAUTHORITY
kilka menedżerów wyświetlania, takich jak gdm.
dbus-monitor
. Zobacz moją odpowiedź.
Źródło skryptu
#!/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
Zdobycie skryptu
Skrypt został również dodany do mojego github ; ta wersja zostanie zaktualizowana i opracowana nieco więcej.
Możesz to zrobić, wykonując następujące czynności:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Skrypt będzie w /opt/sergrep
katalogu o nazwienotify_ac_change.sh
Projekt koncepcji
Kluczowe pytania brzmią: „Jak sprawdzamy obecność zasilacza sieciowego?” i „Jak wykrywamy zmiany?”
Cóż, ten problem został rozwiązany dawno temu przez innych programistów. Ubuntu jest domyślnie wyposażony w skrypt o nazwie on_ac_power , w którym jest przechowywany /usr/bin/on_ac_power
. Zasilacz można wymienić w różnych podsystemach jądra (ACPI lub APM), ale ten skrypt upraszcza naszą pracę - autorzy opisali wiele możliwych wariantów. Zwraca tylko status wyjścia, więc jest odpowiedni do użycia w if
instrukcjach.
Dlaczego warto on_ac_power
wybrać? Ponieważ polega na sprawdzeniu wielu podsystemów. Zapewnia również wystarczająco proste polecenie do pracy - wynik jest albo prawdziwy, albo fałszywy.
Mamy więc narzędzie do wykrywania obecności, ale co z logiką? Musimy sondować obecność i wykryć zmianę stanu. Co możemy zrobić, to przechowywać status wyjścia on_ac_power
i stale porównywać aktualny stan z tym, co zapisaliśmy, gdy się zmieni - wyślij powiadomienie, zapisz ponownie status i kontynuuj porównywanie, zapętlając. Podstawowym pomysłem jest użycie flag.
Krótko mówiąc, inicjalizujemy migawkę stanu, a następnie stale odpytujemy o zmianę z migawki; gdy nastąpi zmiana - powiadom i przywróć migawkę.