GTK 3'te özel bir pencere aracı oluşturmaya çalışıyorum. Diğer tüm temalar harika çalışırken yalnızca belirli GTK temalarıyla görünen çizim sorunları fark ettim. Sorunu arka plana çizen kodu gtk_render_background()
numaralı telefonu arayarak daraltdım. Bazı temalar için, arka plan, temanın varsayılan arka plan rengi olmasa da, katı siyah renkte oluşturulur. Aşağıda benim çekme işlevimin basitleştirilmiş bir sürümüdür.Özel GTK parçacığının arka planı kesintisiz siyah görüntüleniyor
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);
}
Ben arka plan rengini sorgulamak için bazı test-kod eklenmiş ve gdb bir kesme noktası ayarlamak:
Ubuntu'nun Ambiance temasını kullanırken:
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
Ubuntu'nun HighContrast temasını kullanarak
:(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
Şimdi yeni GtkStyleContext'i yanlış bir şekilde mi kullandığımı mı merak ediyorum. tema bozuk. Sorunun kaynağını nasıl daraltabilirim?
Eğer birisi benim GtkStyleContext'e iyi bir giriş yapmamı gösterebilirse bunu takdir ediyorum. Resmi API dokümantasyonu, temel kavramı anlamak için çok yararlı değildir.
Nerede çizim yaptığınızı bilmiyorum, ancak çizim sanal yönteminde yalnızca bir widget çizebilirsiniz. Kodunuzda beklenmedik davranışlara neden olacak pek çok şey vardır, bu herşeyi yapabilir. – erick2red
The" gtk_databox_ruler_draw_ticks' yukarıda gösterilen işlev, widget'ın çizim işlevinden ('GtkWidgetClass-> draw') çağrılır. Yukarıdaki kodda sabitlenmesi gerekenleri işaret edebilir misiniz? – dasup
Dunno yardımcı olacaksa, ama [buraya] bakabilirsiniz (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red