2009-02-24 18 views
19

नमस्ते!मैक ओएस एक्स: क्या कोई प्रक्रिया किसी अन्य प्रक्रिया की विंडो में प्रस्तुत कर सकता है?

मैं वर्तमान में Win32 से MacOSX तक एक वेब ब्राउज़र प्लगइन पोर्ट कर रहा हूं। प्लगइन की विशेषताओं में से एक यह है कि जब प्लगइन लोड हो जाता है, तो यह एक अलग प्रक्रिया उत्पन्न करता है जो प्लगइन के "इंजन" के रूप में कार्य करता है और प्लगइन की खिड़की में ड्राइंग ऑपरेशन निष्पादित करता है (विशेष रूप से, ओपनजीएल संदर्भ को जोड़कर अभिभावक प्रक्रिया की खिड़की और उस संदर्भ में ओपनजीएल प्रतिपादन आदेश निष्पादित)। हम ऐसा इसलिए करते हैं क्योंकि प्लगइन आमतौर पर ब्राउज़र प्रक्रिया के भीतर धागे के रूप में लोड होता है, इसलिए प्लगइन में क्रैश पूरे ब्राउज़र को नीचे ले जाएगा। 'भारी उठाने' को एक अलग प्रक्रिया में विभाजित करके और प्लगइन कोड को बहुत पतला रखते हुए, हम उपयोगकर्ताओं को ऐसे क्रैश के खिलाफ सुरक्षा कर सकते हैं।

मैं MacOSX पर इस बच्चे की प्रक्रिया रेंडरर वास्तुकला की रक्षा करना चाहते हैं, लेकिन मैं एक बुरा अफवाह (गूगल क्रोम वेब ब्राउज़र से संबंधित) सुना है कि MacOSX के लिए हाथ का उपयोग कर सकते करने के लिए एक प्रक्रिया की अनुमति नहीं है इसके एक और प्रक्रिया के लिए खिड़कियां। इस जगह में मेरी अपनी खोज अनिश्चित है; अगर किसी को इस समस्या का कोई ज्ञान है और या तो इस लक्ष्य को पूरा करने के बारे में कुछ सलाह दे सकती है या अधिक निर्णायक "नहीं किया जा सकता", तो यह बेहद सहायक होगा।

आपकी मदद के लिए धन्यवाद!

+0

इस में पाया जा सकता आपकी रुचि का हो सकता है। http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan

+2

मूल पोस्टर पूछने वाले किसी भी चीज़ के साथ वास्तव में कुछ भी नहीं है। –

+0

हाय - Win32 के लिए इसके बारे में प्रलेखन कहां है? मैं बहु-प्रक्रिया विंडो स्वामित्व की सीमाएं सीखना चाहता हूं। – drudru

उत्तर

9

मैं लगभग एक साल पहले इसका समाधान जांच रहा था। मैं सेब मेलिंग सूची पर कुछ धागे शुरू कर दिया:

http://www.mail-archive.com/[email protected]/msg08056.html

http: // www। mail-archive.com/[email protected]/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

मुझे एक ऐसे समाधान पर वापस जाना पड़ा जिसने CGWindowListCreateImage का उपयोग किया, जिसने ओपनग्लू प्रक्रिया विंडो का एक स्क्रीन हड़पने लिया और इसे मुख्य प्रक्रिया विंडो में डिस्प्ले के लिए बिटमैप में परिवर्तित कर दिया। यह प्रभावशाली से बहुत दूर है क्योंकि वीडियो रैम से सिस्टम रैम में पिक्सेल डेटा स्थानांतरित किया जाता है।

मैंने एक फ़्लोटिंग विंडो समाधान की भी कोशिश की। ओपनग्लू प्रक्रिया विंडो मुख्य प्रक्रिया विंडो के ऊपर तैरती है और मुख्य विंडो से माउस आंदोलनों का जवाब देती है। लेकिन मुझे अंतराल और खिड़की जेड ऑर्डर खींचने में समस्याएं थीं।

आपको लगता है कि NSWindowSharingReadWrite आपको जो चाहिए वह करेगा, लेकिन फिर डौमेंटेशन/उदाहरण व्यावहारिक रूप से मौजूद नहीं थे।

लेकिन शायद पिछले साल में चीजें बदल गई हैं। यदि आपको कुछ नया लगता है तो मुझे पोस्ट रखें!

गुड लक

जे.सी.

+0

इस मुद्दे की लगभग एक सप्ताह तक जांच करने के बाद, मैं यहां कम या कम उतर गया। मेरे पास इस मुद्दे पर ऐप्पल के लिए उत्कृष्ट अनुरोध हैं, लेकिन NSWindowSharingType NSWindowSharingReadWrite पर सेट की गई विंडो के लाभ के बारे में कोई भी मुझे वापस नहीं मिला है। मैक ओएस 10.5 के रूप में, मुझे लेखन-टू-विंडोज़ को "nonexistant" या "बहुत खराब तरीके से देखभाल करने के लिए दस्तावेज करना होगा।" मेरा उपयोग किया गया समाधान shm_open और mmap, glReadPixels के साथ एक साझा मेमोरी बफर बनाने के लिए प्रक्रिया ए से, और फिर glTexImage2D और प्रक्रिया बी में एक ट्रैक्टर को प्रस्तुत करना था। यह तेज़ है। – fixermark

+0

मैंने उस दृष्टिकोण की भी कोशिश की जहां ओपनजी प्रक्रिया विंडो मुख्य प्रक्रिया के ऊपर तैरती है। रिक्त स्थान से निपटने के लिए आवश्यक है कि आप एक निजी एपीआई का उपयोग करें जो आपको नोटिफिकेशन देता है जब उपयोगकर्ता स्क्रीन स्विच करता है या एक्सपोज़ का उपयोग करता है। सबसे बुरा हिस्सा क्लिक से निपट रहा है, जो मुख्य विंडो की जेड स्थिति को ओपनगल विंडो के सामने जाने का कारण बनता है, लेकिन मुझे [NSWindow sendEvent] में एक निजी फ़ंक्शन मिला जो आंशिक रूप से हल हो गया। यह बदसूरत है और मैं भी एक बेहतर समाधान की तलाश में हूं। – neoneye

3

एक प्रक्रिया में एक विंडो को दूसरी प्रक्रिया द्वारा लिखा जा सकता है, प्रतीत होता है कि NSWindowSharingTypeNSWindowSharingReadWrite पर सेट है। वह तेंदुए में जोड़ा गया था। ध्यान दें कि मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन मैं कहूंगा कि यह कम से कम आपके लिए "नहीं किया जा सकता" बाधा को हटा देता है ;-)

5

यहाँ समग्र जवाब एप्पल के विकास दल से प्राप्त है।

मैकोज़क्स 10.5 में ऐसा करने का कोई तरीका नहीं है और इससे पहले एक ओपनजीएल प्रतिपादन संदर्भ को किसी अन्य प्रक्रिया की विंडो में जोड़ने के रूप में साफ है। लोगों ने विकसित किया हैक उन मामलों में सबसे अच्छा समाधान हो सकता है।

मैकोज़ 10.6 में हमारे पास सबसे नज़दीकी चीज है the IOSurface system; इसका उपयोग 10.6 में सबसे साफ समाधान प्रतीत होता है। यदि आप रेंडरिंग प्रक्रिया द्वारा अवरुद्ध होने के लिए प्रस्तुत की गई प्रक्रिया में क्लिक चाहते हैं, तो आपको ईवेंट को स्वयं बंडल करना होगा और आपको जो भी विधि मिलती है, उसका उपयोग करके उन्हें प्रतिपादन प्रक्रिया में भेजना होगा।

IOSurface पर अधिक जानकारी this StackOverflow entry