2012-03-24 35 views
2

代码负荷的SVG文件的图像的下面的两行,并将其设置为一个窗口的图标:如何动态更改GTK中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元素的颜色,但是在将其设置为窗口图标之前,请动态更改此元素的颜色。

如果我在启动程序之前手动更改磁盘上该文件的此元素的样式属性,它会产生所需的效果。但我希望通过程序本身来设定它,以匹配它选择的颜色。

(这是这样我就可以区分多个类似窗口在窗口切换菜单,在其他地方中)

回答

3

现在我已经找到了答案,这一点,从IRC(#GTK +上irc.gnome.org) ,并阅读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; 
}