Я пытаюсь создать собственный виджет в 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 не так уж полезна для понимания фундаментальной концепции.
gtk_databox_ruler_draw_ticks
вызывается из функции отрисовки виджета (GtkWidgetClass->draw
). Можете ли вы указать на вещи в приведенном выше коде, которые необходимо исправить? - person dasup   schedule 13.09.2012