GTK 4 和应用程序图标:如何以可移植的方式包含应用程序图标?

GTK 4 and applications icons : how to include an application icon in a portable way?

我很难理解 GTK 4 中的图标系统(我使用 C 语言)。 在 GTK 2 和 3 中,很容易指示 OS 关于用于显示应用程序的图标。

在 GTK 4 中,set_icon 函数已被删除,这让我们可以使用主题系统。

我知道,默认情况下,gtk 希望我们遵循 Freedesktop 图标主题规范,因此在安装过程中将图标放在 /usr/local/share/icons/hicolor/ 这样的目录中,并通过 /usr/local/share/icons/hicolor/ 这样的功能在应用程序中设置它=39=] 或 gtk_window_set_icon_name。但是我并没有真正设法让这个系统工作。

此外,我仍然不清楚在其他非基于 gnome 的系统上发生了什么,例如 Windows(甚至 KDE 桌面)...

那么,好吧,我有几个问题源于前面的观点:

(编辑:编辑以包括 nielsdg 精度)

好的,我找到了我的第二个问题和第三个问题的(部分)答案。

其实很简单,但是我犯了一些错误

你只需要有一个完全符合这个结构的目录(我在结构上犯了一个错误):

    my_ressource_directory/hicolor/apps/48x48/my-icon.png  
    my_ressource_directory/hicolor/apps/256x256/my-icon.png  
    my_ressource_directory/hicolor/apps/512x512/my-icon.png  

Only the 48x48 size is necessary, there are a lot of other sizes which seems to be : 8x8 16x16 22x22 24x24 32x32 36x36 42x42 44x44 48x48 64x64 72x72 96x96 128x128 150x150 192x192 256x256 310x310 512x512 and "scalable".

我不知道系统在什么情况下使用所有这些,我不知道是否可以进行个性化尺寸。

我同样不知道在什么情况下系统可以使用scalable中的svg图标...

那么,在代码中,您只需包含这样的内容即可:

    icon_theme = gtk_icon_theme_get_for_display (gdk_display_get_default ());
    gtk_icon_theme_add_search_path(icon_theme,path_to_my_ressource_directory); 

    if(gtk_icon_theme_has_icon(icon_theme,"my-icon")!=1)
       {
        // manage error
       }
    
    gtk_window_set_default_icon_name("my-icon"); // default icon for all windows if nothing is set explicitly if I understand well. 
    
    window = gtk_application_window_new (app);
    gtk_window_set_title (GTK_WINDOW (window), "Your app");
    gtk_window_set_icon_name(GTK_WINDOW (window),"my-icon"); // set explicitly the icon for the min window

还有 tadaaa;它有效 :) .

另请注意,有些 post 似乎说调用 gtk-update-icon-cache 对系统正常工作很重要。此命令在 GTK 用于加速图标 opening/processing 的目录中创建一个“icon-theme.cache”文件。 在实践中,我不能说这是否有效或是否真的被 GTK 使用,但在检查之后,即使没有 icon-theme.cache 它也能工作。所以这个命令的调用好像不是必须的

也就是说,在 Makefile 中调用命令是免费的。确切的命令是:

    gtk-update-icon-cache -f -t my_ressource_directory/

编辑

解决方案不完整,因为生成的图标在某些上下文中是模糊的。看到这个问题:

以及答案,以获得完整的解决方案。