您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: