效果图:
守护进程中调用不生效,因为守护进程对图形和终端有一定的限制。可以打印信息到文件里,或者写syslog。
Libnotify
Libnotify 是Qt和GTK图形的一个扩展,已经广泛的应用于许多开源程序,如:Evolution和Pidgin。Libnotify会在安装libnotify时被安装。
使用libnotify必须安装 notification server.
Notification servers
内置
下面的桌面环境中使用自己实现的显示通知,你不能代替他们。他们的通知服务器在登录时自动启动通过的DBus接收来自应用程序的通知。
- Cinnamon provides a notification server itself. Notifications are displayed at the top right corner of the screen.
- Enlightenment provides a notification server through its Notification extension. Notification options are configurable.
- GNOME provides a notification server itself. Notifications are displayed at the top of the screen.
- KDE Plasma provides a notification server itself. Notifications are displayed at the bottom right corner of the screen.
独立
在其他的桌面环境中, notification server 需要通过 WM's/DE's "autostart" 选项启动. (它可以通过的DBus第一个i会话被推出,但是这不是很理想,因为它需要全局配置.)
You can choose one of the following implementations:
- Avant Window Navigator — A notification-daemon applet is available for AWN.
- Deepin Notifications — Notification server for Deepin.
- Dunst — Minimalistic notification daemon for Linux designed to fit nicely into minimalistic windowmanagers like dwm.
- LXQt Notification Daemon — Notification server for LXQt.
- Notification Daemon — The notification server used by GNOME Flashback.
- https://github.com/GNOME/notification-daemon || notification-daemon
-
You can run it manually using
/usr/lib/notification-daemon-1.0/notification-daemon
.
- MATE Notification Daemon — Notification server for MATE.
- https://github.com/mate-desktop/mate-notification-daemon/ || GTK+ 2: mate-notification-daemon, GTK+ 3 (experimental): mate-notification-daemon-gtk3
- Notify OSD — Notification server for Unity.
- statnot — Small, lightweight notification daemon that can output notifications to the root window's title, stdout or FIFO pipes, making it integrate very well with tiling window managers.
- twmn — Notification system for tiling window managers.
- Xfce Notification Daemon — Notification server for Xfce.
在程序中用法
在许多编程语言中,您可以通过 GObject-Introspection或bindings很容易地编写你自己的libnotify显示消息,也可以简单地使用bash。
下面是实现“Hello world”气泡消息的简单示例
Bash
- Dependency: libnotify
hello_world.sh
#!/bin/bash notify-send 'Hello world!' 'This is an example notification.' --icon=dialog-information
Boo
- Dependency: notify-sharp-3 (boo)
- Makedependency: boo
- Build with:
booc hello_world.boo
- Run with:
mono hello_world.exe
(orbooi hello_world.boo
)
hello_world.boo
import Notifications from "notify-sharp" Hello = Notification() Hello.Summary = "Hello world!" Hello.Body = "This is an example notification." Hello.IconName = "dialog-information" Hello.Show()
C
- Dependency: libnotify
- Build with:
gcc -o hello_world `pkg-config --cflags --libs libnotify` hello_world.c
hello_world.c
#include <libnotify/notify.h> void main () { notify_init ("Hello world!"); NotifyNotification * Hello = notify_notification_new ("Hello world", "This is an example notification.", "dialog-information"); notify_notification_show (Hello, NULL); g_object_unref(G_OBJECT(Hello)); notify_uninit(); }
C++
- Dependency: libnotifymmAUR
- Build with:
g++ -o hello_world `pkg-config --cflags --libs libnotifymm-1.0` hello_world.cc
hello_world.cc
#include <libnotifymm.h> int main(int argc, char *argv[]) { Notify::init("Hello world!"); Notify::Notification Hello("Hello world", "This is an example notification.", "dialog-information"); Hello.show(); }
C#
- Dependency: notify-sharp-3
- Build with:
mcs -pkg:notify-sharp-3.0 hello_world.cs
- Run with:
mono hello_world.exe
hello_world.cs
using Notifications; public class HelloWorld { static void Main() { var Hello = new Notification(); Hello.Summary = "Hello world!"; Hello.Body = "This is an example notification."; Hello.IconName = "dialog-information"; Hello.Show(); } }
Cobra
- Dependency: notify-sharp-3
- Makedependency: cobraAUR[broken link: archived in aur-mirror]
- Build with:
cobra -c hello_world
- Run with:
mono hello_world.exe
hello_world.cs
@args -pkg:notify-sharp-3.0 use Notifications class HelloWorld def main hello = Notification() hello.summary = "Hello world!" hello.body = "This is an example notification." hello.iconName = "dialog-information" hello.show
F#
- Dependency: notify-sharp-3
- Makedependency: fsharpAUR
- Build with:
fsharpc -r:notify-sharp.dll -I:/usr/lib/mono/notify-sharp-3.0/ -I:/usr/lib/mono/gtk-sharp-3.0/ hello_world.fs
- Run with:
mono hello_world.exe
hello_world.fs
open Notifications let Hello = new Notification() Hello.Summary <- "Hello world!" Hello.Body <- "This is an example notification." Hello.IconName <- "dialog-information" Hello.Show()
Genie
hello_world.gs
uses Notify init Notify.init ("Hello world") var Hello=new Notification ("Hello world!","This is an example notification.","dialog-information") Hello.show ()
Groovy
- Dependencies: groovy, java-gnomeAUR
- Build with:
groovyc -cp /usr/share/java/gtk.jar HelloWorld.groovy && jar cfe HelloWorld.jar HelloWorld HelloWorld.class
- Run with:
java -cp /usr/share/groovy/embeddable/groovy-all.jar:/usr/share/java/gtk.jar:HelloWorld.jar HelloWorld
(orgroovy -cp /usr/share/java/gtk.jar HelloWorld.groovy
)
HelloWorld.groovy
import org.gnome.gtk.* import org.gnome.notify.* Gtk.init() Notify.init("Hello world") def Hello = new Notification("Hello world!", "This is an example notification.", "dialog-information") Hello.show()
Java
- Dependency: java-gnomeAUR
- Makedependency: java-environment
- Build with:
javac -cp /usr/share/java/gtk.jar HelloWorld.java && jar cfe HelloWorld.jar HelloWorld HelloWorld.class
- Run with:
java -cp /usr/share/java/gtk.jar:HelloWorld.jar HelloWorld
HelloWorld.java
import org.gnome.gtk.Gtk; import org.gnome.notify.Notify; import org.gnome.notify.Notification; public class HelloWorld { public static void main(String[] args) { Gtk.init(args); Notify.init("Hello world"); Notification Hello = new Notification("Hello world!", "This is an example notification.", "dialog-information"); Hello.show(); } }
JavaScript
hello_world.js
#!/usr/bin/gjs const Notify = imports.gi.Notify; Notify.init ("Hello world"); var Hello=new Notify.Notification ({summary: "Hello world!", body: "This is an example notification.", "icon-name": "dialog-information"}); Hello.show ();
Lua
hello_world.lua
#!/usr/bin/lua lgi = require 'lgi' Notify = lgi.require('Notify') Notify.init("Hello world") Hello=Notify.Notification.new("Hello world","This is an example notification.","dialog-information") Hello:show()
Perl
- Dependencies: libnotify, perl-glib-object-introspectionAUR
hello_world.pl
#!/usr/bin/perl use Glib::Object::Introspection; Glib::Object::Introspection->setup ( basename => 'Notify', version => '0.7', package => 'Notify'); Notify->init; my $hello = Notify::Notification->new("Hello world!", "This is an example notification.", "dialog-information"); $hello->show;
Python
- Dependencies: libnotify, python-gobject (or python2-gobject for Python 2)
hello_world.py
#!/usr/bin/python from gi.repository import Notify Notify.init("Hello world") Hello=Notify.Notification.new("Hello world", "This is an example notification.", "dialog-information") Hello.show()
Ruby
- Dependencies: libnotify, ruby-gir_ffiAUR[broken link: archived in aur-mirror]
hello_world.rb
#!/usr/bin/ruby require 'gir_ffi' GirFFI.setup :Notify Notify.init("Hello world") Hello = Notify::Notification.new("Hello world!", "This is an example notification.", "dialog-information") Hello.show
Rust
- Dependencies: rust and cargo-binAUR (or just multirustAUR)
- notification crate: notify-rust
hello_world.rs
extern crate notify_rust; use notify_rust::Notification; fn main(){ Notification::new() .summary("Hello world") .body("This is an example notification") .icon("dialog-information") .show(); }
Scala
- Dependency: java-gnomeAUR (and scala)
- Makedependency: scala
- Build with:
scalac -cp /usr/share/java/gtk.jar -d HelloWorld.jar HelloWorld.scala
- Run with:
java -cp /usr/share/java/gtk.jar:HelloWorld.jar HelloWorld
(orscala -cp /usr/share/java/gtk.jar HelloWorld.scala
)
HelloWorld.scala
import org.gnome.gtk._ import org.gnome.notify._ object HelloWorld { def main(args: Array[String]) { Gtk.init(args) Notify.init("Hello world") var Hello = new Notification("Hello world!", "This is an example notification.", "dialog-information") Hello.show() } }
Vala
hello_world.vala
using Notify; public class HelloWorld { static void main () { Notify.init ("Hello world"); var Hello = new Notification("Hello world!", "This is an example notification.", "dialog-information"); Hello.show (); } }
Visual Basic .NET
- Dependency: notify-sharp-3
- Makedependency: mono-basic
- Build with:
vbnc -r:/usr/lib/mono/notify-sharp-3.0/notify-sharp.dll hello_world.vb
- Run with:
mono hello_world.exe
hello_world.vb
Imports Notifications Public Class Hello Public Shared Sub Main Dim Hello As New Notification Hello.Summary = "Hello world!" Hello.Body = "This is an example notification." Hello.IconName = "dialog-information" Hello.Show End Sub End Class
另见
- Libnotify 手册:https://developer.gnome.org/libnotify/
- C 实例:http://milky.manishsinha.net/2009/03/29/working-with-libnotify/
- Python 实例(french article):https://hashbang.fr/tutoriel-notify.html
-
官网资料:https://wiki.archlinux.org/index.php/Desktop_notifications
-
气泡中图标资料:http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html