私はGTK 3でカスタムウィジェットを作成しようとしています。他のテーマはすべてうまくいっていますが、特定のGTKテーマでのみ表示される描画問題に気付きました。私はgtk_render_background()
を呼び出して背景を描画するコードに問題を絞り込んだ。一部のテーマでは、背景が黒で塗りつぶされていますが、これはテーマのデフォルトの背景色ではありません。以下は私の描画機能の簡略版です。カスタムGTKウィジェットの背景は黒く塗りつぶされています
static void gtk_databox_ruler_draw_ticks(GtkDataboxRuler *ruler)
{
GtkWidget *widget;
GtkStateFlags state;
cairo_t *cr;
GtkStyleContext *style_context;
gint width, height;
if (!gtk_widget_is_drawable(GTK_WIDGET(ruler))) {
return;
}
widget = GTK_WIDGET(ruler);
state = gtk_widget_get_state_flags(widget);
style_context = gtk_widget_get_style_context(widget);
gtk_style_context_save(style_context);
gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_DEFAULT);
gtk_style_context_set_state(style_context, state);
/* <test-code> */
GdkRGBA test;
gtk_style_context_get_background_color(style_context, gtk_widget_get_state_flags(widget), &test);
/* </test-code> */
width = gtk_widget_get_allocated_width(widget);
height = gtk_widget_get_allocated_height(widget);
cr = cairo_create(ruler->priv->backing_surface);
gtk_render_background(style_context, cr, 0, 0, width, height);
gtk_style_context_restore(style_context);
cairo_destroy(cr);
}
私は、背景色を照会し、GDBでブレークポイントを設定するには、いくつかのテストコードを追加しました:
Ubuntuのアンビアンステーマを使用する場合:
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
をUbuntuの高コントラストのテーマを使用する場合:
(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
新しいGtkStyleContextを間違った方法で使用するのか、それともテーマが壊れているどのようにして問題の原因を絞り込むことができますか?
誰かがGtkStyleContextの良い紹介を指し示すことができれば、私はそれも感謝します。公式のAPIドキュメントは、基本的な概念を理解するのにはあまり役に立ちません。
私はどこに描画しているのかわかりませんが、描画仮想メソッドでウィジェットを描画することはできますが、予期せぬ動作を引き起こす何かがあなたのコードにあります。 – erick2red
' gtk_databox_ruler_draw_ticks'関数がウィジェットの描画関数( 'GtkWidgetClass-> draw')から呼び出されます。上記のコード内で修正が必要なものを指摘できますか? – dasup
助けが必要な場合はDunnoを参照してください。 (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red