Şarj cihazı takıldığında / çıkarıldığında Notify-OSD'yi kullanarak nasıl bildirim alabilirim?


9

Şarj cihazını takarken / çıkarırken notify-osd kullanarak nasıl ekran bildirimi alabilirim?


Bunu yapmak için bir senaryo yapabilirim ... ama bu çok zarif bir çözüm değil.
Seth

@Seth Böyle bir senaryo nasıl görünür? Bir cevap gönderebilir misiniz? Özellikle bir "şarj cihazı takılı değil" olayını nasıl tanımladığınızla ilgileniyorum ...
landroni

@landroni Oh, OP olmadığının farkında değildim. Aşağıda bir cevap gönderdim. Benim için iyi çalışıyor ama birkaç arkadaşımın sorunları var. Sizin için işe yaramıyorsa bana bildirin. Konuşurken daha iyi bir yol üzerinde çalışıyorum.
Seth

@Seth Bunu incelediğiniz için çok teşekkürler. Olduğu gibi, benim aklım çok hızlı bir şekilde öldü, bu yüzden sorgum şimdiye kadar biraz tartışmalı. Ama bu çözümü gelecek için aklımda tutacağım.
landroni

Yanıtlar:


6

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 --systemSisteminizde 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.


6

resim açıklamasını buraya girin resim açıklamasını buraya girin

dbus

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. .pySabit 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 acpiyü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()

udev

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_userkullanı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.shbetiği kaydettiğiniz yerin yoluyla değiştirme .

Ardından , içeriğiyle /etc/udev/rules.dadlandı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.


Bu işe yarar, ancak masaüstüne bildirim almak veya kullanıcıyı yaptığınız gibi kodlamak için root erişimi ve karmaşık makineler gerektirir. Ayrıca , gdm gibi bazı ekran yöneticileriyle de ayarXAUTHORITY yapmanız gerekeceğini düşünüyorum .
Gilles 'SO- kötü olmayı bırak

@Gilles IMO "kök gerektirir" ve sabit kodlu kullanıcı oldukça aptal nitpicks, ama daha önemli olduğunu düşünüyorsanız, daha sonra tamlık uğruna bir cron çözümü ekleyeceğim. Bu GDM altında çalışır güzelim ama iki kez kontrol edeceğim.
Seth

1
Ayrıca belki de bu udev kuralları ile aynı şeyi yapacak bir daemon oluşturmak için python-dbus ve udev'in dbus mesajlaşma API'sına bir göz atıyorum, ancak tek sorun sürekli çalışması ve herhangi bir zamanda yeniden başlatılması gerekecek olmasıdır başarısızlık, inanıyorum bir şey zaten oldukça iyi bir çözüm daha yüksek miktarda karmaşıklık ekler. Bununla birlikte, daha iyi çözümler varsa, bunları duymaktan memnuniyet duyarım.
joshumax

Herkes Ubuntu'yu tek kullanıcılı bir sistem olarak çalıştırmaz. Cron burada kullanışlı değil. Gdm'nin X çerez dosyasının eski sürümlerini bulmanın ekstra adımına ihtiyacınız olduğunu biliyorum, son sürümleri bilmiyorum ama bence bu değişmedi. KDM ile aynı sorun . @joshumax Diğer kaynaklardan bilgi alabilir, hatta dbus ile bile bunu kabuktan yapabilirsiniz dbus-monitor. Cevabımı gör.
Gilles 'SO- kötü olmayı bırak

2

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:

  1. sugo apt-get install git
  2. cd /opt

  3. git clone https://github.com/SergKolo/sergrep.git

Komut dosyası /opt/sergrepdizinde,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 ififadelerde kullanılmaya uygundur .

Neden on_ac_poweriyi 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_powerve 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.