एक प्रणाली पर एक परमाणु संपत्ति के लिए XChangeProperty जहां परमाणु 64 बिट्स है

एक्स 11 प्रोटोकॉल एक परमाणु को 32-बिट पूर्णांक के रूप में परिभाषित करता है, लेकिन मेरे सिस्टम पर, एटम टाइप इन असाइन किए गए लंबे के लिए टाइपेडफ है, जो 64-बिट पूर्णांक है। एक्सलिब के लिए मैनुअल का कहना है कि संपत्ति के प्रकारों में 32 बिट्स का अधिकतम आकार होता है। यहां कुछ संघर्ष प्रतीत होता है। मैं तीन संभावित समाधानों के बारे में सोच सकता हूं।

  1. यदि Xlib एक विशेष मामले के रूप में XA_ATOM प्रकार के गुणों का व्यवहार करता है, तो आप 'डेटा' के लिए 32 'पास' और परमाणुओं की एक सरणी के लिए बस पास कर सकते हैं। यह अशुद्ध और हैकिश लगता है, और मुझे बहुत संदेह है कि यह सही है।

  2. Xlib के लिए मैनुअल प्राचीन प्रतीत होता है। चूंकि एटम मेरे सिस्टम पर 64 बिट लंबा है, तो क्या मुझे 'प्रारूप' पैरामीटर के लिए 64 पास करना चाहिए, भले ही 64 को अनुमत मान के रूप में सूचीबद्ध नहीं किया गया हो?

  3. परमाणुओं की एक सरणी के बजाय, क्या मुझे 'डेटा' पैरामीटर के लिए uint32_t मानों की एक सरणी पास करनी चाहिए? ऐसा लगता है कि यह मेरे लिए सही समाधान होगा, लेकिन ऐसा कुछ नहीं है जो मैंने देखा है कि मैंने देखा है कि XChangeProperty, जैसे कि एसडीएल का उपयोग करें।

_NET_WM_WINDOW_TYPE संपत्ति सेट करते समय एसडीएल समाधान 1 का उपयोग करता प्रतीत होता है, लेकिन मुझे संदेह है कि यह एक बग हो सकता है। छोटे एंडियन बाइट ऑर्डर (एलएसबी पहले) वाले सिस्टम पर, यह काम करने के लिए प्रतीत होता है अगर संपत्ति में केवल एक तत्व है।

किसी और ने इस समस्या का सामना किया है? किसी भी मदद की सराहना की है।

3
जोड़ा संपादित
विचारों: 1
एसडीएल क्या कर रहा है सही है। प्रारूप सर्वर पर प्रयुक्त बिट्स की संख्या निर्दिष्ट करता है, न कि Xlib इंटरफ़ेस में कितने उपयोग किए जाते हैं। आप हमेशा प्रारूप के साथ 'लम्बी' की सरणी का उपयोग करते हैं, इससे कोई फर्क नहीं पड़ता कि सर्वर पर भेजे जाने से पहले 32 बिट्स में उनका क्या अनुवाद किया जाता है। 32 और 64 बिट क्लाइंट एक ही सर्वर से कनेक्ट हो सकते हैं और जानकारी का आदान-प्रदान करना होगा, इसलिए प्रारूप सर्वर साइड आकार है।
जोड़ा लेखक John Meacham, स्रोत

1 उत्तर

संपत्ति दिनचर्या के लिए आप हमेशा 'लंबी', 'लघु' या 'चार' की एक सरणी पारित करना चाहते हैं। यह वास्तविक बिट चौड़ाई से हमेशा सच है। तो, भले ही आपका लंबा या परमाणु 64 बिट्स हो, फिर भी इसका दृश्य दृश्यों के पीछे 32 बिट्स में किया जाएगा।

प्रारूप सर्वर साइड बिट्स की संख्या है, क्लाइंट साइड नहीं। तो, प्रारूप 8 के लिए, आपको प्रारूप 16 के लिए एक चार सरणी पास करनी होगी, आप हमेशा एक छोटी सरणी का उपयोग करते हैं और प्रारूप 32 के लिए आप हमेशा एक लंबी सरणी का उपयोग करते हैं। यह किसी दिए गए मशीन पर छोटी या लंबी की वास्तविक लंबाई से पूरी तरह से स्वतंत्र है। एटम या विंडो जैसे 32 बिट मान हमेशा 'लंबे' होते हैं।

यह अजीब लग सकता है, लेकिन यह एक अच्छे कारण के लिए है, सी मानक उन प्रकारों की गारंटी नहीं देता है जिनके पास सर्वर पर बिल्कुल समान चौड़ाई है। उदाहरण के लिए, कोई मूल 16 बिट प्रकार वाली मशीन नहीं है। हालांकि 'लघु' कम से कम कम से कम 16 बिट्स होने की गारंटी है और कम से कम 32 बिट्स होने की गारंटी दी जाती है। तो 'लघु' और 'लंबे' के संदर्भ में क्लाइंट एपीआई बनाकर आप दोनों पोर्टेबल कोड लिख सकते हैं और हमेशा सी प्रकार में पूर्ण एक्स आईडी के लिए कमरा ले सकते हैं।

4
जोड़ा