[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][TOP]

How to use fontset in GtkStyle?


Kondara Project の GNOME 野郎 A ちーむ、細野 英朋と申します。

 現在、gnome-pim に含まれる gncal に起こる

 - マルチバイト文字で記述された To Do 項目が
 - 期限切れの項目をハイライト表示するよう設定されている場合に
 - 期限切れ項目が文字化けする

というバグを解消すべく、gnome-pim のソースを眺めています。

 で、読み進めていくうちに

gnome-pim-1.0.50/gncal/gncal-todo.c:543-599
----------------------------------------------------------------------
static void
insert_in_clist (GncalTodo *todo, iCalObject *ico)
{
....
        static GtkStyle *overdue_style = NULL;
....	
	/* setup the over due style if we haven't already, or it changed.*/
	if (todo_style_changed || !overdue_style) { 
		/* free the old style cause its not needed anymore */
		if(!overdue_style) g_free(overdue_style);
		overdue_style = make_overdue_todo_style(todo);
		todo_style_changed = 0;
	}
....
	/*
	 * determine if the task is overdue..
	 * if so mark with the apropriate style
	 */
	if(todo_due_date_overdue_highlight) {
		if(ico->dtend < time(NULL))
			gtk_clist_set_row_style(todo->clist, i, overdue_style);
	}
....
}
----------------------------------------------------------------------
の中の make_overdue_todo_style でスタイルを overdue_style に渡し、それ
を gtk_clist_set_row_style で渡すあたりが怪しいとにらみ、更に、以下に
示す make_overdue_todo_style の定義を読み、

gnome-pim-1.0.50/gncal/gncal-todo.c:526-541
----------------------------------------------------------------------
static GtkStyle *
make_overdue_todo_style(GncalTodo *todo)
{
	GtkStyle *overdue_style = NULL;
....
	overdue_style = gtk_style_copy (GTK_WIDGET (todo->clist)->style);
	overdue_style->base[GTK_STATE_NORMAL] = overdue_color;
....	
}
----------------------------------------------------------------------
overdue_style を使ってスタイルを渡そうとして、フォントがうまく渡ってい
ないために文字化けするのではないか? という考えに至りました。そして
GtkStyle を定義しているヘッダファイルを調べてみました。

/usr/include/gtk/gtkstyle.h:60-104
----------------------------------------------------------------------
....
typedef struct _GtkStyle       GtkStyle;
....
struct _GtkStyle
{
....
  GdkFont *font;
....
};
----------------------------------------------------------------------
ここで目に留まったのが GdkFont *font; という部分です。これはフォントで
あってフォント *セット* ではなく、そのために overdue_style にフォント
セットがうまく渡っていないのではないか、と考えています。

 このとき考えられそうな修正方法は /usr/include/gtk/gtkstyle.h を改造
するか、overdue_style の型を適切なものに変更するという方法がありますが、
どちらの方法をとるべきかで悩んでいます。RPM パッケージを使ってソフトウェ
アを配布している者としては出来れば前者はとりたくないのですが、後者は
Gtk+ のヘッダファイルに GtkStyle に代わるものがないのが難点です。

 というわけで、妙案をお持ちの方がいらっしゃいましたら、ご教授をお願い
したいと思います。それでは。

----
ほそのひでとも @ Kondara Project GNOME 野郎 A ちーむ
http://www.kondara.org/~h/