2012-03-24 9 views
2

Die folgenden zwei Codezeilen Last ein Bild von einer SVG-Datei und es als Symbol für ein Fenster gesetzt:Wie kann ich die Farbe eines Elements in einem SVG-Bild in GTK dynamisch ändern?

GdkPixbuf *icon = gdk_pixbuf_new_from_file("icon.svg", NULL); 
gtk_window_set_icon(GTK_WINDOW(win), icon); 

ua Diese SVG-Datei enthält, ein Rechteck definiert wie:

<rect 
    style="fill:#000000" 
    id="screen" 
    ... /> 

Ich möchte die Farbe dieses Elements rect dynamisch ändern, nachdem ich die Datei geladen habe, aber bevor ich es als das Symbol für das Fenster festlegen.

Wenn ich das style-Attribut für dieses Element der Datei auf der Festplatte manuell ändern, bevor ich mein Programm starte, hat es den gewünschten Effekt. Aber ich möchte, dass es vom Programm selbst eingestellt wird, damit es zu einer Farbe passt, die es ausgewählt hat.

(Dies ist, so kann ich mehrere ähnliche Fenster im Fenster Switcher Menü unter anderem unterscheiden)

Antwort

3

ich jetzt habe die Antwort auf diese gefunden, von IRC (# gtk + auf irc.gnome.org) und lesen GTKs eigenen Quellcode.

Die Antwort umfasst das Erstellen einer Zeichenfolge, die ein Stylesheet festlegt und das XML-Zeichen xinclude verwendet, um das Originalbild einzufügen.

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; 
} 
Verwandte Themen