我一直试图弄清楚 *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), "activate",
G_CALLBACK(on_blink_change),
GUINT_TO_POINTER(FALSE));
item = gtk_menu_item_new_with_label("Quit");
gtk_menu_append(my_menu, item);
g_signal_connect (G_OBJECT(item), "activate",
G_CALLBACK(destroy),
NULL);
}
gtk_widget_show_all(my_menu);
gtk_menu_popup(GTK_MENU(my_menu),
NULL,
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), "activate",
G_CALLBACK (activate), NULL);
gtk_main();
return 0;
}
现在该程序有效,但仍然存在一个问题。为什么不实例化状态图标就无法检查通知区域的可用性?如果我们在程序启动时能够获得该信息,则可以节省很多工作。是因为freedesktop的规格吗?或者它是一个实施问题?
如果您碰巧知道背后的原因,如果您能在评论中写一两行,将不胜感激。