问题描述
|
我一直在尝试弄清楚* gtk_status_icon_is_embedded()*最近如何工作,并且我在这里找到了有关GtkStatusIcon的教程。我在Gnome3和xfce4上都尝试了示例程序。在两个DM上都可以看到状态图标,但是无论我多么努力,该方法始终返回FALSE。有人可以给我一些启示吗?
提前致谢!
解决方法
事实证明,与UI相关的所有事情最好在主循环中完成,而不仅仅是更新。就是说,这是具有通知区域检测功能的修改后的示例程序。
#include <gtk/gtk.h>
static GtkWidget *my_menu = NULL;
static GtkStatusIcon *status_icon = NULL;
static void
destroy(GtkWidget *widget,gpointer data)
{
gtk_main_quit ();
}
static void
on_blink_change(GtkStatusIcon *widget,gpointer data)
{
gboolean blink = GPOINTER_TO_UINT(data);
g_debug(\"Set blinking %s\",(blink) ? \"on\" : \"off\");
gtk_status_icon_set_blinking(GTK_STATUS_ICON(status_icon),blink);
}
static void
activate (GtkStatusIcon* status_icon,gpointer user_data)
{
g_debug(\"\'activate\' signal triggered\");
}
static void
popup(GtkStatusIcon *status_icon,guint button,guint activate_time,gpointer user_data)
{
g_debug(\"\'popup-menu\' signal triggered\");
if (!my_menu)
{
GtkWidget *item;
my_menu = gtk_menu_new();
item = gtk_menu_item_new_with_label(\"Let\'s blink!\");
gtk_menu_append(my_menu,item);
g_signal_connect(G_OBJECT(item),\"activate\",G_CALLBACK(on_blink_change),GUINT_TO_POINTER(TRUE));
item = gtk_menu_item_new_with_label(\"Let\'s stop blinking!\");
gtk_menu_append(my_menu,item);
g_signal_connect (G_OBJECT(item),GUINT_TO_POINTER(FALSE));
item = gtk_menu_item_new_with_label(\"Quit\");
gtk_menu_append(my_menu,G_CALLBACK(destroy),NULL);
}
gtk_widget_show_all(my_menu);
gtk_menu_popup(GTK_MENU(my_menu),NULL,gtk_status_icon_position_menu,status_icon,button,activate_time);
}
static gboolean chkStatusIcon(gpointer pIn)
{
g_debug
(
\"embedded: %s\",gtk_status_icon_is_embedded(status_icon) ? \"yes\" : \"no\"
);
return FALSE;
}
int main( int argc,char* argv[] )
{
gtk_init( &argc,&argv );
status_icon = gtk_status_icon_new_from_stock(GTK_STOCK_QUIT);
gtk_status_icon_set_visible(status_icon,TRUE);
/* instead of doing it right here,we do it in the main event loop */
g_idle_add((GSourceFunc) chkStatusIcon,NULL);
gtk_status_icon_set_tooltip(status_icon,\"This is a test\");
/* Connect signals */
g_signal_connect (G_OBJECT (status_icon),\"popup-menu\",G_CALLBACK (popup),NULL);
g_signal_connect (G_OBJECT (status_icon),G_CALLBACK (activate),NULL);
gtk_main();
return 0;
}
现在该程序可以运行了,但是仍然存在一个问题。为什么不实例化状态图标就无法检查通知区域的可用性?如果我们可以在程序启动时获得该信息,则可以节省很多工作。这是由于freedesktop的规格所致吗?还是执行上的问题?
如果您碰巧知道背后的原因,那么如果可以在评论中加上一两行,将不胜感激。