c - gtk_status_icon_is_embedded 在 Gnome3 和 xfce4 上总是返回 False

标签 c gtk xfce gnome-3

我最近一直在努力弄清楚 *gtk_status_icon_is_embedded()* 是如何工作的,我找到了一个关于 GtkStatusIcon 的教程 here .我在 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 的规范吗?还是实现问题?

如果您碰巧知道背后的原因,请在评论中留下一两行,我们将不胜感激。

关于c - gtk_status_icon_is_embedded 在 Gnome3 和 xfce4 上总是返回 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6316957/

相关文章:

python - c_void_p 值无效*

c++ - C/C++ 构建通用栈帧来调用不同的回调函数

module - 如何创建和加载 GTK 模块?

icons - 如何更改 xfce4 中的 xterm 图标?

c - 为什么 sizeof ("") 等价于 1 而 sizeof(NULL) 等价于 c 语言中的 4?

C 中的强制转换运算符 : () or (int)?

bash - 在 Bash 退出之前运行脚本

python - 仅在单击屏幕后才会出现窗口

c - 如何使用 gtk 信号将多个变量作为数据传递

c# - 从嵌入式资源更改 Gtk.Button 图像