मैं X11 सत्र में सभी शीर्ष स्तर की डेस्कटॉप विंडो की एक सूची प्राप्त करने का प्रयास कर रहा हूं। असल में, मैं विंडो मैनेजर एप्लिकेशन-स्विचिंग यूआई में दिखाए गए सभी विंडो की एक सूची प्राप्त करना चाहता हूं (जब उपयोगकर्ता ALT + TAB दबाता है तो आमतौर पर खोला जाता है)।xlib का उपयोग कर शीर्ष-स्तर X11 विंडो की पहचान कैसे करें?
void CSoftwareInfoLinux::enumerateWindows(Display *display, Window rootWindow)
{
Window parent;
Window *children;
Window *child;
quint32 nNumChildren;
XTextProperty wmName;
XTextProperty wmCommand;
int status = XGetWMName(display, rootWindow, &wmName);
if (status && wmName.value && wmName.nitems)
{
int i;
char **list;
status = XmbTextPropertyToTextList(display, &wmName, &list, &i);
if (status >= Success && i && *list)
{
qDebug() << "Found window with name:" << (char*) *list;
}
status = XGetCommand(display, rootWindow, &list, &i);
if (status >= Success && i && *list)
{
qDebug() << "... and Command:" << i << (char*) *list;
}
Window tf;
status = XGetTransientForHint(display, rootWindow, &tf);
if (status >= Success && tf)
{
qDebug() << "TF set!";
}
XWMHints *pHints = XGetWMHints(display, rootWindow);
if (pHints)
{
qDebug() << "Flags:" << pHints->flags
<< "Window group:" << pHints->window_group;
}
}
status = XQueryTree(display, rootWindow, &rootWindow, &parent, &children, &nNumChildren);
if (status == 0)
{
// Could not query window tree further, aborting
return;
}
if (nNumChildren == 0)
{
// No more children found. Aborting
return;
}
for (int i = 0; i < nNumChildren; i++)
{
enumerateWindows(display, children[i]);
}
XFree((char*) children);
}
enumerateWindows()
साथ प्रारंभ में कहा जाता है:
मैंने कभी नहीं किसी भी X11 प्रोग्रामिंग से पहले कुछ इस तरह दिखता है कि किया है, लेकिन अब तक मैं पूरी विंडो सूची के माध्यम बताना प्रबंधित किया है, कोड के साथ जड़ खिड़की
यह काम करता है, जहां तक यह सैकड़ों खिड़कियों के बारे में जानकारी प्रिंट करता है - मुझे क्या चाहिए, यह निर्धारित करने के लिए कि कौन सी संपत्ति मैं पूछताछ कर सकता हूं यह निर्धारित करने के लिए कि Window
एक शीर्ष-स्तरीय डेस्कटॉप एप्लिकेशन विंडो है (सुनिश्चित नहीं है आधिकारिक शब्दावली क्या है), या नहीं।
क्या कोई इस पर कुछ प्रकाश डाल सकता है? एक्स 11 प्रोग्रामिंग के लिए मैंने पाया है कि सभी संदर्भ दस्तावेज बहुत शुष्क और समझने में मुश्किल है। शायद कोई बेहतर संसाधन के लिए इंगित कर सकता है?
इस कोड सही नहीं है, 32 बिट प्रारूप सर्वर पर प्रयुक्त बिट्स की संख्या को संदर्भित करता है, क्लाइंट नहीं। ग्राहक हमेशा XID मानों का प्रतिनिधित्व करने के लिए 'लंबा' का उपयोग करते हैं। आपकी सरणी quint32 नहीं 'long' की सरणी होनी चाहिए। –