मैं स्क्रीन पर एक निश्चित स्थान पर एक्स विंडो प्राप्त करने का प्रयास कर रहा हूं। जब मैंने लोगों को ऐसा करने के लिए एक समारोह के लिए कहा, तो उन्होंने कहा कि आप केवल 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;
मुझे विश्वास नहीं है कि कोई वास्तव में यहां एक xlib प्रश्न पूछ रहा है! मैंने xlib का उपयोग किया है लेकिन आपकी समस्या को डीबग करने में मदद करने के लिए पर्याप्त नहीं है :( – hhafez
यह बेहतर होगा कि आपने प्रश्न पोस्ट को संपादित करने के बजाय उत्तर के रूप में अपना समाधान पोस्ट किया। –