2012-09-03 65 views
5

我想在GTK 3中創建自定義小部件。我注意到繪圖問題只出現在某些GTK主題中,而所有其他主題都很好。我通過調用gtk_render_background()將問題縮小到了描繪背景的代碼。對於某些主題,背景呈現爲純黑色,但這不是主題的默認背景色。以下是我的繪圖功能的簡化版本。自定義GTK小部件的背景呈現爲純黑色

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的氛圍主題:

(gdb) print test 
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625, 
    blue = 0.94117647058823528, alpha = 1} 

在使用Ubuntu的高對比度主題:

(gdb) print test 
$1: test = {red = 0, green = 0, blue = 0, alpha = 0} 

我現在不知道如果我在一個錯誤的方式使用新的GtkStyleContext,或是否在主題被打破。我怎樣才能縮小問題的根源?

如果有人能指出我對GtkStyleContext的一個很好的介紹,我也很感激。官方的API文檔對於理解基本概念沒有多大幫助。

+0

我不知道你在哪裏繪圖,但是你只能在繪製虛擬方法中繪製一個小部件,你的代碼中有太多東西會導致意外的行爲,任何事情都可能這樣做 – erick2red

+0

」上面顯示的gtk_databox_ruler_draw_ticks'函數是從小部件的繪圖函數('GtkWidgetClass-> draw')中調用的。你能指出上面代碼中需要修復的東西嗎? – dasup

+0

不知道是否有幫助,但你可以看看[這裏] (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red

回答

4

一年多過去後,我不得不考慮這個問題再次,因爲它使用GTK3時默認(內置)樣式,即當我的程序是沒有主題等的系統上使用時,也會發生。安裝。

看起來問題的根源在於某些GTK主題爲「默認情況」定義了背景色,而其他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; 
} 
… 

的阿德維塔主題:

… 
* { 
    /* 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); 
2

你使用的是什麼版本的Ubuntu和GTK3?可能需要撥打gtk_style_context_set_junction_sides()

您可能也有興趣從GTK的開發者之一Benjamin Otte獲得此信息。 How GTK styling works,也可用GTK+3 Styling

+0

我使用的是Ubuntu 12.04,libgtk在3.4.2-0ubuntu0版本中,我添加了'gtk_style_context_set_junction_sides 'GTK_JUNCTION_BOTTOM'設置在'gtk_style_context_add_class'之後,但沒有解決它。感謝鏈接,但我認爲它更側重於CSS端,而我需要更多關於GtkStyl的信息eContext側(即渲染,保存/恢復是什麼,這些類是如何工作的)。 – dasup

1

這裏的部分catch可能越來越多,不一定有單一的背景顏色了。

https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-color文檔:

「,此功能是遠遠超過它似乎用處不大,它不應該在新編寫的代碼中使用CSS沒有概念‘背景顏色’,作爲背景可以是圖像,或漸變,或任何其他模式,包括純色。「

+0

感謝您指出這一點!請注意,在上面的代碼中,我使用'gtk_style_context_get_background_color'只是爲了測試/調試目的。真正的代碼調用'gtk_render_background',我假定它處理各種背景定義。然而,調用'gtk_render_background'會產生一個黑色的背景,並帶有某些主題。 – dasup