gtk托盘图标程序
2009-10-25 00:57
176 查看
http://www.codeproject.com/KB/cross-platform/GTKTrayIcon.aspx
// trayicon.c #include < gtk / gtk.h > static void trayView(GtkMenuItem *item, gpointer user_data); static void trayExit(GtkMenuItem *item, gpointer user_data); static void trayIconActivated(GObject *trayIcon, gpointer data); static void trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popUpMenu); static void destroy (GtkWidget*, gpointer); static gboolean delete_event (GtkWidget*, GdkEvent*, gpointer); static gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event , gpointer user_data); int main(int argc, char *argv[]) { gtk_init (&argc, &argv); GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), " GtkStatusIcon Example" ); gtk_widget_set_size_request (window, 200 , -1 ); // set try icon file GtkStatusIcon *trayIcon = gtk_status_icon_new_from_file (" /root/Desktop/icon.png" ); // set popup menu for tray icon GtkWidget *menu, *menuItemView, *menuItemExit; menu = gtk_menu_new(); menuItemView = gtk_menu_item_new_with_label (" View" ); menuItemExit = gtk_menu_item_new_with_label (" Exit" ); g_signal_connect (G_OBJECT (menuItemView), " activate" , G_CALLBACK (trayView), window); g_signal_connect (G_OBJECT (menuItemExit), " activate" , G_CALLBACK (trayExit), NULL); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemView); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuItemExit); gtk_widget_show_all (menu); // set tooltip gtk_status_icon_set_tooltip (trayIcon, " MsgWatcherGTK" ); // connect handlers for mouse events g_signal_connect(GTK_STATUS_ICON (trayIcon), " activate" , GTK_SIGNAL_FUNC (trayIconActivated), window); g_signal_connect(GTK_STATUS_ICON (trayIcon), " popup-menu" , GTK_SIGNAL_FUNC (trayIconPopup), menu); gtk_status_icon_set_visible(trayIcon, FALSE); // set icon initially invisible GtkWidget *menuBar, *menuItemTopLvl, *mainMenu, *mainMenuItemExit; menuBar = gtk_menu_bar_new (); menuItemTopLvl = gtk_menu_item_new_with_label (" Menu" ); gtk_menu_shell_append (GTK_MENU_SHELL (menuBar), menuItemTopLvl); mainMenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuItemTopLvl), mainMenu); mainMenuItemExit = gtk_menu_item_new_with_label (" Quit" ); g_signal_connect (G_OBJECT (mainMenuItemExit), " activate" , G_CALLBACK (trayExit), NULL); gtk_menu_shell_append (GTK_MENU_SHELL (mainMenu), mainMenuItemExit); g_signal_connect (G_OBJECT (window), " destroy" , G_CALLBACK (destroy), NULL); g_signal_connect (G_OBJECT (window), " delete_event" , G_CALLBACK (delete_event), trayIcon); g_signal_connect (G_OBJECT (window), " window-state-event" , G_CALLBACK (window_state_event), trayIcon); gtk_container_add (GTK_CONTAINER (window), menuBar); gtk_widget_show_all (window); gtk_main (); return 0 ; } static void trayView(GtkMenuItem *item, gpointer window) { gtk_widget_show(GTK_WIDGET(window)); gtk_window_deiconify(GTK_WINDOW(window)); } static void trayExit(GtkMenuItem *item, gpointer user_data) { printf(" exit" ); gtk_main_quit(); } static void trayIconActivated(GObject *trayIcon, gpointer window) { gtk_widget_show(GTK_WIDGET(window)); gtk_window_deiconify(GTK_WINDOW(window)); } static void trayIconPopup(GtkStatusIcon *status_icon, guint button, guint32 activate_time, gpointer popUpMenu) { gtk_menu_popup(GTK_MENU(popUpMenu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time); } static void destroy (GtkWidget *window, gpointer data) { gtk_main_quit (); } static gboolean delete_event (GtkWidget *window, GdkEvent *event , gpointer data) { return FALSE; } static gboolean window_state_event (GtkWidget *widget, GdkEventWindowState *event , gpointer trayIcon) { if (event -> changed_mask == GDK_WINDOW_STATE_ICONIFIED && (event -> new_window_state == GDK_WINDOW_STATE_ICONIFIED || event -> new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED))) { gtk_widget_hide (GTK_WIDGET(widget)); gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), TRUE); } else if (event -> changed_mask == GDK_WINDOW_STATE_WITHDRAWN && (event -> new_window_state == GDK_WINDOW_STATE_ICONIFIED || event -> new_window_state == (GDK_WINDOW_STATE_ICONIFIED | GDK_WINDOW_STATE_MAXIMIZED))) { gtk_status_icon_set_visible(GTK_STATUS_ICON(trayIcon), FALSE); } return TRUE; }
相关文章推荐
- windows程序托盘图标以及消息提示--基本知识(NOTIFYICONDATA)
- QT程序退出后托盘图标不消失问题
- Windows关闭程序托盘图标不能消失的原因
- C#实现WinForm程序的动态系统托盘图标
- MFC 为程序制作一个系统托盘图标、显示隐藏任务栏图标
- 解决Java程序的托盘图标在Windows任务栏重建后丢失的问题(使用SystemTray类创建托盘图标)
- delphi程序启动时不让其显示图标,也不在托盘中显示。
- Air:给Ari程序添加系统托盘图标和图标的右键功能.
- 在Visual C++6.0中设计托盘图标程序
- windows程序托盘图标以及消息提示--基本知识(Shell_NotifyIcon)
- 如何把程序图标添加到系统托盘上
- 建立程序托盘图标
- VC++中实现程序启动后隐藏窗口,最小化到托盘图标。
- MFC中提示对话框的滑动弹出和程序图标加入系统托盘的实现
- java程序系统托盘的托盘图标的显示
- C# 控制台程序 托盘图标 事件响应
- 在vc中将程序图标最小化到托盘中
- 用VC设计托盘图标程序
- delphi 隐藏指定程序的托盘图标
- 开机自启动程序托盘图标显示不全