以下两行代码从SVG文件加载图像并将其设置为窗口的图标:
GdkPixbuf *icon = gdk_pixbuf_new_from_file("icon.svg", NULL);
gtk_window_set_icon(GTK_WINDOW(win), icon);
此SVG文件包含一个定义如下的矩形:
<rect
style="fill:#000000"
id="screen"
... />
我想在加载文件后动态更改此rect
元素的颜色,但在将其设置为窗口的图标之前。
如果我在启动程序之前手动更改磁盘上该文件元素的style属性,它会产生所需的效果。但是我想让它由程序本身设置,以匹配它所选择的颜色。
(这是我可以区分窗口切换器菜单中的多个类似窗口,以及其他地方)
答案 0 :(得分:3)
我现在已经从IRC(irc.gnome.org上的#gtk +)找到了答案,并阅读了GTK自己的源代码。
答案包括构建一个设置样式表的字符串,并使用XML的xinclude来提取原始图像。
GdkPixbuf *load_icon(char *background)
{
/* This technique stolen from
* http://git.gnome.org/browse/gtk+/tree/gtk/gtkicontheme.c#n3180
*/
gchar *str = g_strconcat(
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
"<svg version=\"1.1\"\n"
" xmlns=\"http://www.w3.org/2000/svg\"\n"
" xmlns:xi=\"http://www.w3.org/2001/XInclude\"\n"
" width=\"64\"\n"
" height=\"64\">\n"
" <style type=\"text/css\">\n"
" #screen {\n"
" fill: ", background, " !important;\n"
" }\n"
" </style>\n"
" <xi:include href=\"" PANGOTERM_SHAREDIR "/pangoterm.svg" "\"/>\n"
"</svg>",
NULL);
GInputStream *stream = g_memory_input_stream_new_from_data(str, -1, g_free);
GdkPixbuf *ret = gdk_pixbuf_new_from_stream(stream, NULL, NULL);
g_object_unref(stream);
return ret;
}