デスクトップ上で、アプリまたはシステムからのメッセージ通知に使われている NotifyOSD は、Ubuntu では 9.04 以降、黒い半透明な外観を持ち、何だかカッコイイ。
メッセージ通知後、数秒で自動消滅(バブルエフェクト?)する、このメッセージをどうやって使用できるのか、淡いながらも興味を持っていたところ、次のブログ記事を読んだ。
なるほど、このように簡単に使用できるのか。
そこで、C# でも同様のことが可能と分かったので、以下にまとめてみた。
NotifySharp のインストール
NotifySharp を使用することで、NotifyOSD メッセージ通知を使用できるようになる。標準の Mono 環境を使用しているなら、「libnotify0.4-cil」パッケージを導入すればよい(標準で導入済か)。
独自に野良インストールした Mono 環境を使用しているなら、同様に野良インストールする必要がある。
今回は “notify-sharp” package in Ubuntu にあるソース資源を使用して、インストールを行った。
インストール実行例。
$ tar -xvf notify-sharp_0.4.0~r3032.orig.tar.gz $ cd notify-sharp-0.4.0 $ echo $MONO_HOME /opt/mono/2.6.1 $ ./configure --prefix=$MONO_HOME $ make $ sudo paco -D make install
必要なアセンブリとして、NDesk.DBus(NDesk.DBus.dll)が挙げられるが、Ubuntu 9.04 では、Tomboy の依存パッケージとして「libndesk-dbus1.0-cil」が導入されているので、特に何かする必要はない。
独自に野良インストールした Mono 環境であれば、NotifySharp 同様にインストールする必要がある。もっとも、独自の Mono 環境でも Tomboy を動かすようにしているのなら、導入済みであるはずなので、特に何かする必要はない。
NotifyHello サンプル
おなじみの Hello world! である。- using System;
- using Notifications;
- namespace NotifyExample
- {
- public class NotifyHello
- {
- public static void Main(string[] args)
- {
- Notification n = new Notification("NotifySharp", // Summary
- "Hello world!", // Body
- "notification-message-IM"); // Icon
- n.Show();
- }
- }
- }
- /*
- * Build:
- *
- * gmcs -pkg:notify-sharp notifyhello.cs
- *
- * Run:
- *
- * mono notifyhello.exe
- *
- */
Summary にタイトル、Body にメッセージ文、Icon にアイコンファイル名(拡張子なし)または、アイコンファイルのパスを設定する。
アイコンファイルを保持するデフォルトディレクトリは「/usr/share/icons/Human/scalable/status」なので、ここにあるアイコンファイルは、ファイル名(拡張子なし)の設定で、使用することができる(notification-*.svg は NotifyOSD 用のアイコン類)。
NotifyTime サンプル
時報サンプルを試してみた。- using Notifications;
- using System;
- using System.Threading;
- namespace NotifyExample
- {
- public class NotifyTime
- {
- readonly Predicate<DateTime> _pred;
- public NotifyTime()
- : this(( (DateTime dt) => dt.Minute == 0 ))
- {
- }
- public NotifyTime(Predicate<DateTime> pred)
- {
- this._pred = pred;
- }
- public void Run()
- {
- int duetime = 60 - DateTime.Now.Second;
- using (Timer timer = new Timer(Notify, null , duetime * 1000, 60 * 1000))
- {
- Console.WriteLine("Press Enter key to exit.");
- Console.ReadLine();
- }
- }
- private void Notify(object state)
- {
- DateTime dt = DateTime.Now;
- if (_pred(dt))
- {
- Notification n = new Notification("現在時刻のお知らせ",
- dt.ToString("f"),
- "/usr/share/icons/hicolor/scalable/apps/gnome-panel-clock.svg");
- n.Show();
- }
- }
- public static void Main(string[] args)
- {
- NotifyTime nt = new NotifyTime(); // 時報
- //NotifyTime nt = new NotifyTime(( (DateTime dt) => true )); // 分報
- /*
- NotifyTime nt = new NotifyTime(
- ( (DateTime dt) => dt.Hour == 17 &&
- dt.Minute == 30 )); // 任意の時刻
- */
- nt.Run();
- }
- }
- }
- /*
- * Build:
- *
- * gmcs -pkg:notify-sharp notifytime.cs
- *
- * Run:
- *
- * mono notifytime.exe
- *
- */
なかなか、うまくいかなかった。30 回程メッセージ通知を行った後、タイマーが止まってしまうのだ(System.Timers.Timer を使用しても同様)。
結局のところ、タイマーによる CallBack 呼出し間隔を 10 秒以上に設定すること、呼出し毎に、Notification クラスのインスタンスを生成することで、タイマー停止は回避できるようになった。
タイマーと相性が悪いのだろうか、GC との関係なのだろうか。正直よく分からなかった。
0 件のコメント:
コメントを投稿