2012-09-03 20 views
5

Ich versuche, ein benutzerdefiniertes Widget in GTK 3 zu erstellen. Ich bemerkte Zeichenprobleme, die nur mit bestimmten GTK-Themen angezeigt werden, während alle anderen Themen gut funktionieren. Ich beschränkte das Problem auf den Code, der den Hintergrund zeichnet, indem er gtk_render_background() aufruft. Bei einigen Motiven wird der Hintergrund in Schwarz dargestellt, obwohl dies nicht die Standardhintergrundfarbe der Motive ist. Unten ist eine vereinfachte Version meiner Zeichenfunktion.Hintergrund des benutzerdefinierten GTK-Widget ist solid schwarz gerendert

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); 
} 

Ich habe einigen Test-Code, um die Hintergrundfarbe abzufragen und einen Haltepunkt in GDB:

Bei der Verwendung von Ubuntu Ambiance Thema:

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

Bei der Verwendung von Ubuntu Highcontrast Thema:

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

Ich frage mich jetzt, ob ich den neuen GtkStyleContext falsch verwende, oder ob oder der Thema ist gebrochen. Wie kann ich die Ursache des Problems eingrenzen?

Ich würde es auch schätzen, wenn jemand auf eine gute Einführung in GtkStyleContext verweisen kann. Die offizielle API-Dokumentation ist nicht so hilfreich, um das grundlegende Konzept zu verstehen.

+0

Ich weiß nicht, wo Sie zeichnen, aber Sie konnten nur ein Widget in seiner virtuellen Zeichnung Methode zeichnen. Es gibt so viele Dinge in Ihrem Code, die unerwartetes Verhalten verursachen, dass alles tun könnte. – erick2red

+0

Die' Die oben gezeigte Funktion gtk_databox_ruler_draw_ticks wird aus der Draw-Funktion des Widgets aufgerufen ('GtkwidgetClass-> draw'). Kannst du Dinge im obigen Code hervorheben, die behoben werden müssen? – dasup

+0

Weiß nicht, ob es helfen wird, aber du könntest [hier] schauen (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red

Antwort

4

Nachdem mehr als ein Jahr vergangen ist, musste ich dieses Problem erneut untersuchen, da es auch auftritt, wenn der GTK3-Standard-Stil verwendet wird, dh wenn mein Programm auf einem System ohne Themen verwendet wird . Eingerichtet.

Es scheint, dass die Ursache des Problems darin liegt, dass einige GTK-Designs eine Hintergrundfarbe für den "Standardfall" definieren und andere nicht.

Die 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; 
} 
… 

Das Adwaita Thema:

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

der Hintergrund gezogen zu bekommen, habe ich einfach ein Widget Klasse auszuwählen, die eine Hintergrundfarbe hat über alle definiert (die meisten) Themen. Ich benutze die Schaltfläche Klasse für das:

gtk_style_context_add_class(style_context, GTK_STYLE_CLASS_BUTTON); 
2

Welche Version von Ubuntu und GTK3 verwenden Sie?

Vielleicht müssen Sie gtk_style_context_set_junction_sides() anrufen.

Diese Informationen könnten Sie auch interessieren für Benjamin Otte, einer der Entwickler von GTK. How GTK styling works, auch verfügbar GTK+3 Styling.

+0

Ich benutze Ubuntu 12.04, libgtk ist in Version 3.4.2-0ubuntu0.Ich fügte 'gtk_style_context_set_junction_sides hinzu 'mit' GTK_JUNCTION_BOTTOM' gesetzt nach 'gtk_style_context_add_class', aber das hat es nicht behoben Danke für den Link, aber ich denke, es konzentriert sich mehr auf die CSS-Seite, während ich mehr Informationen über den GtkStyl benötige eContext-Seite (d.h. Rendern, was macht save/restore, wie funktionieren die Klassen? – dasup

1

Ein Teil der hier fangen, dass immer mehr sein kann, ist es nicht unbedingt eine einzige Hintergrundfarbe nicht mehr.

Per Dokumentation von https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-color:

„. Diese Funktion ist weit weniger nützlich, als es scheint, und es sollte nicht in neu geschriebenen Code verwendet werden CSS kein Konzept hat‚Hintergrundfarbe‘, als Hintergrund können ein Bild oder ein Farbverlauf oder ein anderes Muster einschließlich Volltonfarben sein."

+0

Vielen Dank, dass Sie darauf hingewiesen haben! Bitte beachten Sie, dass ich im obigen Code 'gtk_style_context_get_background_color' nur zum Testen/Debuggen verwendet habe. Der reale Code nennt 'gtk_render_background', von dem ich annehme, dass er mit allen Arten von Hintergrunddefinitionen umgehen kann. Der Aufruf von 'gtk_render_background' führt jedoch zu einem festen schwarzen Hintergrund mit bestimmten Themen. – dasup

Verwandte Themen