मैं एक्स 11 के तहत सभी खुली खिड़कियों की निगरानी करना चाहता हूं। वर्तमान में, मैं इस रूप में निम्न प्रकार कर रहा हूँ: XSelectInput(display, root_window, SubstructureNotifyMask | PropertyChangeMask)
मैं सभी एक्स 11 विंडोज़ की पूरी सूची कैसे प्राप्त और सिंक्रनाइज़ कर सकता हूं?
- प्रारंभ में रिकर्सिवली जड़ खिड़की
- से XQueryTree बुला पूरे डेस्कटॉप पर उपसंरचना परिवर्तन के लिए सुनकर द्वारा पूरे वृक्ष घूमना और घटनाओं को नष्ट करें, प्रक्रियाओं में
मैं मुख्य रूप से बिंदु 1 के बारे में चिंतित हूं। रिकर्सन के दौरान, XQueryTree को कई बार बुलाया जाएगा। क्या यह सुनिश्चित करने का कोई तरीका है कि पेड़ इस दौरान नहीं बदलता है? दूसरे शब्दों में, एक समय में पूरे पेड़ का 'स्नैपशॉट' प्राप्त करने के लिए?
इसके अलावा, मैंने देखा है कि कुछ एक्स 11 सिस्टम के तहत, सभी घटनाएं सही ढंग से नहीं आती हैं। उदाहरण के लिए, डेस्कटॉप पर एक नई विंडो खोलते समय, उस विंडो के लिए MapNotify कभी भी मेरे मॉनिटरिंग एप्लिकेशन पर नहीं पहुंच सकता है। यह कैसे हो सकता है? क्या यह संभव है कि इसे आने से पहले फेंक दिया जाए?
अद्यतन:
मैं एक छोटा सा प्रोग्राम है जो जड़ खिड़की पर एक्स घटनाओं (देखें नीचे) निगरानी करेंगे लिखा है। अब, जब मैं इस प्रोग्राम को चलाता हूं और xcalc को छोड़ता हूं और छोड़ देता हूं, तो मुझे निम्न आउटपुट मिलता है:
Reparented: 0x4a0005b to 0x1001e40
Mapped : 0x1001e40
Destroyed : 0x1001e40
यही है। मुझे कभी भी वास्तविक विंडो (0x4a0005b) को नष्ट नहीं किया जा रहा है। मैप किए जा रहे भी नहीं! क्या कोई मुझे बता सकता है क्यों नहीं? क्या SubStructureNotifyMask केवल की घटनाओं का कारण है सबविंडो को पूरे उपट्री के बजाय भेजा जाना चाहिए?
वैसे, यह स्पष्ट रूप से तब नहीं होता जब कंपिज़ चल रहा हो। तो फिर कोई reparenting किया जाता है:
Mapped : 0x4a0005b
Mapped : 0x4e00233
Destroyed : 0x4a0005b
Destroyed : 0x4e00233
निगरानी कार्यक्रम स्रोत:
#include <X11/Xlib.h>
#include <cstdio>
int main()
{
Display *display;
Window rootwin;
display = XOpenDisplay(NULL);
rootwin = DefaultRootWindow(display);
XSelectInput(display, rootwin, SubstructureNotifyMask);
XEvent event;
while (1) {
XNextEvent(display, &event);
if (event.type == MapNotify) {
XMapEvent *mapevent = (XMapEvent *)&event;
printf("Mapped : 0x%x\n", (unsigned int)(mapevent->window));
}
if (event.type == DestroyNotify) {
XDestroyWindowEvent *destroywindowevent = (XDestroyWindowEvent *)&event;
printf("Destroyed : 0x%x\n", (unsigned int)(destroywindowevent->window));
}
if (event.type == ReparentNotify) {
XReparentEvent *reparentevent = (XReparentEvent *)&event;
printf("Reparented: 0x%x to 0x%x\n", (unsigned int)(reparentevent->window), (unsigned int)(reparentevent->parent));
}
}
return 0;
}
धन्यवाद! मैंने xwininfo के लिए सोर्स कोड पर एक नज़र डाली और ऐसा लगता है कि पेड़ ट्रैवर्सल जैसा ही करता है: इसके चारों ओर संरचनाओं की रक्षा किए बिना। तो यदि XQueryTree कॉल के बीच पेड़ बदलने की संभावना है, तो xwininfo भी प्रभावित होगा और सही परिणाम नहीं देगा ... – Marten
@Marten, हाँ। xwininfo एक स्नैपशॉट है, लेकिन यह आपको विरासत देगा। फिर आप कई विंडोज़ खोल सकते हैं और अपडेट्स की जांच के लिए xprop -spy चलाने के लिए उनका उपयोग कर सकते हैं। इन उपकरणों में से कुछ हैं। Http://www.x.org/archive/X11R6.9.0/doc/html/manindex1.html –