Bagaimana saya bisa mendapatkan notifikasi di layar menggunakan notify-osd ketika saya mencolokkan / mencabut pengisi daya?
Bagaimana saya bisa mendapatkan notifikasi di layar menggunakan notify-osd ketika saya mencolokkan / mencabut pengisi daya?
Jawaban:
Beralih antara daya AC dan daya baterai harus menghasilkan suatu peristiwa pada bus sistem D-Bus . Jalankan dbus-monitor --system
dan saksikan kejadian apa yang dihasilkan di sistem Anda.
Jika Anda memiliki upower berjalan, Anda mendapatkan lebih banyak khusus pemberitahuan dari 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
Anda juga dapat memperoleh acara dari acpi_listen
.
#!/bin/sh
acpi_listen |
while read -r what junk; do
[ "$what" = "ac_adapter" ] || continue
notify-send "$(acpi -a)"
done
Jalankan skrip ini ketika Anda ingin mulai melihat notifikasi, atau menambahkannya ke startup sesi Anda.
Beberapa orang melaporkan solusi udev saya yang sebelumnya mengirim pemberitahuan terlalu sering ketika kabel power dicolokkan. Saya tidak dapat mereproduksi itu tetapi saya menulis skrip python ini untuk menggunakan dbus, bukan udev. Simpan sebagai .py
file di suatu tempat di hard drive Anda. Tandai file yang dapat dieksekusi dengan menjalankan:
sudo chmod +x yourFile.py
dan menambahkannya ke aplikasi startup Anda seperti yang dijelaskan di sini . Skrip ini mengharuskan paket acpi
diinstal.
#!/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()
Dengan sedikit eksperimen (dan sedikit bantuan) saya dapat memanfaatkan aturan udev untuk mencapai ini. Beberapa orang telah melaporkan bahwa kadang-kadang mengirimkan pemberitahuan lebih dari sekali tetapi saya tidak punya masalah. YMMV.
Buat skrip dengan konten berikut:
#!/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
mengganti some_user
dengan nama pengguna Anda. Tandai file yang dapat dieksekusi dengan menjalankan:
sudo chmod +x /path/to/script.sh
mengganti /path/to/script.sh
dengan jalur ke tempat Anda menyimpan skrip.
Selanjutnya buat file dengan /etc/udev/rules.d
nama 10-power.rules
dengan konten:
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"
kembali /path/to/script.sh
dengan path ke skrip yang Anda buat sebelumnya.
Sekarang muat ulang aturan udev dengan menjalankan:
sudo udevadm control --reload-rules
Lepaskan kabel daya. Anda harus mendapat notifikasi.
XAUTHORITY
dengan beberapa manajer tampilan seperti gdm.
dbus-monitor
. Lihat jawaban saya.
Sumber Skrip
#!/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
Dapatkan skripnya
Script juga ditambahkan ke github saya ; versi itu akan diperbarui dan dikembangkan sedikit lebih banyak.
Anda bisa mendapatkannya dengan melakukan hal berikut:
sugo apt-get install git
cd /opt
git clone https://github.com/SergKolo/sergrep.git
Script akan berada di /opt/sergrep
direktori, bernamanotify_ac_change.sh
Desain konsep
Pertanyaan kuncinya adalah "Bagaimana kita memeriksa keberadaan adaptor AC?" dan "Bagaimana kita mendeteksi perubahan?"
Nah, masalah ini sudah lama dipecahkan oleh pengembang lain. Ubuntu secara default dilengkapi dengan skrip bernama on_ac_power , yang disimpan di /usr/bin/on_ac_power
. Adaptor daya dapat disebutkan di bawah berbagai subsistem di kernel (ACPI atau APM), tetapi skrip ini membuat pekerjaan kita lebih sederhana - penulis telah membahas banyak variasi yang mungkin. Ini hanya mengembalikan status keluar sehingga sesuai untuk digunakan dalam if
pernyataan.
Mengapa itu on_ac_power
pilihan yang baik? Karena itu bergantung pada pengecekan beberapa subsistem. Ini juga menyediakan perintah yang cukup sederhana untuk dikerjakan - hasilnya benar atau salah.
Jadi kita memiliki alat pendeteksi keberadaan, tetapi bagaimana dengan logika? Kita perlu menyurvei keberadaan dan mendeteksi perubahan di negara bagian. Apa yang bisa kita lakukan adalah menyimpan status keluar on_ac_power
dan terus membandingkan keadaan saat ini dengan apa yang telah kita simpan, setelah itu berubah - kirim pemberitahuan, simpan status lagi, dan terus membandingkan lagi, berulang-ulang. Ide dasarnya adalah penggunaan bendera.
Singkatnya, kami menginisialisasi snapshot dari negara, dan kemudian terus menerus polling untuk perubahan dari snapshot; setelah perubahan terjadi - beri tahu dan setel ulang foto.