2012-09-03 16 views
5

प्रदान किया गया है, मैं जीटीके 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 के लिए एक अच्छी परिचय के लिए इंगित कर सकता है तो मैं इसकी भी सराहना करता हूं। आधिकारिक एपीआई दस्तावेज मौलिक अवधारणा को समझने के लिए इतना उपयोगी नहीं है।

+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

एक वर्ष से अधिक समय बीतने के बाद, मुझे फिर से इस समस्या को देखना पड़ा क्योंकि यह जीटीके 3 डिफ़ॉल्ट (अंतर्निहित) शैली का उपयोग करते समय भी होता है, यानी जब मेरा प्रोग्राम किसी ऐसे सिस्टम पर उपयोग किया जाता है जिसमें कोई थीम आदि नहीं है। स्थापित

ऐसा लगता है कि समस्या का स्रोत यह है कि कुछ जीटीके विषयों "डिफ़ॉल्ट मामले" के लिए पृष्ठभूमि रंग को परिभाषित करते हैं और अन्य नहीं करते हैं।

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

Adwaita विषय:

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

उबंटू और जीटीके 3 का कौन सा संस्करण आप उपयोग कर रहे हैं?

शायद आपको gtk_style_context_set_junction_sides() पर कॉल करने की आवश्यकता है।

आप जीटीके के डेवलपर्स में से एक बेंजामिन ओटे से इस जानकारी में रुचि भी ले सकते हैं। How GTK styling works, GTK+3 Styling भी उपलब्ध है।

+0

मैं उबंटू 12.04 का उपयोग कर रहा हूं, libgtk संस्करण 3.4.2-0ubuntu0 में है। मैंने 'gtk_style_context_set_junction_sides जोड़ा 'gtk_style_context_add_class' के बाद' GTK_JUNCTION_BOTTOM' सेट के साथ 'लेकिन यह ठीक नहीं हुआ। लिंक के लिए धन्यवाद, लेकिन मुझे लगता है कि यह सीएसएस पक्ष पर अधिक केंद्रित है जबकि मुझे GtkStyl के बारे में अधिक जानकारी चाहिए eContext पक्ष (यानी। प्रतिपादन, क्या बचाता है/बहाल करता है, कक्षाएं कैसे काम करती हैं)। – dasup

1

पकड़ का एक हिस्सा है कि यहाँ तेजी से हो सकता है, कुछ और ऐसे एक भी पृष्ठभूमि रंग जरूरी नहीं है।

https://developer.gnome.org/gtk3/stable/GtkStyleContext.html#gtk-style-context-get-background-color के प्रलेखन प्रति

:

"। इस समारोह में अब तक कम से कम ऐसा लगता है उपयोगी है, और यह नव लिखा कोड में नहीं किया जाना चाहिए सीएसएस की कोई अवधारणा नहीं" पृष्ठभूमि रंग ", एक पृष्ठभूमि के रूप में कर सकते हैं एक छवि, या एक ढाल, या ठोस रंग सहित किसी भी अन्य पैटर्न हो।"

+0

इसे इंगित करने के लिए धन्यवाद! कृपया ध्यान दें कि उपरोक्त कोड में, मैंने परीक्षण/डिबगिंग उद्देश्यों के लिए 'gtk_style_context_get_background_color' का उपयोग किया था। असली कोड 'gtk_render_background' कहता है जिसे मैं सभी प्रकार की पिछली परिभाषाओं से निपटने का अनुमान लगाता हूं। हालांकि, 'gtk_render_background' को कुछ विषयों के साथ ठोस काले बैकराउंड में कॉल करना। – dasup

संबंधित मुद्दे