Как я могу добраться, использование уведомления Уведомляют-OSD, когда зарядное устройство вставляется/удаляется?

Как я могу добраться, экранное использование уведомления уведомляют-osd, когда я включаюсь/отключаю зарядное устройство?

9
задан 29 October 2014 в 06:32

3 ответа

Переключение между питанием переменным током и зарядом батареи должно генерировать событие на D-шина системная шина. Выполненный dbus-monitor --system и наблюдают, какие события сгенерированы в Вашей системе.

, Если Вы имеете выполнение upower, Вы получаете более специализированные уведомления от 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

можно также получить события от acpi_listen .

#!/bin/sh
acpi_listen |
while read -r what junk; do
  [ "$what" = "ac_adapter" ] || continue
  notify-send "$(acpi -a)"
done

Выполнение этот сценарий, когда Вы хотите начать видеть уведомления или добавлять его к Вашему запуску сессии.

6
ответ дан 16 November 2019 в 16:12

enter image description here enter image description here

dbus

Некоторые люди сообщили, что мой ранее udev решение отправил уведомление слишком много раз, когда силовой кабель был включен. Я не мог воспроизвести это, но я записал этот сценарий Python для использования dbus вместо udev. Сохраните его как a .py зарегистрируйте где-нибудь на Вашем жестком диске. Mark исполняемый файл файла путем выполнения:

sudo chmod +x yourFile.py  

и добавьте его к своим приложениям запуска, как описано здесь. Этот сценарий требует пакета acpi быть установленным.

#!/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

С небольшим экспериментированием (и немного справки) я смог использовать правило udev выполнить это. Некоторые люди сообщили, что это иногда отправляет уведомление несколько раз, но у меня не было проблем. YMMV.

Создайте сценарий со следующим содержанием:

#!/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 с Вашим именем пользователя. Mark исполняемый файл файла путем выполнения:

sudo chmod +x /path/to/script.sh  

замена /path/to/script.sh с путем туда, где Вы сохранили сценарий.

Затем создайте файл в /etc/udev/rules.d именованный 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"

снова замена /path/to/script.sh с путем к сценарию Вы создали ранее.

Теперь перезагрузите правила udev путем выполнения:

sudo udevadm control --reload-rules                              

Отключите силовой кабель. Необходимо получить уведомление.

6
ответ дан 16 November 2019 в 16:12

Источник сценария

#!/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 

Получение сценария

Сценарий также добавляется к моему GitHub; та версия будет обновлена и разработала крошечный бит больше.

Можно получить его путем выполнения следующего:

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

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

Сценарий будет в /opt/sergrep каталог, названный notify_ac_change.sh

Понятие/Дизайн

Ключевые вопросы, "Как мы проверяем присутствие сетевого адаптера?" и, "Как мы обнаруживаем изменения?"

Ну, эта проблема была решена давно другими разработчиками. Ubuntu появляется по умолчанию со сценарием, названным on_ac_power, который хранится в /usr/bin/on_ac_power. Адаптер питания может быть упомянут под различными подсистемами в ядре (ACPI или APM), но этот сценарий делает наше задание более простым - авторы покрыли много возможных изменений. Это возвращает только статус выхода, таким образом, это подходит для использования в if операторы.

Почему on_ac_power хороший выбор? Поскольку это полагается на проверку нескольких подсистем. Это также обеспечивает достаточно простую команду для работы с - результатом является любой TRUE или FALSE.

Таким образом у нас есть инструмент обнаружения присутствия, но что относительно логики? Мы должны опросить присутствие и обнаружить изменение в состоянии. То, что мы можем сделать, должно сохранить статус выхода on_ac_power и непрерывно сравнивайте текущее состояние с тем, что мы сохранили, после того как оно изменяется - отправляют уведомление, сохраняют состояние снова и продолжают выдерживать сравнение снова, цикличное выполнение. Основная идея является использованием флагов.

Короче говоря, мы инициализируем снимок состояния и затем непрерывно опрашиваем относительно изменения от снимка; после того как изменение происходит - уведомляют и сбрасывают снимок.

2
ответ дан 23 November 2019 в 04:55

Другие вопросы по тегам:

Похожие вопросы: