使用 GtkStatusIcon 實作 System Tray

孤陋寡聞的我,一直都還在用 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

留言

  1. 您好, 我是個Linux Programming新手, 如您所說, 了解程式語言還不夠, 重點還是在整個系統的程式介面與實做架構; 這點我可能這輩子都無法通透吧. cc

    關於您使用 GtkStatusIcon 實作 System Tray 這個 Project, 個人持相當正面的鼓勵與感謝; 如果除了能讓 GNOME 能夠擁有像是 Windows 連線管理員那樣的方便, 若能再整合入連線管理與封包監控那樣的功能, 我想也能夠為一般使用者在管理網路上提供一個很方便的介面. :)

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄