当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : GtkStatusIcon和GtkMenu的问题
帖子发表于 : 2009-05-21 18:56 
头像

注册: 2007-06-30 0:27
帖子: 509
送出感谢: 0 次
接收感谢: 1
想实现这样的一个测试程序:
使用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: 无法安装的软件包


页首
 用户资料  
 
2 楼 
 文章标题 : Re: GtkStatusIcon和GtkMenu的问题
帖子发表于 : 2009-05-22 7:14 
头像

注册: 2008-10-29 22:16
帖子: 133
送出感谢: 0 次
接收感谢: 0 次
你在22行定义的函数只有一个实参(GtkWidget) 而166行的却是两个(GtkMenuItem, gpointer )类型也不匹配。
25和26行 有两个变量同名 ,你改一下。91.92的错误相同。
我随便改了一下,能通过编译 。


_________________
代码:
苏老泉,二十七,始发愤,读书籍。彼既老,犹悔迟。尔小生,宜早思!!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: GtkStatusIcon和GtkMenu的问题
帖子发表于 : 2009-05-22 8:27 
头像

注册: 2007-06-30 0:27
帖子: 509
送出感谢: 0 次
接收感谢: 1
谢谢楼上,果然是,时我自己太粗心了 :em03


_________________
反对台独,反对藏独,反对孤独!
apt-get不是万能的:

代码:
sudo apt-get install girlfriend
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
有一些软件包无法被安装。
下列的信息可能会对解决问题有所帮助:
下列的软件包有不能满足的依赖关系:
girlfiend: 依赖: hourse但是它将不会被安装
girlfiend: 依赖: car但是它将不会被安装
house,car: 依赖: money但是它将不会被安装
E: 无法安装的软件包


页首
 用户资料  
 
4 楼 
 文章标题 : Re: GtkStatusIcon和GtkMenu的问题
帖子发表于 : 2009-05-22 8:40 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
下次记得贴出行号。 :em04


_________________
● 鸣学


页首
 用户资料  
 
5 楼 
 文章标题 : Re: GtkStatusIcon和GtkMenu的问题
帖子发表于 : 2009-05-22 8:51 
头像

注册: 2007-11-29 9:41
帖子: 8455
送出感谢: 0 次
接收感谢: 0 次
楼主的签名有意思


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译