Desktop notifications
Related articles
Desktop notifications are small, passive popup dialogs that notify the user of particular events in an asynchronous manner.
Contents
Libnotify
Libnotify is an implementation of the Desktop Notifications Specification which provides support for GTK+ and Qt applications and is desktop independent: it is already used by many open source apps like Evolution and Pidgin. Libnotify can be installed with the package libnotify, available in the official repositories.
In order to use libnotify, you have to install a notification server.
Notification servers
Built-in
The following desktop environments use their own implementations to display notifications, and you cannot replace them. Their notification servers are started automatically on login to receive notifications from applications via 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 4 uses knotify4 from package kdebase-runtime to display notifications. Notifications are displayed at the bottom right corner of the screen.
- KDE Plasma 5 provides a notification server itself. Notifications are displayed at the bottom right corner of the screen.
Standalone
In other desktop environments, the notification server is launched on the first call via DBus. You can choose one of the following implementations:
- Avant Window Navigator — A notification-daemon applet is available for AWN.
- 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
- It does not have a D-Bus service file by default. To use it outside from GNOME Flashback, create the following file:
/usr/share/dbus-1/services/org.gnome.Notifications.service
[D-BUS Service] Name=org.freedesktop.Notifications Exec=/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.
Usage in programming
You can write your own libnotify display messages easily in many programming languages through GObject-Introspection or bindings, or you can simply use bash.
The following examples display simple a "Hello world" notification.
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 from AUR
- 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 from AUR
- 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 from AUR
- 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 from AUR
- 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 from AUR
- 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 from AUR
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 from AUR
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 from AUR (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
See also
- Libnotify Reference Manual
- C example
- Python example (french article)