GtkStatusIcon和GtkMenu的问题

软件和网站开发以及相关技术探讨
回复
头像
牙签儿
帖子: 509
注册时间: 2007-06-30 0:27

GtkStatusIcon和GtkMenu的问题

#1

帖子 牙签儿 » 2009-05-21 18:56

想实现这样的一个测试程序:
使用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
有会的朋友旁观者清帮我看一下,谢谢了 :em42
代码如下:

代码: 全选

/*
 * =====================================================================================
 *
 *       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;
}
反对台独,反对藏独,反对孤独!
apt-get不是万能的:

代码: 全选

sudo apt-get install girlfriend
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
有一些软件包无法被安装。
下列的信息可能会对解决问题有所帮助:
下列的软件包有不能满足的依赖关系:
girlfiend: 依赖: hourse但是它将不会被安装
girlfiend: 依赖: car但是它将不会被安装
house,car: 依赖: money但是它将不会被安装
E: 无法安装的软件包
头像
md5xwl
帖子: 133
注册时间: 2008-10-29 22:16
联系:

Re: GtkStatusIcon和GtkMenu的问题

#2

帖子 md5xwl » 2009-05-22 7:14

你在22行定义的函数只有一个实参(GtkWidget) 而166行的却是两个(GtkMenuItem, gpointer )类型也不匹配。
25和26行 有两个变量同名 ,你改一下。91.92的错误相同。
我随便改了一下,能通过编译 。

代码: 全选

苏老泉,二十七,始发愤,读书籍。彼既老,犹悔迟。尔小生,宜早思!!
头像
牙签儿
帖子: 509
注册时间: 2007-06-30 0:27

Re: GtkStatusIcon和GtkMenu的问题

#3

帖子 牙签儿 » 2009-05-22 8:27

谢谢楼上,果然是,时我自己太粗心了 :em03
反对台独,反对藏独,反对孤独!
apt-get不是万能的:

代码: 全选

sudo apt-get install girlfriend
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
有一些软件包无法被安装。
下列的信息可能会对解决问题有所帮助:
下列的软件包有不能满足的依赖关系:
girlfiend: 依赖: hourse但是它将不会被安装
girlfiend: 依赖: car但是它将不会被安装
house,car: 依赖: money但是它将不会被安装
E: 无法安装的软件包
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: GtkStatusIcon和GtkMenu的问题

#4

帖子 eexpress » 2009-05-22 8:40

下次记得贴出行号。 :em04
● 鸣学
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: GtkStatusIcon和GtkMenu的问题

#5

帖子 lerosua » 2009-05-22 8:51

楼主的签名有意思
回复