web-dev-qa-db-ja.com

bashからバルーンポップアップをクリアする方法

スクリプトにnotify-sendを使用して通知を設定しています。唯一の問題は、スクリプトが複数回呼び出されると、すべての通知が通知スタックに追加され、次々に呼び出されるだけであるということです。

画面上のすべての通知をクリアして新しい通知を表示する方法はありますか?

6
Stefan

残念ながら、 notify-osd 通知をクリアまたは「却下」することはできません。代わりに Zenity を使用すると、運が良くなる可能性があります。 notify-send よりも より多くのオプション があります。

--timeoutオプションを使用して、数秒が経過した後に通知を閉じることができます。

zenity --info --timeout=5 --title="Test Notification" --text "$(date +%Y%m%d-%H%M%S): My notification"

以前の通知のプロセスIDのリスト(環境変数またはファイル内)を保持し、それらにHUPシグナルを送信して、新しい通知を表示する前にそれらをクリアすることもできます。

i=0
pids=
for x in $(seq 1 5); do
    i=$((i + 1))
    zenity --info --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &
    pids+="$! "
done
sleep 5
for p in $pids; do kill -HUP $p >/dev/null 2>&1; done
i=$((i + 1))
zenity --info --timeout=2 --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &

または、新しい通知を表示する前に、すべてのzenityプロセスを強制終了します。

killall zenity
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &

または、新しい通知を表示する前に、特定のzenityプロセスを強制終了します。

ps ho pid,args | grep -i 'zenity.\+--title=test notifications' | sed -e 's/^ *\([0-9]\+\).*$/\1/'
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &
4
Dan Cruz

これは、notify-sendを使用して実際に実行可能です。

notify-send --hint int:transient:1 "Title" "Body"

transientヒントを設定することにより、通知の有効期限が切れたり却下されたりしても、通知バーに残りません。

14
Ziyan

最善のオプションではないかもしれませんが、別の方法があります。notify-osdプロセスを強制終了して再起動するだけです。次に、通知を公開します。

pkill notify-osd
/usr/lib/x86_64-linux-gnu/notify-osd &
notify-send "Hello!"
4
Valeriu Paloş

残念ながら、これはnotify-sendによって設定された通知では実行できないようです。 notify-send.cのソースコード -を見てください。通知を作成し、パラメータを設定しますが、それへの参照はどこにも保存しません。代わりに、g_object_unrefを呼び出します。これは、 ここ から理解できるように、メッセージとの外部相互作用の可能性を効果的に排除します。したがって、通知に対する高度な管理機能を使用するには、notify-send(おそらくカスタムアプリケーション)とは異なるツールを使用する必要があります。


目標を達成するために考えられる大雑把なハックは、 xautomation ツールを使用するスクリプトです。 couldは、それらを使用して、すべての通知ポップアップの「閉じる」ボタンを見つけ、それぞれのマウスクリックをシミュレートします。しかし、それはそれほど簡単ではなく、確かにneatソリューションではありません。

1
jankes