# Desktop notifications

Related articles

- GTK+
- Libcanberra

Desktop notifications are small, passive popup dialogs that notify the user of particular events in an asynchronous manner.

## 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 libnotify package.

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 Plasma provides a notification server itself. Notifications are displayed at the bottom right corner of the screen.

### Standalone

In other desktop environments, the notification server needs to be launched using your WM's/DE's "autostart" option. (It can be launched on the first call via DBus, but that's not very desirable as it needs global configuration.)

You can choose one of the following implementations:

- Avant Window Navigator — A notification-daemon applet is available for AWN.

  https://github.com/p12tic/awn-extras || awn-extras-appletsAUR

- Deepin Notifications — Notification server for Deepin.

  https://github.com/linuxdeepin/deepin-notifications || deepin-notifications

- Dunst — Minimalistic notification daemon for Linux designed to fit nicely into minimalistic windowmanagers like dwm.

  http://www.knopwob.org/dunst/ || dunst

- LXQt Notification Daemon — Notification server for LXQt.

  https://github.com/lxde/lxqt-notificationd || lxqt-notificationd

- 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[broken link: replaced by mate-notification-daemon]

- Notify OSD — Notification server for Unity.

  https://launchpad.net/notify-osd || notify-osd

- 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.

  https://github.com/halhen/statnot || statnotAUR

- twmn — Notification system for tiling window managers.

  https://github.com/sboli/twmn || twmn-gitAUR

- Xfce Notification Daemon — Notification server for Xfce.

  http://goodies.xfce.org/projects/applications/xfce4-notifyd || xfce4-notifyd
  Tip: To configure xfce4-notifyd, run the following command: `xfce4-notifyd-config`.

## 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

Tip:

- An overview on the available icons can be found here.
- To send desktop notification from a background script running as root (replace `X_user` and `X_userid` with the user and userid running X respectively):

      # sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 'This is an example notification.'

Boo

- Dependency: notify-sharp-3 (boo)
- Makedependency: boo
- Build with: `booc hello_world.boo`
- Run with: `mono hello_world.exe` (or `booi 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>
    int 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();
    	return 0;
    }

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();
    	return 0;
    }

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
- Build with: `cobra -c hello_world`
- Run with: `mono hello_world.exe`

    hello_world.cobra

    @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

- Dependency: libnotify
- Makedependency: vala
- Build with: `valac --pkg libnotify hello_world.gs`

    hello_world.gs

    uses
    	Notify

    init
    	Notify.init ("Hello world")
    	var Hello=new Notify.Notification ("Hello world!","This is an example notification.","dialog-information")
    	Hello.show ()

Go

- Dependency: libnotify
- Makedependency: go-notify-gitAUR
- Build with: `go build hello_world.go`
- (Or run with: `go run hello_world.go`)

    hello_world.go

    package main
    import ("github.com/mqu/go-notify")

    func main() {
    	notify.Init("Hello world")
    	hello := notify.NotificationNew("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` or `groovy -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()

Haskell

- Makedependency: haskell-fdo-notify
- Build with: `ghc hello_world`

    hello_world.hs

    import DBus.Notify
    main = do
             client <- connectSession
             let hello = blankNote { summary="Hello world!",
                                     body=(Just $ Text "This is an example notification."),
                                     appImage=(Just $ Icon "dialog-information") }
             notification <- notify client hello
             return 0

IronPython

- Dependencies: notify-sharp-3, ironpython
- Run with: `ipy hello_world.py`

    hello_world.py

    import clr
    clr.AddReference('notify-sharp')
    import Notifications
    Hello = Notifications.Notification()
    Hello.Summary  = "Hello world!"
    Hello.Body     = "This is an example notification."
    Hello.IconName = "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

- Dependencies: libnotify, gjs

    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 ();

JRuby

- Dependencies: java-gnomeAUR, jruby
- Build with: `jrubyc hello_world.rb && jar cfe hello_world.jar hello_world hello_world.class`
- Run with: `java -cp /opt/jruby/lib/jruby.jar:hello_world.jar hello_world` or `jruby hello_world.rb`

    hello_world.rb

    require '/usr/share/java/gtk.jar'
    import Java::OrgGnomeGtk::Gtk
    import Java::OrgGnomeNotify::Notify
    import Java::OrgGnomeNotify::Notification

    Gtk.init(nil)
    Notify.init("Hello world")
    Hello = Notification.new("Hello world!", "This is an example notification.", "dialog-information")
    Hello.show

Jython

- Dependencies: java-gnomeAUR, jython
- Run with: `jython -Dpython.path=/usr/share/java/gtk.jar hello_world.py`

    hello_world.py

    from org.gnome.gtk import Gtk
    from org.gnome.notify import Notify, Notification
    Gtk.init(None)
    Notify.init("Hello world")
    Hello=Notification("Hello world!", "This is an example notification.", "dialog-information")
    Hello.show()

Lua

- Dependencies: libnotify, lua-lgi

    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()

Nemerle

- Dependency: notify-sharp-3
- Makedependency: nemerleAUR
- Build with: `ncc -pkg:notify-sharp-3.0 -out:hello_world.exe hello_world.n`
- Run with: `mono hello_world.exe`

    hello_world.n

    using Notifications;
    public class HelloWorld {
    	static Main() : void {
    		def Hello = Notification();
    		Hello.Summary  = "Hello world!";
    		Hello.Body     = "This is an example notification.";
    		Hello.IconName = "dialog-information";
    		Hello.Show();
    	}
    }

Pascal

- Dependency: libnotify
- Makedependency: fpc, libnotify binding
- Build with: `fpc hello_world`

    hello_world.pas

    program	hello_world;
    uses	libnotify;
    var	hello : PNotifyNotification;
    begin
    	notify_init(argv[0]);
    	hello := notify_notification_new ('Hello world', 'This is an example notification.', 'dialog-information');
    	notify_notification_show (hello, nil);
    end.

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
    import gi
    gi.require_version('Notify', '0.7')
    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

    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

Using notify-rust.

- Makedependency: cargo
- Build with: `cargo build`
- Run with: `target/debug/hello_world` or `cargo run`

    Cargo.toml

    [package]
    name = "hello_world"
    version = "0.1.0"

    [dependencies]
    notify-rust = "^3"

    src/main.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().unwrap();
    }

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` (or `scala -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

- Dependency: libnotify
- Makedependency: vala
- Build with: `valac --pkg libnotify hello_world.vala`

    hello_world.vala

    using Notify;
    public class HelloWorld {
    	static void main () {
    		Notify.init ("Hello world");
    		var Hello = new Notify.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)

Categories:

- X server
- Development

Hidden category:

- Pages with broken package links