我正在尝试在GTK3中创建一个自定义小部件。我注意到绘画问题只出现在某些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默认主题:
…
* {
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);
您使用的是什么版本的Ubuntu和GTK3?
也许你需要打电话给gtk_style_context_set_junction_sides()
。
您可能还对GTK的开发人员之一Benjamin Otte提供的信息感兴趣。GTK造型的工作原理,也可提供GTK+3造型。
这里的部分问题可能是,越来越多的人不再需要单一的背景颜色。
根据https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-样式上下文获取背景颜色:
"这个函数远没有看起来那么有用,不应该在新编写的代码中使用。CSS没有"背景颜色"的概念,因为背景可以是图像、渐变或任何其他模式,包括纯色。"