2009-07-07 14 views
6

मैं स्क्रीन पर एक निश्चित स्थान पर एक्स विंडो प्राप्त करने का प्रयास कर रहा हूं। जब मैंने लोगों को ऐसा करने के लिए एक समारोह के लिए कहा, तो उन्होंने कहा कि आप केवल XQueryTree को बार-बार कॉल करेंगे।मेरे एक्स 11 कोड के साथ क्या गलत है?

यह कोड स्निपेट है जो मुझे लगता है कि किसी भी तरह गलत है। जब मैं इसे डीबग करता हूं, तो यह पूरी तरह से काम करता प्रतीत होता है। एकमात्र समस्या यह है कि यह जो उत्पादन देता है वह थोड़ा अजीब लगता है। जब मैं रूट विंडो पर XQueryTree करता हूं, तो मुझे सैकड़ों बच्चों के पास मिलता है, जब मेरे पास केवल पांच या तो खुले होते हैं। साथ ही, ऐसा लगता है कि वहां एक शीर्ष-स्तरीय खिड़की है जहां कहीं भी नहीं है, और परिणामस्वरूप इसे वापस कर देता है। कोई फर्क नहीं पड़ता कि मैं अपनी वास्तविक खिड़कियों को कैसे चारों ओर ले जाता हूं, XQueryTree इंगित करता है कि मेरी खिड़कियों के शीर्ष पर एक और विंडो है (पूरी स्क्रीन को कवर नहीं करती है।) जब मैं देखता हूं कि खिड़की कहां कहती है, तो यह कुछ मनमाने ढंग से है मेरे डेस्कटॉप पर इंगित करें।

यदि यह किसी भी मदद की है: डिस्प्ले XOpenDisplay (NULL) से है, और मूल विंडो जिसे मैं मूल रूप से पास करता हूं वह XDefaultRootWindow (डिस्प्ले) है। मैं मेटासिटी के साथ डेबियन के नीचे gnome चल रहा हूँ।

point getwindowatloc(Display * display, Window root, jint x, jint y) { 
     Window returnedroot; 
     Window returnedparent; 
     Window * children; 
     unsigned int numchildren; 
     XQueryTree(display,root,&returnedroot,&returnedparent,&children, &numchildren); 
     XWindowAttributes w; 
     int i; 
     for(i=numchildren-1; i>=0; i--) { 
      XGetWindowAttributes(display,children[i],&w); 
      if(x>=w.x && x<=w.x+w.width && y>=w.y && y <= w.y+w.height) { 
       point result={w.x,w.y}; 
       XFree(children); 
       return result; 
      } else { 
       point result=getwindowatloc(display,children[i],x-w.x,y-w.y); 
       if(result.x!=INT_MAX) { 
        result.x+=w.x; 
        result.y+=w.y; 
        XFree(children); 
        return result; 
       } 
      } 
     } 
     if(children) { 
      XFree(children); 
     } 
     return notfound; 
    } 

धन्यवाद!

संपादित करें: किसी भी व्यक्ति के लिए जो समान जानकारी खोज रहा है: मैं xwininfo के स्रोत को देख रहा हूं। कुंजी फ़ंक्शन dsimple.c में Find_Client है, जो किसी भी तरह से विंडो प्रबंधक को अनदेखा करता है जिससे आप वास्तव में उस विंडो को प्राप्त कर सकते हैं जिसे आप वास्तव में ढूंढ रहे हैं। यदि आप सबविंडो में देखना चाहते हैं, तो यह कुछ कोड है जिसे मैंने select_Window में dsimple.c में जोड़ा है जो XTranslateCoordinates का उपयोग करके उपविंडो के अंदर फिर से दिखाई देगा।

Window child; 
do { 
    XTranslateCoordinates(dpy,target_temp,target_win,x,y,&x,&y,&child); 
    target_temp=target_win; 
    target_win=child; 
} while(target_win); 
return target_temp; 
+1

मुझे विश्वास नहीं है कि कोई वास्तव में यहां एक xlib प्रश्न पूछ रहा है! मैंने xlib का उपयोग किया है लेकिन आपकी समस्या को डीबग करने में मदद करने के लिए पर्याप्त नहीं है :( – hhafez

+0

यह बेहतर होगा कि आपने प्रश्न पोस्ट को संपादित करने के बजाय उत्तर के रूप में अपना समाधान पोस्ट किया। –

उत्तर

3

आपका कोड सही (मैं इसे परीक्षण नहीं किया) लग रहा है, और परिणाम आपके द्वारा बताई गई बिल्कुल अजीब लग नहीं है। मेटासिटी (और अन्य एक्स विंडो प्रबंधक) विंडो शीर्षक, सीमाओं और अन्य सजावट दिखाने के लिए एप्लिकेशन-स्वामित्व वाली विंडो के आस-पास और आसपास कई खिड़कियां बनाएंगे।

टीवीएम जैसे कुछ सरल विंडो प्रबंधक (या यहां तक ​​कि कोई भी नहीं) के साथ अपना परीक्षण चलाने का प्रयास करें। टीवीएम को मौजूदा विंडो प्रबंधकों की तुलना में बहुत कम विंडोज़ बनाना चाहिए। इससे चीजों को समझना आसान हो जाएगा।

आमतौर पर, विंडो प्रबंधक के खिलाफ लड़ना एक बुरा विचार है। क्या आप अपनी समस्या को उच्च स्तर पर सीधे हल नहीं कर सकते हैं जिसके साथ आप सीधे xlib का उपयोग कर रहे हैं?

+0

विचार यह था कि मैं ऐसा कुछ लिखना चाहता था जो मनुष्य के रूप में काम करे प्लेटफ़ॉर्म जितना संभव हो। मुझे लगा कि मैंने इसे xlib के लिए लिखा है, यह केवल मेरे द्वारा उपयोग किए जाने वाले विंडो मैनेजर के लिए काम करने के बजाय कई प्रणालियों के लिए पोर्टेबल होगा। मैं इसे एक अलग विंडो मैनेजर के साथ उपयोग करने का प्रयास करूंगा। –

3

मुझे लगता है कि आप जो करना चाहते हैं वह रूट विंडो की _NET_CLIENT_LIST संपत्ति से पूछताछ है। यह विंडो प्रबंधक द्वारा बनाई गई सभी "वर्चुअल" विंडो को छोड़कर, सभी क्लाइंट विंडो के लिए विंडो आईडी की एक सूची तैयार करेगा। अधिकांश विंडो प्रबंधक स्पष्ट रूप से _NET_CLIENT_LIST का समर्थन करते हैं, लेकिन आप यह भी पूछ सकते हैं कि कोई भी सुविधा समर्थित है या नहीं।

+0

धन्यवाद, लेकिन मुझे कुछ और काम मिल गया जो काम करता है। मैं काम करने के लिए xwininfo से एक फक्शन का उपयोग कर रहा हूं। यह ठीक है जो आप सुझाव दे रहे हैं, मुझे यकीन नहीं है। मदद के लिए धन्यवाद। –

+0

कूल, आपको एक कामकाज सुनने में खुशी हुई। :) – rob

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