Şarj cihazını takarken / çıkarırken notify-osd kullanarak nasıl ekran bildirimi alabilirim?
Şarj cihazını takarken / çıkarırken notify-osd kullanarak nasıl ekran bildirimi alabilirim?
Yanıtlar:
AC gücü ve pil gücü arasında geçiş yapılması, D-Bus sistem veriyolunda bir olay oluşturmalıdır . dbus-monitor --system
Sisteminizde hangi olayların oluşturulduğunu çalıştırın ve izleyin.
Eğer varsa upower çalışan, daha fazla bildirimleri uzman olsun 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
Ayrıca etkinliklerden de alabilirsiniz acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Bildirimleri görmeye başlamak istediğinizde bu komut dosyasını çalıştırın veya oturum başlangıç işleminize ekleyin.
Bazı insanlar, daha önce udev çözümümün güç kablosu takıldığında bildirimi çok kez gönderdiğini bildirdi. Bunu yeniden üretemedim ama udev yerine dbus kullanmak için bu python komut dosyasını yazdım. .py
Sabit sürücünüzün herhangi bir yerinde bir dosya olarak kaydedin. Yürütülebilir dosyayı çalıştırarak işaretleyin:
sudo chmod +x yourFile.py
ve burada açıklandığı gibi başlangıç uygulamalarınıza ekleyin . Bu komut dosyasının paketin acpi
yüklenmesi gerekir.
#!/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()
Biraz deneme (ve biraz yardım) ile bunu başarmak için bir udev kuralı kullanabildim. Bazı insanlar bazen bildirimi bir kereden fazla gönderdiğini bildirmiştir ancak herhangi bir sorun yaşamadım. YMMV.
Aşağıdaki içeriğe sahip bir komut dosyası oluşturun:
#!/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
kullanıcı adınızla değiştirmek . Yürütülebilir dosyayı çalıştırarak işaretleyin:
sudo chmod +x /path/to/script.sh
/path/to/script.sh
betiği kaydettiğiniz yerin yoluyla değiştirme .
Ardından , içeriğiyle /etc/udev/rules.d
adlandırılmış bir dosya oluşturun 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"
daha /path/to/script.sh
önce oluşturduğunuz komut dosyasının yoluyla değiştirilir .
Şimdi udev kurallarını çalıştırarak yeniden yükleyin:
sudo udevadm control --reload-rules
Güç kablosunu çıkarın. Bir bildirim almalısınız.
XAUTHORITY
yapmanız gerekeceğini düşünüyorum .
dbus-monitor
. Cevabımı gör.
Komut Dosyası Kaynağı
#!/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
Senaryoyu alma
Senaryo ayrıca github'ım da eklendi ; bu sürüm güncellenecek ve biraz daha geliştirilecektir.
Aşağıdakileri yaparak alabilirsiniz:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Komut dosyası /opt/sergrep
dizinde,notify_ac_change.sh
Konsept tasarımı
Temel sorular "AC adaptörünün varlığını nasıl kontrol ederiz?" ve "Değişiklikleri nasıl tespit ederiz?"
Bu sorun uzun zaman önce diğer geliştiriciler tarafından çözüldü. Ubuntu varsayılan olarak , içinde depolanan on_ac_power adlı bir komut dosyasıyla birlikte gelir /usr/bin/on_ac_power
. Güç bağdaştırıcısı çekirdeğin farklı alt sistemleri (ACPI veya APM) altında belirtilebilir, ancak bu komut dosyası işimizi kolaylaştırır - yazarlar birçok olası varyasyonu kapsamaktadır. Yalnızca çıkış durumunu döndürür, böylece if
ifadelerde kullanılmaya uygundur .
Neden on_ac_power
iyi bir seçim? Çünkü birden fazla alt sistemi kontrol etmeye dayanır. Ayrıca çalışmak için yeterince basit komut sağlar - sonuç doğru veya yanlıştır.
Böylece varlık tespit aracımız var, ama mantık ne olacak? Varlığı yoklamalı ve devletteki değişimi tespit etmeliyiz. Yapabileceğimiz şey, çıkış durumunu depolamak on_ac_power
ve değiştikten sonra mevcut durumu kaydettiklerimizle sürekli olarak karşılaştırmaktır - bildirim gönderin, durumu tekrar kaydedin ve tekrar karşılaştırmaya devam edin, döngü. Temel fikir bayrakların kullanılmasıdır.
Kısacası, devletin bir anlık görüntüsünü başlatırız ve daha sonra anlık görüntüdeki değişiklik için sürekli anket yaparız; değişiklik gerçekleştiğinde - anlık görüntüyü bilgilendirin ve sıfırlayın.