2008年1月2日 星期三

使用 GtkStatusIcon 實作 System Tray

Standard
孤陋寡聞的我,一直都還在用 libegg EggTrayIcon 去撰寫 System Tray。由於過去寫的程式通常只是顯示一個 Icon 在 System Tray Bar 上,所以長久以來也沒有碰到什麼問題。直到這兩天在設計 Network Status 的 Display on System Tray時,才發現 EggTrayIcon 缺少一些重要的功能。查明後,才知道必須使用 libegg 的 EggStatusIcon 等其他 Functions 去實作那些功能。

得到答案本該是很開心的,但非常不幸的,同時也在 libegg 的 CVS 裡,得知了 libegg 已停止開發的消息﹝消息還是 2006 年的!﹞。文中說到了因為 Gtk-2.10 以後,規範了一個標準的 GtkStatusIcon Widget 去實作 System Tray,導致 libegg 便不再有存在的必要性,因此不再繼續維護下去。

關於 GtkStatusIcon 的詳細說明文件,可以在【 GNOME Documentation Libaray -- GTK+ Reference Manual 】找到,有興趣的人可以去參考參考。

就單純的 Hello World Program 來說,用 GtkStatusIcon Widget 去實作 System Tray 非常容易,下面是一個簡單的範例:
#include <gtk/gtk.h>

int main(int argc, char **argv) {
GtkStatusIcon *tray_icon;

gtk_init(&argc, &argv);
tray_icon = gtk_status_icon_new();
gtk_status_icon_set_from_file(tray_icon, "/tmp/trayicon.png");
gtk_status_icon_set_tooltip(tray_icon, "Hello Tray Icon!!");
gtk_status_icon_set_visible(tray_icon, TRUE);
gtk_main();

return 0;
}

另外順便也展示一下最近正在嘗試撰寫的 Network Status Daemon,其中的 System Tray 的實作就是使用 GtkStatusIcon 達成的 :P計劃把網路裝置的設定介面和 Wireless 的 Scanning APs/Select AP 等功能做一次大整合,可能會參考 MS Windows 裡 Network Device Systray 的行為來設計。因為目前為止,覺得 MS 在這部份的 Design 還算不錯,相較 GNOME 、 KDE 等環境之下,G or K 的 Design 就很令人畏懼 :(

註:不知道 ICON 的感覺還行不行?我畫了個半天呢!大家給我一點意見吧!Orz