प्रदान किया गया है, मैं जीटीके 3 में एक कस्टम विजेट बनाने की कोशिश कर रहा हूं। मैंने ड्राइंग की समस्याओं को देखा जो केवल कुछ जीटीके विषयों के साथ दिखाई देते हैं, जबकि अन्य सभी थीम बेहतरीन काम करते हैं। मैंने उस समस्या को संकुचित कर दिया जो gtk_render_background()
पर कॉल करके पृष्ठभूमि खींचता है। कुछ विषयों के लिए, पृष्ठभूमि को ठोस काले रंग में प्रस्तुत किया जाता है, हालांकि यह थीम का डिफ़ॉल्ट पृष्ठभूमि रंग नहीं है। नीचे मेरे ड्रॉ फ़ंक्शन का सरलीकृत संस्करण है।कस्टम जीटीके विजेट की पृष्ठभूमि को ठोस काला
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 में एक ब्रेकपाइंट सेट:
उबंटू के Ambiance विषय का उपयोग करते समय:
(gdb) print test
$1: test = {red = 0.94901960784313721, green = 0.94509803921568625,
blue = 0.94117647058823528, alpha = 1}
उबंटू के HighContrast विषय का उपयोग करते समय:
(gdb) print test
$1: test = {red = 0, green = 0, blue = 0, alpha = 0}
अब मुझे आश्चर्य है कि क्या मैं गलत तरीके से नए GtkStyleContext का उपयोग करता हूं, या चाहे या विषय टूटा हुआ है। मैं समस्या के स्रोत को कैसे सीमित कर सकता हूं?
यदि कोई मुझे GtkStyleContext के लिए एक अच्छी परिचय के लिए इंगित कर सकता है तो मैं इसकी भी सराहना करता हूं। आधिकारिक एपीआई दस्तावेज मौलिक अवधारणा को समझने के लिए इतना उपयोगी नहीं है।
मुझे नहीं पता कि आप कहां ड्राइंग कर रहे हैं, लेकिन आप केवल अपने ड्रॉ वर्चुअल विधि में विजेट खींच सकते हैं। आपके कोड में इतनी सारी चीजें हैं जो अप्रत्याशित व्यवहार का कारण बनती हैं, कि कुछ भी ऐसा कर सकता है। – erick2red
' ऊपर दिखाए गए gtk_databox_ruler_draw_ticks' फ़ंक्शन को विजेट के ड्रॉ फ़ंक्शन ('GtkWidgetClass-> draw') से बुलाया जाता है। क्या आप उपरोक्त कोड में चीजों को इंगित कर सकते हैं जिन्हें ठीक करने की आवश्यकता है? – dasup
डुनो अगर यह मदद करेगा, लेकिन आप [यहां] देख सकते हैं (http://erick2red.github.com/blog/2012/08/21/making-you-own-widget/) – erick2red