2012-09-03 18 views
5

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.

+0

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

+0

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

+0

Dunno yardımcı olacaksa, ama [buraya] bakabilirsiniz (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red

cevap

4

Bir yıldan fazla bir süre geçtikten sonra, GTK3 varsayılan (yerleşik) stili kullanırken, yani programım tema içermeyen bir sistemde kullanıldığında da ortaya çıktığı için bu soruna yeniden bakmak zorunda kaldım. . Kurulmuş.

Sorunun kaynağı, bazı GTK temalarının "varsayılan durum" için bir arka plan rengi tanımlaması ve diğerlerinin olmamasıdır.

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 teması:

… 
* { 
    /* inherit the color from parent by default */ 
    color: inherit; 
    background-color: @theme_bg_color; 
} 
… 

arka plan çizilmiş olsun için, ben sadece tamamında tanımlanan bir arka plan rengi bir widget sınıfı seçmek zorunda (çoğu) temalar. Bunun için düğmeye sınıfını kullanın: av

gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_BUTTON); 
2

Ubuntu ve GTK3'ün hangi sürümünü kullanıyorsunuz?

Belki de gtk_style_context_set_junction_sides() numaralı telefonu aramanız gerekir.

Bu bilgi, GTK'nin geliştiricilerinden biri olan Benjamin Otte'den de ilginizi çekebilir. How GTK styling works, ayrıca mevcut GTK+3 Styling.

+0

Ubuntu 12.04 kullanıyorum, libgtk 3.4.2-0ubuntu0 sürümündeyim. 'gtk_style_context_set_junction_sides 'gtk_JUNCTION_BOTTOM' ile 'gtk_style_context_add_class' sonra ayarlandı ama bunu düzeltmedi.Gelişen için teşekkürler, ama daha fazla bilgiye ihtiyaç duyduğumda GtkStyl hakkında daha fazla bilgiye ihtiyacım var. eContext tarafı (ör. render, kaydetme/geri yükleme ne yapar, sınıflar nasıl çalışır? – dasup

1

Bölüm buraya giderek olabilir, tek bir arka plan rengi artık ille yoktur. https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-color belgelenmesi Başına

:

". Bu işlev göründüğünden çok daha az yararlı olduğunu ve yeni yazılmış kod kullanılmamalıdır CSS kavramı yok 'arka plan rengi', arka plan olarak can Bir görüntü veya bir degrade veya katı renkler de dahil olmak üzere başka bir model olsun."

+0

Bunu işaretlediğiniz için teşekkürler! Yukarıdaki kodda, sadece test/hata ayıklama amacıyla 'gtk_style_context_get_background_color' kullanılır. Gerçek kod, her türlü backround tanımını ele almayı düşündüğüm gtk_render_background işlevini çağırır. Ancak, "gtk_render_background" ifadesinin çağrılması, belirli temalara sahip sağlam bir siyah artalanla sonuçlanır. – dasup

İlgili konular