6

GTK 3でカスタムウィジェットを作成しようとしています。特定のGTKテーマでのみ表示される描画の問題に気づきましたが、他のすべてのテーマはうまく機能します。を呼び出して背景を描画するコードに問題を絞り込みましたgtk_render_background()。一部のテーマでは、背景が黒一色でレンダリングされますが、これはテーマのデフォルトの背景色ではありません。以下は私の描画関数の簡略版です。

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のAmbianceテーマを使用する場合:

(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625, 
  blue = 0.94117647058823528, alpha = 1}

UbuntuのHighContrastテーマを使用する場合:

(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}

新しいGtkStyleContextを間違った方法で使用したのか、それともテーマが壊れているのか疑問に思います。問題の原因を絞り込むにはどうすればよいですか?

また、誰かがGtkStyleContextの良い紹介を教えてくれれば幸いです。公式のAPIドキュメントは、基本的な概念を理解するのにそれほど役立ちません。

4

3 に答える 3

5

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

問題の原因は、一部のGTKテーマが「デフォルトの場合」の背景色を定義し、他のテーマは定義しないことであるように見えます。

GTK3のデフォルトテーマ:

…
* {
  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;
}
…

Adwaitaのテーマ:

…
* {
    /* 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); 
于 2014-03-02T01:01:36.610 に答える
2

使用しているUbuntuとGTK3のバージョンは何ですか?

おそらく、を呼び出す必要がありますgtk_style_context_set_junction_sides()

GTKの開発者の1人であるBenjaminOtteからのこの情報にも興味があるかもしれません。 GTKスタイリングのしくみ、 GTK+3スタイリングも利用可能。

于 2012-09-03T18:17:12.120 に答える
1

ここでの落とし穴の一部は、ますます、必ずしも単一の背景色がもはや存在しないということかもしれません。

https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-colorのドキュメントによると:

「この関数は見た目よりもはるかに有用性が低く、新しく記述されたコードでは使用しないでください。背景は画像、グラデーション、またはソリッドを含むその他のパタ​​ーンである可能性があるため、CSSには「背景色」の概念がありません。色。"

于 2015-11-30T17:45:02.363 に答える