Jan.30.2000
GTK+ RC file を利用したフォントの指定法について。
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 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 指定が出来ることとなります。
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; };
特定 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 を用意したほうが良いような気がします。