我试图在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文档对理解基本概念并不是很有帮助。

最佳答案

超过一年后,我不得不再次调查此问题,因为在使用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;
}
…

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);

关于c - 自定义GTK小部件的背景呈现为纯黑色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12249257/

10-11 22:58
查看更多