試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Zenityの通知機能を使用した簡単なタイマー(分単位仕様)

何分後かにタイマーをセットして、必要なら一定間隔でバルーンによる通知も行いつつ、システムトレイアイコンのツールチップ(マウスポインタを乗せたときに出る説明)には状況を表示して毎分更新しつつ、時間になったら情報ダイアログを出して終了する、というものを作ってみた。
手抜きなので「分」単位の処理しかしておらず、時刻による指定ではなく、開始したときを基準にした経過時間で終了させる仕様になっている。

  1. コード
  2. スクリーンショット
  3. 作成時の覚え書き

コード

[任意]ファイル名: ~/bin/notify-timer.sh

#! /bin/bash

# notify-timer.sh
# タイマー(何分後か)と通知間隔を指定して、
# システムトレイのアイコンのツールチップに毎分情報を表示して
# 通知間隔ごとにバルーン通知も行う
# 時間になったら情報ダイアログを出して終了

# 未定義(コメントアウト)ではデフォルトアイコンを使用するようにしている
#ICON="/usr/share/pixmaps/gnome-about-logo.png"
#ICON="dummy"  # 存在しない名前ではエラーが出て、バルーンのアイコンは出ない
TIMER_MIN=1
TIMER_MAX=300
TIMER_DEFAULT=30
INTERVAL_MIN=1
INTERVAL_DEFAULT=10
BLN_REMAIN_BEGINTAG="<span size='larger' color='darkred'>"
BLN_REMAIN_ENDTAG="</span>"
BLN_CURRENT_BEGINTAG="<span size='larger' color='darkblue'>"
BLN_CURRENT_ENDTAG="</span>"
TIMER_NAME_DEFAULT="タイマー"
ENTRY_TITLE="タイマーの名前を指定"
ENTRY_TEXT="タイマーの名前を決めてください"
SCALE_TIMER_TITLE="タイマーの設定"
SCALE_TIMER_TEXT="何分後にタイマーをセットするかを指定してください\n\n<i>処理をキャンセルできるのはここが最後です</i>"
SCALE_INTERVAL_TITLE="通知間隔の設定"
SCALE_INTERVAL_TEXT="通知間隔を指定してください\n通知が不要ならキャンセルします\n\n<i>ここでボタンをクリックした時点でカウントが開始されます</i>"
INFO_TITLE="時間です"
INFO_TEXT="時間になりました"

# タイマーの名前を指定
TIMER_NAME=$(zenity --entry --title ${ENTRY_TITLE} --text ${ENTRY_TEXT} --entry-text=${TIMER_NAME_DEFAULT})
# キャンセルしたら何もせずに終了
if [ $? -ne 0 ]; then exit; fi

# タイマーの設定
TIMER=$(zenity --scale --title ${SCALE_TIMER_TITLE} --text ${SCALE_TIMER_TEXT} --min-value ${TIMER_MIN} --max-value ${TIMER_MAX} --value ${TIMER_DEFAULT})
# キャンセルしたら何もせずに終了
if [ $? -ne 0 ]; then exit; fi

# 間隔のデフォルト値が指定タイマーより大きい場合はタイマーの値をデフォルトにする
if [ ${INTERVAL_DEFAULT} -gt ${TIMER} ]; then INTERVAL_DEFAULT=${TIMER}; fi
# 通知間隔の設定(キャンセルしたら通知しない)
INTERVAL=$(zenity --scale --title ${SCALE_INTERVAL_TITLE} --text ${SCALE_INTERVAL_TEXT} --min-value ${INTERVAL_MIN} --max-value ${TIMER} --value ${INTERVAL_DEFAULT})

# バルーン通知しない場合のフラグ立て(値が0なら通知しない、とする)
if [ $? -ne 0 ]; then INTERVAL=0; fi

# Zenityの通知機能を起動
exec 3> >(zenity --notification --listen ${ICON:+--window-icon }${ICON:-})

if [ ${INTERVAL} -eq 0 ]; then
  # バルーンによる間隔の通知を行わない場合
  for (( T = 0; T < ${TIMER}; T++)); do
    R=$((${TIMER} - ${T}))
    echo "tooltip: ${TIMER_NAME}: ${T}分経過/残り${R}" >&3
    # echo ${R}  # 端末出力確認用
    sleep 1m
  done
else
  # 一定間隔ごとにバルーン通知する場合
  for (( T = 0; T < ${TIMER}; T++)); do
    R=$((${TIMER} - ${T}))
    if [ $(( ${T} % ${INTERVAL})) -eq 0 ]; then
      echo "message: ${TIMER_NAME}:\n 残り ${BLN_REMAIN_BEGINTAG}${R}${BLN_REMAIN_ENDTAG}です\n 経過時間: ${BLN_CURRENT_BEGINTAG}${T}${BLN_CURRENT_ENDTAG}" >&3
    fi
    echo "tooltip: ${TIMER_NAME}: ${T}分経過/残り${R}" >&3
    # echo ${R}  # 端末出力確認用
    sleep 1m
  done
fi
zenity --info --title ${INFO_TEXT} --text ${INFO_TEXT}

# 終了

スクリーンショット


タイマーの名前を決める

時間を決める

バルーン通知の間隔を決める

システムトレイアイコンのツールチップ

バルーン通知

作成時の覚え書き

  • 「if [ $? -ne 0 ]; then exit; fi」を書いているのは、zenityのダイアログで「キャンセル」を選択した場合(戻り値が変わる)に終了するため。
  • メイン処理の部分で、バルーン通知するかしないかで分岐させて、それぞれに似たような「for - done」があるが、この書き方は単なる好み。
  • 時間を1分に指定すると、次の間隔指定の引数の関係で「最大値は最小値よりも大きくして下さい」と端末に出て、間隔のダイアログが出ずにカウントが開始されてしまうのだが、挙動としてはこれで問題ないため、そのままにしておくことにする。
  • 「$(( 1 + 2 ))」は「$(expr 1 + 2 )」と同じく、算術式の結果(左の例では「3」)が入る。
  • 「${ICON:+--window-icon }${ICON:-}」という部分は、変数ICONが未定義もしくは空のときには空文字列になり、定義済みのときには「--window-icon ${ICON}」になる。詳しくは、bashのマニュアルページの「パラメータの展開」内、「${parameter:-word}」と「${parameter:+word}」の項目を参照。
  • zenityの通知機能のアイコンは、特に指定しなければデフォルトのアイコンになり、任意のアイコンファイルを用いることも可能。存在しないファイルを選択した場合はエラーが出るが、アイコンを出なくするためにも使える。
  • バルーンの時間表示部分のスタイル変更は、notify-sendと同様、Pango Text Attribute Markup Languageを用いている。

(2008/3/3)if文での比較では「-eq」「-ne」を使用して、数値として扱うように修正