2012-03-24 38 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; 
}