「りも」トップページへ
TIPS index へ

GTK+ の RC ファイルを利用したフォント指定

Jan.30.2000

GTK+ RC file を利用したフォントの指定法について。


・GTK+ におけるフォント指定

GTK+ では GTK Style なる構造があり、個々の widget に対し色や背景bitmapや フォントなどといった概観を指定できます。一般的には GTK theme と呼ばれる 手法で .gtkrc などの GTK+ RC file 形式で指定してやります。
話は飛んで、GDK を用いて pixmap にフォントを描画するには描画するための フォントを指定してやらなくてはなりません。GDK レベルでのフォントの 指定には GdkFont* を介して行う必要があります。具体的にはフォントセット ネームから GdkFont *gdk_fontset_load(const gchar *) を用いて GdkFont* 構造体を得、その GdkFont* を利用してフォントを描画します。
GTK+ RC によるフォント指定はあくまで widget に対するもので、GdkFont* を使う構造とは若干違うものであります。というか、直接つながっていない といったほうが正しいでしょうか。
要するに GDK レベルでフォントを pixmap に描画しようとした場合、 そのフォント指定を GTK+ RC File から直接行えないという事です。

・GTK+ RC を用いた widget の装飾

GTK+ RC File を用いると個々の widget もしくは widget class に対し Style 指定が行えます。その辺の仕組みについて。
GTK+ RC File を用いて特定の widget に Style を指定するためには 目的とする widget が名前を持っていなくてはいけません。Widget class への指定に関しては要りませんが。
GTK+ widget に名前をつけるには以下の命令で名前を指定してやる必要が あります。

  gtk_widget_set_name(GtkWidget *, const gchar *);
この手順を踏んでいれば GTK+ RC File からその widget に対して色々な Style 指定が出来ることとなります。
さて、逆に widget に与えられている Style を参照するにはどうしたら 良いのでしょうか? 今現在 widget にどのような Style が割り当てられて いるかは GtkStyle *gtk_rc_get_style(GtkWidget *) によって得ることが 出来ます。
GtkStyle の内容は以下の通り。
struct GtkStyle
  {
    GtkStyleClass *klass;

    GdkColor fg[5];
    GdkColor bg[5];
    GdkColor light[5];
    GdkColor dark[5];
    GdkColor mid[5];
    GdkColor text[5];
    GdkColor base[5];
    
    GdkColor black;
    GdkColor white;
    GdkFont *font;
    
    GdkGC *fg_gc[5];
    GdkGC *bg_gc[5];
    GdkGC *light_gc[5];
    GdkGC *dark_gc[5];
    GdkGC *mid_gc[5];
    GdkGC *text_gc[5];
    GdkGC *base_gc[5];
    GdkGC *black_gc;
    GdkGC *white_gc;
    
    GdkPixmap *bg_pixmap[5];
    
    /* private */
    
    gint ref_count;
    gint attach_count;
    
    gint depth;
    GdkColormap *colormap;
    
    GtkThemeEngine *engine;
    
    gpointer        engine_data;
    
    GtkRcStyle     *rc_style;     /* the Rc style from which this style
                                   * was created
                                   */
    GSList         *styles;
  };

・GTK+ RC からフォント指定を得る方法

特定 widget に割り当てられている font を読みだし、フォント指定と してみます。
まず特定の widget を得ます、この widget は GTK+ RC File にてフォント 指定のターゲットとされる widget name を持っているとします。また併せて この widget に対し GTK+ RC File にて style 指定がなされているもの とします。(style 指定がされていない場合 default の style になります)
目的とする widget から GtkStyle を取得します。この GtkStyle において フォント指定を意味するところは2箇所あります。

  (GtkStyle *)->font
  (GtkStyle *)->rc_style->font_name, (GtkStyle *)->rc_style->fontset_name
この2つのうちいずれかを用いる事によって今回の目的は達せられます。

・まとめ

今回 GTK+ にこだわって無理に GTK+ RC File を用いましたが、実際これで 指定できるのはカラー/背景 pixmap/フォント、ぐらいなものなので あまり実用的はありません。
おまけに特定 widget から強引に指定フォントを読みだしてそれを利用する というのは美しいとは言えないのでやっぱり自前でアプリケーション毎の RC File を用意したほうが良いような気がします。


今回は文字資料のみ。具体例は前回の「スプライト管理の実装」における 桜吹雪サンプルか、「ノベルで野球拳」のソースを参照してください。


rero2@yuumu.rim.or.jp