2010-12-01 18 views
6

मैंने सी ++ & एक्स 11 का उपयोग करके पूरी तरह से पारदर्शी विंडो बनाने की कोशिश की है। इसे किसी भी घटना का उपभोग नहीं करना चाहिए और उन्हें नीचे की खिड़कियों के लिए आगे बढ़ाना चाहिए। कुछ प्रकार का ग्लासपेन क्योंकि यह जावा-विंडोज के लिए जाना जाता है, लेकिन पूर्ण स्क्रीन। तो मैं इस खिड़की पर आकर्षित करना चाहता हूं।एक्स 11/एक्सलिब: "ग्लासपेन" बनाएं- विन्डो

क्या यह X11 के साथ किसी भी तरह संभव है?

मेरा पहला प्रयास सभी घटनाओं को अनदेखा कर रहा था, बस XGetImage() का उपयोग कर रूट विंडो से छवि कॉपी करें ... लेकिन सबसे पहले, यह काफी धीमी है क्योंकि खिड़की को पूर्ण स्क्रीन होने की आवश्यकता होगी। XShmGetImage दुर्भाग्य से यहां कोई विकल्प नहीं है।

निश्चित रूप से, इस विंडो को किसी भी सजावट की आवश्यकता नहीं होगी, लेकिन यह एक बड़ी समस्या नहीं है।

केवल X11/Xlib का उपयोग करके इसे कैसे करें? यदि यह संभव नहीं है, तो मुझे और क्या चाहिए?

किसी भी मदद की सराहना की जाती है!

पीएस: Xinerama सक्रिय रूप से Compiz सक्रिय है, अगर इससे समस्याएं आती हैं तो मैं उन्हें निष्क्रिय कर सकता हूं।

उत्तर

5

आप अपने इनपुट आकार को खाली करके आउटपुट-केवल विंडो बना सकते हैं।

एपीआई XFixesSetWindowShapeRegion() है और आप से ShapeInput अलग से सेट कर सकते हैं। XFixesCreateRegion() में पारित करने के लिए एक क्षेत्र पाने के लिए प्रयोग किया जाता है।

तो फिर तुम (के साथ-अल्फा चैनल) दृश्य एक RGBA की जरूरत है ताकि आप विंडो के सबसे में पारदर्शी पिक्सेल आकर्षित कर सकते हैं।

कंपोजिटिंग पारदर्शिता कार्य करने के लिए विंडो प्रबंधक की आवश्यकता होगी।

+0

घटनाओं के लिए, XFixesSetWindowShapeRegion आकार इनपुट के लिए एक खाली क्षेत्र के साथ। अच्छा बिंदु, धन्यवाद! – Atmocreations

+0

इस बारे में एक और सवाल: क्या मैं किसी भी तरह से घटना को रोक सकता हूं (अधिसूचित हो सकता हूं) लेकिन इसका उपभोग नहीं कर सकता, यानी, नीचे दी गई विंडो भी घटना प्राप्त करती है? XFixesSetWindowShapeRegion() फर आकार इनपुट के साथ अनुमान लगाओ, यह काम नहीं कर सकता है, है ना? धन्यवाद! – Atmocreations

+1

जहां तक ​​मुझे पता है, दुख की बात है, अभी तक "स्नूप" घटनाओं का कोई तरीका नहीं है। –

4

आपको एक्स सर्वर में इसके लिए ओवरले दृश्य समर्थन की आवश्यकता है, या अन्यथा प्रदर्शन पूरी तरह से अबाध हो जाएगा, क्योंकि आपको लगातार अपनी विंडो को मानचित्र/अनमैप करना होगा और/या हर समय get/putimage नृत्य करना होगा।

आपके पास मुख्य/रूट प्लेन गैर-ओवरले होना चाहिए और उसके ऊपर एक ओवरले दृश्य बनाना होगा। ओवरले विमान में जो कुछ भी स्पष्ट है, वह "मुख्य स्क्रीन" के माध्यम से गुजर जाएगा। कैसे "साधारण एक्स" में ऐसा करने पर

प्रलेखन बहुत विरल है, सरल तरीके से ओपन/GLX, http://www.opengl.org/sdk/docs/man/xhtml/glXChooseVisual.xml के माध्यम से हो सकता है - बस कोशिश:

int query[] = { /* GLX_RGBA, */ GLX_LEVEL, 1, 0 }; 
overlayVisual = glXChooseVisual(mydisplay, DefaultScreen(mydisplay), query); 
myWindow = XCreateWindow(..., overlayVisual, ...); 

तो आप विंडो खाली करने के लिए सक्षम होना चाहिए "मुख्य रूट" को दृश्यमान बनाने के लिए, और इसे कवर करने के लिए इसमें आकर्षित करें। "पुराने समय" में ओवरले अक्सर गैर-आरजीबी (रंग अनुक्रमित/पैलेटिज्ड) दृश्य होने की आवश्यकता होती थी और पारदर्शी भागों के लिए क्रोमो कीिंग का उपयोग किया जाता था। ओपनजीएल आरजीबीए को अल्फा चैनल के माध्यम से पारदर्शिता/मिश्रण का समर्थन करना चाहिए, हालांकि ...

मैंने कोशिश नहीं की है, मेरा वर्तमान फ्रेमबफर ओवरले का समर्थन नहीं करता है। एनवीडिया ने उन्हें अपने एक्स 11 ड्राइवर/उनकी कॉन्फ़िगरेशन फाइलों के लिए प्रलेखन में उल्लेख किया है, इसलिए मुझे लगता है कि वे अभी भी आसपास हैं, और अभी भी इस फैशन में उपयोग योग्य हैं।

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