2012-09-03 24 views
5

私は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ドキュメントは、基本的な概念を理解するのにはあまり役に立ちません。

+0

私はどこに描画しているのかわかりませんが、描画仮想メソッドでウィジェットを描画することはできますが、予期せぬ動作を引き起こす何かがあなたのコードにあります。 – erick2red

+0

' gtk_databox_ruler_draw_ticks'関数がウィジェットの描画関数( 'GtkWidgetClass-> draw')から呼び出されます。上記のコード内で修正が必要なものを指摘できますか? – dasup

+0

助けが必要な場合はDunnoを参照してください。 (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red

答えて

4

1年以上経過した後、GTK3のデフォルト(ビルトイン)スタイルを使用しているとき、つまりテーマがないシステムでプログラムを使用しているときにも発生するため、この問題を再度調べなければなりませんでした。インストールされています。

問題の原因は、GTKのテーマの中には、「デフォルトケース」の背景色を定義しているものとそうでないものがあるようです。

GTK3 default theme

… 
* { 
    color: @fg_color; 
    border-color: shade (@bg_color, 0.6); 
    padding: 2px; 
    -GtkWindow-resize-grip-width: 0; 
    -GtkWindow-resize-grip-height: 0; 
    -GtkWindow-decoration-button-layout: 'icon:minimize,maximize,close'; 
} 

GtkWindow, .button, .slider { 
    background-color: @bg_color; 
} 
… 

アドワイチャテーマ:

… 
* { 
    /* inherit the color from parent by default */ 
    color: inherit; 
    background-color: @theme_bg_color; 
} 
… 

は背景が描画されるために、私は単純にすべてにわたって定義された背景色を持つウィジェットクラスを選択する必要が(ほとんど)テーマ。私はそのためのボタンクラスを使用します。ここでは、キャッチの

gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_BUTTON); 
2

あなたはどのバージョンのUbuntuとGTK3を使用していますか?

おそらくgtk_style_context_set_junction_sides()に電話する必要があります。

また、GTKの開発者の1人であるBenjamin Otteもこの情報に興味があります。 How GTK styling worksGTK+3 Stylingも利用できます。

+0

私はUbuntu 12.04を使用しています。libgtkは3.4.2-0ubuntu0のバージョンです。 'gtk_style_context_set_junction_sides 'GTK_JUNCTION_BOTTOM'を' gtk_style_context_add_class'の後に設定していますが、それは修正されませんでした。リンクをありがとうございます。しかし、私はCSS側についてもっと焦点を当てていると思いますが、GtkStyl eContext側(つまり、レンダリング、保存/復元するもの、クラスの仕組みなど)。 – dasup

1

一部は、ますます、単一の背景色、それ以上は必ずしも存在しないことかもしれません。 https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-colorのマニュアルに従って

:「。この関数は、それはそうよりもはるかに少ない有用であり、それは、新たに書かれたコードでは使用すべきではないCSSは、という概念がありません 『

背景がわかるように、背景色を』画像、勾配、または単色を含むその他のパタ​​ーンであってもよい。"

+0

これを指摘してくれてありがとう!上記のコードでは、テスト/デバッグの目的で 'gtk_style_context_get_background_color'を使用しました。実際のコードは 'gtk_render_background'を呼び出します。このgtk_render_backgroundはすべてのバックラウンド定義を扱うと仮定しています。しかし、 'gtk_render_background'を呼び出すと、特定のテーマで黒い背景がしっかりと表示されます。 – dasup

関連する問題