2010年4月27日火曜日

C# でオリジナルのメッセージを通知する方法

on Mono 2.6.1, Ubuntu 9.04

デスクトップ上で、アプリまたはシステムからのメッセージ通知に使われている 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! である。
  1. using System;  
  2. using Notifications;  
  3.   
  4. namespace NotifyExample  
  5. {  
  6.   public class NotifyHello  
  7.   {  
  8.     public static void Main(string[] args)  
  9.     {  
  10.       Notification n = new Notification("NotifySharp"// Summary   
  11.                                         "Hello world!"// Body  
  12.                                         "notification-message-IM"); // Icon  
  13.       n.Show();  
  14.     }  
  15.   }  
  16. }  
  17. /* 
  18.  * Build: 
  19.  * 
  20.  *   gmcs -pkg:notify-sharp notifyhello.cs 
  21.  * 
  22.  * Run: 
  23.  * 
  24.  *   mono notifyhello.exe 
  25.  * 
  26.  */  


Summary にタイトル、Body にメッセージ文、Icon にアイコンファイル名(拡張子なし)または、アイコンファイルのパスを設定する。

アイコンファイルを保持するデフォルトディレクトリは「/usr/share/icons/Human/scalable/status」なので、ここにあるアイコンファイルは、ファイル名(拡張子なし)の設定で、使用することができる(notification-*.svg は NotifyOSD 用のアイコン類)。

NotifyTime サンプル

時報サンプルを試してみた。
  1. using Notifications;  
  2. using System;  
  3. using System.Threading;  
  4.   
  5. namespace NotifyExample  
  6. {  
  7.   public class NotifyTime  
  8.   {  
  9.     readonly Predicate<DateTime> _pred;  
  10.   
  11.     public NotifyTime()  
  12.       : this(( (DateTime dt) => dt.Minute == 0 ))  
  13.     {  
  14.     }  
  15.   
  16.     public NotifyTime(Predicate<DateTime> pred)  
  17.     {  
  18.       this._pred = pred;  
  19.     }  
  20.   
  21.     public void Run()  
  22.     {  
  23.       int duetime = 60 - DateTime.Now.Second;  
  24.       using (Timer timer = new Timer(Notify, null , duetime * 1000, 60 * 1000))  
  25.       {  
  26.         Console.WriteLine("Press Enter key to exit.");  
  27.         Console.ReadLine();  
  28.       }  
  29.     }  
  30.   
  31.     private void Notify(object state)  
  32.     {  
  33.       DateTime dt = DateTime.Now;  
  34.       if (_pred(dt))  
  35.       {          
  36.         Notification n = new Notification("現在時刻のお知らせ",  
  37.                                           dt.ToString("f"),  
  38.                                           "/usr/share/icons/hicolor/scalable/apps/gnome-panel-clock.svg");  
  39.         n.Show();  
  40.       }  
  41.     }  
  42.   
  43.     public static void Main(string[] args)  
  44.     {  
  45.       NotifyTime nt = new NotifyTime(); // 時報  
  46.       //NotifyTime nt = new NotifyTime(( (DateTime dt) => true )); // 分報  
  47.       /* 
  48.       NotifyTime nt = new NotifyTime( 
  49.         ( (DateTime dt) => dt.Hour   == 17 && 
  50.                            dt.Minute == 30 )); // 任意の時刻 
  51.        */  
  52.       nt.Run();  
  53.     }  
  54.   }  
  55. }  
  56. /* 
  57.  * Build: 
  58.  * 
  59.  *   gmcs -pkg:notify-sharp notifytime.cs 
  60.  * 
  61.  * Run: 
  62.  * 
  63.  *   mono notifytime.exe 
  64.  * 
  65.  */  


なかなか、うまくいかなかった。30 回程メッセージ通知を行った後、タイマーが止まってしまうのだ(System.Timers.Timer を使用しても同様)。

結局のところ、タイマーによる CallBack 呼出し間隔を 10 秒以上に設定すること、呼出し毎に、Notification クラスのインスタンスを生成することで、タイマー停止は回避できるようになった。

タイマーと相性が悪いのだろうか、GC との関係なのだろうか。正直よく分からなかった。

所感

カッコイイ NotifyOSD を使ってるオレ、カッコイイ!そんな気になるかもしれない。

参考

0 件のコメント:

コメントを投稿