デスクトップ通知
関連記事
デスクトップ通知は、非同期に特定のイベントをユーザーに通知する小さくて控えめなポップアップダイアログです。
Libnotify
Libnotify は GTK+ や Qt アプリケーションのサポートを提供する Desktop Notifications Specification の実装で特定のデスクトップに依存していません: Evolution や Pidgin など多数のオープンソースアプリによって使用されています。Libnotify は公式リポジトリにある libnotify パッケージでインストールすることが可能です。
libnotify を使うには、通知サーバーをインストールする必要があります。
通知サーバー
ビルトイン
以下のデスクトップ環境では通知を表示するためにそれぞれ独自の実装を使っており、置き換えることができません。通知サーバーはログイン時に自動で起動し DBus によってアプリケーションからの通知を受け取ります。
- Cinnamon は通知サーバーを備えており、通知は画面の右上に表示されます。
- Enlightenment は Notification 拡張を通して通知サーバーを提供しています。通知オプションは設定が可能です。
- GNOME は通知サーバーを備えており、通知は画面の上部に表示されます。
- KDE は通知サーバーを備えており、通知は画面の右下に表示されます。
スタンドアロン
他のデスクトップ環境では、ウィンドウマネージャやデスクトップ環境の自動実行を使って通知サーバーを起動する必要があります (DBus で初めて呼ばれた時に通知サーバーを起動させることもできますが、グローバルな設定が必要です)。
通知サーバーは以下から選ぶことができます:
- Avant Window Navigator — AWN で使うことができる通知デーモンアプレット。
- Deepin Notifications — Deepin の通知サーバー。
- LXQt Notification Daemon — LXQt の通知サーバー。
- Notification Daemon — GNOME Flashback によって使われている通知サーバー。
- https://github.com/GNOME/notification-daemon || notification-daemon
/usr/lib/notification-daemon-1.0/notification-daemonで手動で起動できます。
- MATE Notification Daemon — MATE の通知サーバー。
- Notify OSD — Unity の通知サーバー。
- statnot — 小さくて軽量な通知デーモン。ルートウィンドウのタイトルや標準出力、FIFO パイプなどに通知を出力できるので、タイル型ウィンドウマネージャと相性がとても良いです。
- twmn — タイル型ウィンドウマネージャ向けの通知システム。
- Xfce Notification Daemon — Xfce の通知サーバー。
プログラミングでの使い方
GObject-Introspection やバインディングを通して多くのプログラミング言語を使ったり、または bash を利用して簡単に libnotify でメッセージを表示することができます。
以下の例ではシンプルな "Hello world" の通知が表示されます。
Bash
- 依存パッケージ: libnotify
hello_world.sh
#!/bin/bash notify-send 'Hello world!' 'This is an example notification.' --icon=dialog-information
Boo
- 依存パッケージ: notify-sharp-3 (boo)
- ビルドするのに必要なパッケージ: boo
- ビルド:
booc hello_world.boo - 実行:
mono hello_world.exe(または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
- 依存パッケージ: glib2
- ビルド:
gcc -o hello_world `pkg-config --cflags --libs gio-2.0` hello_world.c
hello_world.c
#include <gio/gio.h>
int main() {
GApplication *application = g_application_new ("hello.world", G_APPLICATION_FLAGS_NONE);
g_application_register (application, NULL, NULL);
GNotification *notification = g_notification_new ("Hello world!");
g_notification_set_body (notification, "This is an example notification.");
GIcon *icon = g_themed_icon_new ("dialog-information");
g_notification_set_icon (notification, icon);
g_application_send_notification (application, NULL, notification);
g_object_unref (icon);
g_object_unref (notification);
g_object_unref (application);
return 0;
}
- 依存パッケージ: libnotify
- ビルド:
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++
- 依存パッケージ: glibmm
- ビルド:
g++ -o hello_world `pkg-config --cflags --libs giomm-2.4` hello_world.cc
hello_world.cc
#include <giomm-2.4/giomm.h>
int main(int argc, char *argv[]) {
auto Application = Gio::Application::create("hello.world", Gio::APPLICATION_FLAGS_NONE);
Application->register_application();
auto Notification = Gio::Notification::create("Hello world");
Notification->set_body("This is an example notification.");
auto Icon = Gio::ThemedIcon::create("dialog-information");
Notification->set_icon (Icon);
Application->send_notification(Notification);
return 0;
}
- 依存パッケージ: libnotifymmAUR
- ビルド:
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#
- 依存パッケージ: notify-sharp-3
- ビルド:
mcs -pkg:notify-sharp-3.0 hello_world.cs - 実行:
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
- 依存パッケージ: notify-sharp-3
- ビルドするのに必要なパッケージ: cobraAUR
- ビルド:
cobra -c hello_world - 実行:
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#
- 依存パッケージ: notify-sharp-3
- ビルドするのに必要なパッケージ: fsharp
- ビルド:
fsharpc -r:notify-sharp.dll -I:/usr/lib/mono/notify-sharp-3.0/ -I:/usr/lib/mono/gtk-sharp-3.0/ hello_world.fs - 実行:
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
GLib
init
var Application = new GLib.Application ("hello.world", GLib.ApplicationFlags.FLAGS_NONE);
Application.register ();
var Notification = new GLib.Notification ("Hello world");
Notification.set_body ("This is an example notification.");
var Icon = new GLib.ThemedIcon ("dialog-information");
Notification.set_icon (Icon);
Application.send_notification (null, Notification);
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
- 依存パッケージ: libnotify
- ビルドするのに必要なパッケージ: go-notify-gitAUR
- ビルド:
go build hello_world.go - 実行:
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
- 依存パッケージ: groovy, java-gnomeAUR
- ビルド:
groovyc -cp /usr/share/java/gtk.jar HelloWorld.groovy && jar cfe HelloWorld.jar HelloWorld HelloWorld.class - 実行:
java -cp /usr/share/groovy/embeddable/groovy-all.jar:/usr/share/java/gtk.jar:HelloWorld.jar HelloWorld(または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
- ビルドするのに必要なパッケージ: haskell-fdo-notify
- ビルド:
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
- 依存パッケージ: notify-sharp-3, ironpythonAUR
- 実行:
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
- 依存パッケージ: java-gnomeAUR
- ビルドするのに必要なパッケージ: java-environment
- ビルド:
javac -cp /usr/share/java/gtk.jar HelloWorld.java && jar cfe HelloWorld.jar HelloWorld HelloWorld.class - 実行:
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
- 依存パッケージ: gjs
hello_world.js
#!/usr/bin/gjs
const Gio = imports.gi.Gio;
var Application = new Gio.Application ({application_id: "hello.world"});
Application.register (null);
var Notification = new Gio.Notification ();
Notification.set_title ("Hello world");
Notification.set_body ("This is an example notification.");
var Icon = new Gio.ThemedIcon ({name: "dialog-information"});
Notification.set_icon (Icon);
Application.send_notification (null, Notification);
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
- 依存パッケージ: java-gnomeAUR, jruby
- ビルド:
jrubyc hello_world.rb && jar cfe hello_world.jar hello_world hello_world.class - 実行:
java -cp /opt/jruby/lib/jruby.jar:hello_world.jar hello_worldまたは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
- 依存パッケージ: java-gnomeAUR, jython
- 実行:
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
- 依存パッケージ: lua-lgi
hello_world.lua
#!/usr/bin/lua
lgi = require 'lgi'
Gio = lgi.require('Gio')
Application = Gio.Application.new("hello.world",Gio.ApplicationFlags.FLAGS_NONE);
Application:register();
Notification = Gio.Notification.new("Hello world");
Notification:set_body("This is an example notification.");
Icon = Gio.ThemedIcon.new("dialog-information");
Notification:set_icon(Icon);
Application:send_notification(nil, Notification);
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()</nowiki>
Nemerle
- 依存パッケージ: notify-sharp-3
- ビルドするのに必要なパッケージ: nemerleAUR
- ビルド:
ncc -pkg:notify-sharp-3.0 -out:hello_world.exe hello_world.n - 実行:
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
- 依存パッケージ: libnotify
- ビルドするのに必要なパッケージ: fpc, libnotify バインディング
- ビルド:
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
- 依存パッケージ: 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
- 依存パッケージ: python-gobject (または Python 2 なら python2-gobject)
hello_world.py
#!/usr/bin/python
import gi
gi.require_version('Gio', '2.0')
from gi.repository import Gio
Application=Gio.Application.new ("hello.world", Gio.ApplicationFlags.FLAGS_NONE);
Application.register ();
Notification=Gio.Notification.new ("Hello world");
Notification.set_body ("This is an example notification.");
Icon=Gio.ThemedIcon.new ("dialog-information");
Notification.set_icon (Icon);
Application.send_notification (None, Notification);
- 依存パッケージ: libnotify, python-gobject (または Python 2 なら python2-gobject)
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
- 依存パッケージ: 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
notify-rust を使用。
- ビルドするのに必要なパッケージ: cargo
- ビルド:
cargo build - 実行:
target/debug/hello_worldまたは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
- 依存パッケージ: java-gnomeAUR (と scala)
- ビルドするのに必要なパッケージ: scala
- ビルド:
scalac -cp /usr/share/java/gtk.jar -d HelloWorld.jar HelloWorld.scala - 実行:
java -cp /usr/share/java/gtk.jar:HelloWorld.jar HelloWorld(または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
hello_world.vala
using GLib;
public class HelloWorld {
static void main () {
var Application = new GLib.Application ("hello.world", GLib.ApplicationFlags.FLAGS_NONE);
Application.register ();
var Notification = new GLib.Notification ("Hello world");
Notification.set_body ("This is an example notification.");
var Icon = new GLib.ThemedIcon ("dialog-information");
Notification.set_icon (Icon);
Application.send_notification (null, Notification);
}
}
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
- 依存パッケージ: notify-sharp-3
- ビルドするのに必要なパッケージ: mono-basic
- ビルド:
vbnc -r:/usr/lib/mono/notify-sharp-3.0/notify-sharp.dll hello_world.vb - 実行:
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 リファレンスマニュアル
- C サンプル
- Python サンプル (フランス語の記事)