如何使用gtk让系统托盘显示图标

使用下面的演示代码时,注意图标的路径,否则不能显示托盘图标。如果编译不成功,请注意编译命令中的字符是否是英文的字符。
介绍:
这篇文章解释了gtkstatusicon部件的使用,这个gtkstatusicon部件用来在系统托盘里放置图标。为了和用户交互提示条和弹出菜单可以加入到这个图标里。这个图标也可以闪烁。
如何在系统托盘里放置图标:
下列函数可以用来创建一个新的状态图标:
gtkstatusicon* gtk_status_icon_new ();
gtkstatusicon* gtk_status_icon_new_from_pixbuf (gdkpixbuf *pixbuf);
gtkstatusicon* gtk_status_icon_new_from_file (const gchar *filename);
gtkstatusicon* gtk_status_icon_new_from_stock (const gchar *stock_id);
gtkstatusicon* gtk_status_icon_new_from_icon_name (const gchar *icon_name);
为了设置一个提示条文本可以用下面的函数:
void gtk_status_icon_set_tooltip (gtkstatusicon *icon, const gchar *tooltip_text);
为了闪烁一个图标用下面的函数:
void gtk_status_icon_set_blinking (gtkstatusicon *icon, gboolean blinking);
当用户激活这个托盘图标,托盘图标发送activate信号;当用户指出一个菜单应该显示时,托盘图标发送一个popup-menu信号。
演示程序:
下面的程序当用户按下最小化按钮时,创建一个托盘图标,隐藏应用窗口。使用托盘图标的弹出菜单应用窗口变得有效。当和托盘图标交互时信号被处理。
//trayicon.c
#include
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;
}
上面的代码可以用下面的命令编译:
gcc trayicon.c -o trayicon `pkg-config --cflags --libs gtk+-2.0`.
license
这篇文章相关的代码和文件是通过code project open license(cpol)授权。

世界最大规模电池展走访心得
常用的linux命令有哪些类型
无线充电对手机电池有损害吗 无线充电发热正常吗
PCB设计的接地问题总结
新iPhone支持替代容貌解锁!
如何使用gtk让系统托盘显示图标
数字楼宇可视对讲产品的选购与突围
LFP在电动汽车中的使用率增加到百分比范围的15%?
设计一个登录接口我们要考虑哪些地方?
一种浪涌电压监测电路
oppor11值得等待,超清双摄配置太给力,你的钱包准备好了吗?
合肥长鑫DRAM正式投片 国产存储的一大步
Linux系统解决磁盘空间不足的问题
LUMC研究感染病菌--热成像技术提供助力
京东方6代AMOLED产线总产能约达144K/月
9类DC-DC转换电路图汇总
简述恒流恒压电源ICU6116替换OB2532/1的参数信息
测温扫陕西健康码设备哪家好?健康码识别终端设备怎么选择?
智能家居包括什么产品
新一代PCI背板的电源管理需求