2012-03-24 9 views
2

SVGファイルからコード負荷の次の2行の画像とウィンドウのアイコンとして設定:GTKのSVG画像内の要素の色を動的に変更する方法はありますか?

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

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

このSVGファイルは、とりわけ、のように定義された長方形を含ん

この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; 
} 
関連する問題