使用GtkStatusIcon常驻通知区域,然后点击右键弹出GtkMenu,按照教程和Gtk+2.0文档编写了如下代码,一直有个问题编译通不过,编译时的信息如下:
有会的朋友旁观者清帮我看一下,谢谢了neo@neo:~/project$ gcc `pkg-config --libs --cflags gtk+-2.0` -o tray tray_test.c
tray_test.c:26: error: conflicting types for ‘status_icon’
tray_test.c:25: error: previous definition of ‘status_icon’ was here
tray_test.c:92: error: conflicting types for ‘status_icon’
tray_test.c:91: error: previous definition of ‘status_icon’ was here
tray_test.c:167: error: conflicting types for ‘exit_app’
tray_test.c:22: error: previous declaration of ‘exit_app’ was here
代码如下:
代码: 全选
/*
* =====================================================================================
*
* Filename: tray_test.c
*
* Description:
*
* Version: 1.0
* Created: 05/20/2009 06:25:00 PM
* Revision: none
* Compiler: gcc
*
* Author: Niu Peng (Neo), sirniu@gmail.com
* Company: none
*
* =====================================================================================
*/
#include "gtk/gtk.h"
void exit_app(GtkWidget *status_icon);
void config();
void check();
void show_pop_menu(GtkStatusIcon *status_icon,
guint button, guint activate_time, gpointer status_icon);
void set_menu_position(GtkMenu *menu, gint *x, gint *y,
gboolean *push_in, gpointer status_icon);
gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data);
void destroy(GtkObject *object, gpointer user_data);
int main(int argc, char *argv[])
{
GtkStatusIcon *status_icon;
gtk_init(&argc, &argv);
status_icon = gtk_status_icon_new_from_file("/home/neo/.alarm/niu.png");
gtk_status_icon_set_tooltip(status_icon, "实验!");
gtk_status_icon_set_visible(status_icon, (gboolean)TRUE);
g_signal_connect(G_OBJECT(status_icon), "popup_menu",
G_CALLBACK(show_pop_menu), status_icon);
g_signal_connect(G_OBJECT(status_icon), "destroy",
G_CALLBACK(destroy), status_icon);
g_signal_connect(G_OBJECT(status_icon), "delete_event",
G_CALLBACK(delete_event), status_icon);
gtk_main();
gtk_main();
return 0;
}
/*
* === FUNCTION ======================================================================
* Name: destroy
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void destroy(GtkObject *object, gpointer user_data)
{
gtk_main_quit();
return;
}
/*
* === FUNCTION ======================================================================
* Name: delete_event
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
return FALSE;
}
/*
* === FUNCTION ======================================================================
* Name: show_pop_menu
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void show_pop_menu(GtkStatusIcon *status_icon,
guint button, guint activate_time, gpointer status_icon)
{
GtkMenu *menu;
GtkWidget *quit, *preferences, *check;
gint x,y;
GdkEventButton *event_button;
check = gtk_menu_item_new_with_label("检查");
g_signal_connect(G_OBJECT(check), "activate",
G_CALLBACK(check), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), check);
preferences = gtk_menu_item_new_with_label("设置");
g_signal_connect(G_OBJECT(preferences), "activate",
G_CALLBACK(config), NULL);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), preferences);
quit = gtk_menu_item_new_with_label("退出");
g_signal_connect(G_OBJECT(quit), "activate",
G_CALLBACK(exit_app), status_icon);
gtk_menu_shell_append(GTK_MENU_SHELL(menu), quit);
gtk_menu_attach_to_widget(GTK_MENU(menu), GTK_WIDGET(status_icon), NULL);
gtk_menu_popup(GTK_MENU(menu),
NULL,
NULL,
(GtkMenuPositionFunc)set_menu_position,
NULL,
button,
activate_time);
gtk_widget_show_all(GTK_WIDGET(menu));
return;
}
/*
* === FUNCTION ======================================================================
* Name: check
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void check(GtkMenuItem menuitem, gpointer user_data)
{
printf("Haven't finished yet!\n");
return;
}
/*
* === FUNCTION ======================================================================
* Name: config
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void config(GtkMenuItem menuitem, gpointer user_data)
{
printf("Haven't finished yet!\n");
return;
}
/*
* === FUNCTION ======================================================================
* Name: exit_app
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void exit_app(GtkMenuItem menuitem, gpointer status_icon)
{
gtk_widget_destroy(GTK_WIDGET(status_icon));
return;
}
/*
* === FUNCTION ======================================================================
* Name: set_menu_position
* Description:
* Parameter:
* Return:
* =====================================================================================
*/
void set_menu_position(GtkMenu *menu, gint *x, gint *y,
gboolean *push_in, gpointer status_icon)
{
gtk_status_icon_position_menu(status_icon, x, y, push_in, NULL);
return;
}