Comment puis-je recevoir une notification à l'écran à l'aide de notify-osd lorsque je branche / débranche le chargeur?
Comment puis-je recevoir une notification à l'écran à l'aide de notify-osd lorsque je branche / débranche le chargeur?
Réponses:
La commutation entre l'alimentation CA et l'alimentation par batterie doit générer un événement sur le bus système D-Bus . Exécutez dbus-monitor --system
et regardez quels événements sont générés sur votre système.
Si votre ordinateur est en cours d'exécution, vous recevez des notifications plus spécialisées de 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
Vous pouvez également obtenir des événements de acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Exécutez ce script lorsque vous souhaitez commencer à voir les notifications ou ajoutez-le au démarrage de votre session.
Certaines personnes ont signalé que ma solution udev précédente avait envoyé la notification trop de fois lorsque le câble d'alimentation était branché. Je n'ai pas pu reproduire cela, mais j'ai écrit ce script python pour utiliser dbus au lieu d'udev. Enregistrez-le sous forme de .py
fichier quelque part sur votre disque dur. Marquez le fichier exécutable en exécutant:
sudo chmod +x yourFile.py
et ajoutez-le à vos applications de démarrage comme décrit ici . Ce script nécessite que le package acpi
soit installé.
#!/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()
Avec un peu d'expérimentation (et un peu d'aide), j'ai pu utiliser une règle udev pour accomplir cela. Certaines personnes ont signalé qu'il envoyait parfois la notification plusieurs fois, mais je n'ai eu aucun problème. YMMV.
Créez un script avec le contenu suivant:
#!/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
remplacer some_user
par votre nom d'utilisateur. Marquez le fichier exécutable en exécutant:
sudo chmod +x /path/to/script.sh
en remplaçant /path/to/script.sh
par le chemin d'accès à l'endroit où vous avez enregistré le script.
Créez ensuite un fichier dans /etc/udev/rules.d
named 10-power.rules
avec le contenu:
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"
remplaçant à nouveau /path/to/script.sh
par le chemin d'accès au script que vous avez créé précédemment.
Rechargez maintenant les règles udev en exécutant:
sudo udevadm control --reload-rules
Débranchez le câble d'alimentation. Vous devriez recevoir une notification.
XAUTHORITY
avec certains gestionnaires d'affichage tels que gdm.
dbus-monitor
. Voir ma réponse.
Source de script
#!/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
Obtenir le script
Le script est également ajouté à mon github ; cette version sera mise à jour et développée un tout petit peu plus.
Vous pouvez l'obtenir en procédant comme suit:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Le script sera dans le /opt/sergrep
répertoire, nomménotify_ac_change.sh
Concept de design
Les questions clés sont "Comment vérifier la présence de l'adaptateur secteur?" et "Comment détectons-nous les changements?"
Eh bien, ce problème a été résolu il y a longtemps par d'autres développeurs. Ubuntu est livré par défaut avec un script appelé on_ac_power , qui est stocké dans /usr/bin/on_ac_power
. L'adaptateur d'alimentation peut être mentionné sous différents sous-systèmes du noyau (ACPI ou APM), mais ce script simplifie notre travail - les auteurs ont couvert de nombreuses variantes possibles. Il ne renvoie que l'état de sortie, il est donc approprié pour une utilisation dans les if
instructions.
Pourquoi est on_ac_power
-ce un bon choix? Parce qu'il repose sur la vérification de plusieurs sous-systèmes. Il fournit également une commande suffisamment simple pour fonctionner - le résultat est vrai ou faux.
Nous avons donc un outil de détection de présence, mais qu'en est-il de la logique? Nous devons interroger la présence et détecter les changements dans l'état. Ce que nous pouvons faire est de stocker l'état de sortie on_ac_power
et de comparer en permanence l'état actuel avec ce que nous avons enregistré, une fois qu'il change - envoyer une notification, enregistrer à nouveau l'état et continuer à comparer à nouveau, en boucle. L'idée de base est l'utilisation de drapeaux.
En bref, nous initialisons un instantané de l'état, puis nous interrogeons continuellement les changements à partir de l'instantané; une fois le changement effectué - notifiez et réinitialisez l'instantané.