web-dev-qa-db-ja.com

充電器の挿入/取り外し時にNotify-OSDを使用して通知を受け取るにはどうすればよいですか?

充電器のプラグを抜くときに、notify-osdを使用して画面上の通知を取得するにはどうすればよいですか?

9
kernel_panic

AC電源とバッテリー電源を切り替えると、 D-Bus システムバスでイベントが生成されます。 dbus-monitor --systemを実行して、システムで生成されるイベントを確認します。

power を実行している場合、 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
Gilles

スクリプトソース

#!/usr/bin/env bash
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# 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 

スクリプトの取得

スクリプトはmy 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ディレクトリにあります

コンセプト/デザイン

重要な質問は、「ACアダプタの存在を確認するにはどうすればよいですか?」および「変更を検出するにはどうすればよいですか?」

さて、この問題は他の開発者によってずっと前に解決されています。 Ubuntuには、デフォルトでon_ac_powerというスクリプトが付属しており、/usr/bin/on_ac_powerに保存されています。電源アダプターは、カーネル内のさまざまなサブシステム(ACPIまたはAPM)で言及できますが、このスクリプトにより、作業が簡単になります-著者は多くの可能なバリエーションを扱っています。終了ステータスのみを返すため、ifステートメントでの使用に適しています。

なぜon_ac_powerが良い選択なのですか?複数のサブシステムのチェックに依存しているためです。また、動作するのに十分な単純なコマンドを提供します-結果はtrueまたはfalseです。

したがって、存在検出ツールがありますが、ロジックはどうですか?プレゼンスをポーリングし、状態の変化を検出する必要があります。 on_ac_powerの終了ステータスを保存し、変更後、現在の状態を保存したものと継続的に比較します。通知を送信し、ステータスを再度保存し、ループを繰り返します。基本的な考え方は、フラグの使用です。

つまり、状態のスナップショットを初期化し、スナップショットからの変更を継続的にポーリングします。変更が発生したら-スナップショットを通知してリセットします。

2