You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GTK 4菜单栏图标显示优化求助:临时实现性能不足,求官方代码修改方向

GTK 4菜单栏图标显示优化求助:临时实现性能不足,求官方代码修改方向

大家好,最近在做GTK4应用时,想让经典菜单栏里的菜单项显示图标,折腾出了一个临时的hack实现,但运行起来有点卡顿,性能不太理想。想请教下各位大佬,有没有知道该去GTK的源码里哪个部分打补丁,从根源上解决默认不显示菜单图标的问题?

我的临时Hack实现

我写了两个辅助函数,通过延迟遍历Widget树,强制把菜单里的图标控件设为可见:

static gboolean show_menu_icons_delayed (gpointer userdata) {
    GtkWidget *window = GTK_WIDGET(userdata);
    const gchar *config = g_getenv ("GTK_CSD");

    if (config && (strcmp (config, "1") == 0)) {
        // 处理CSD窗口:同时显示标题栏和菜单栏里的图标
        show_menu_icons (gtk_widget_get_next_sibling (gtk_widget_get_first_child (window)));
        show_menu_icons (gtk_widget_get_next_sibling (gtk_widget_get_next_sibling (gtk_widget_get_first_child (window))));
    }
    else {
        // 处理非CSD窗口:显示菜单栏里的图标
        show_menu_icons (gtk_widget_get_next_sibling (gtk_widget_get_first_child (window)));
    }

    return G_SOURCE_REMOVE;
}

static void show_menu_icons (GtkWidget *widget) {
    if (GTK_IS_IMAGE (widget)) {
        gtk_widget_set_visible (widget, TRUE);
    }
    else if (!GTK_IS_LABEL (widget) && GTK_IS_WIDGET (widget)) {
        GtkWidget *child = gtk_widget_get_first_child (widget);
        while (child) {
            show_menu_icons (child);
            child = gtk_widget_get_next_sibling (child);
        }
    }
}

菜单项图标的设置方式

给菜单项添加图标的逻辑是通过g_menu_item_set_attribute_value设置图标属性:

GMenuItem *menuitem = g_menu_item_new ("Open", "app.open");
g_menu_item_set_attribute_value (menuitem, "icon", g_variant_new_string("document-open"));

当前存在的问题

这个临时方案能实现需求,但性能有点拉胯——每次窗口加载都要递归遍历整个Widget树,强制修改图标的可见性,窗口结构复杂的时候会有明显的卡顿感。毕竟GTK4默认不显示菜单图标是设计特性,我这个相当于绕开了默认逻辑的补救手段。

想请教的问题

有没有大佬知道,在GTK的官方源码里,哪个模块或者文件负责控制菜单图标的可见性?比如是不是在gtkmenuitem.cgtkmenubar.c这类文件里,有控制图标默认隐藏的逻辑?或者是在菜单控件的初始化/绘制流程里?我想直接打补丁修改GTK,让菜单图标默认就显示,不用再靠这种遍历hack来补救。

麻烦各位大佬给点方向,谢谢啦!

火山引擎 最新活动