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.
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
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
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