Sto cercando di creare un widget personalizzato in GTK 3. Ho notato problemi di disegno che appaiono solo con determinati temi GTK, mentre tutti gli altri temi funzionano alla grande. Ho ristretto il problema al codice che disegna lo sfondo chiamando gtk_render_background()
. Per alcuni temi, lo sfondo viene reso in nero, anche se questo non è il colore di sfondo predefinito dei temi. Di seguito è una versione semplificata della mia funzione di disegno.Sfondo del widget GTK personalizzato viene reso nero fisso
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);
}
ho aggiunto un po 'di test-codice per interrogare il colore di sfondo e impostare un punto di interruzione in gdb:
Quando si utilizza Ambiance tema di Ubuntu:
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
Quando si utilizza highcontrast tema di Ubuntu:
(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
Ora mi chiedo se uso il nuovo GtkStyleContext in modo errato, o se o il il tema è rotto. Come posso restringere la fonte del problema?
Mi piacerebbe anche che qualcuno possa indicarmi una buona introduzione a GtkStyleContext. La documentazione API ufficiale non è così utile per comprendere il concetto fondamentale.
Non so dove si sta disegnando, ma si può solo disegnare un widget nel suo metodo virtuale di disegno: ci sono così tante cose nel codice che causano un comportamento imprevisto, che qualsiasi cosa potrebbe fare ciò – erick2red
La funzione gtk_databox_ruler_draw_ticks' mostrata sopra è chiamata dalla funzione di disegno del widget ('GtkWidgetClass-> draw'). Puoi indicare cose nel codice sopra che devono essere corrette? – dasup
Non so se ti aiuterà, ma potresti guardare [qui] (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red