Ich versuche, eine Liste aller Top-Level-Desktop-Windows in einer X11-Sitzung zu bekommen. Im Grunde möchte ich eine Liste aller Fenster erhalten, die in der Benutzerschnittstelle der Fenstermanager-Anwendung angezeigt werden (häufig geöffnet, wenn der Benutzer ALT + TAB drückt).Wie identifiziere ich Top-Level X11-Fenster mit xlib?
Ich habe noch nie eine beliebige X11 Programmierung getan, aber bisher habe ich es geschafft, durch die gesamte Fensterliste aufzuzählen, mit Code, der etwa wie folgt aussieht:
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()
heißt zunächst mit der Root-Fenster.
Das funktioniert, insofern es Informationen über hunderte von Fenstern ausgibt - was ich brauche, ist herauszufinden, welche Eigenschaft ich abfragen kann, um festzustellen, ob ein gegebenes Window
ein Top-Level-Desktop-Anwendungsfenster ist (nicht sicher was die offizielle Terminologie ist) oder nicht.
Kann jemand etwas Licht darauf werfen? Die gesamte Referenzdokumentation, die ich für X11-Programmierung gefunden habe, war schrecklich trocken und schwer zu verstehen. Vielleicht könnte jemand auf eine bessere Ressource hinweisen?
Dieser Code nicht korrekt ist, die 32-Bit-Format bezieht sich auf die Anzahl der Bits, die auf dem Server und nicht auf dem Client verwendet werden. Clients verwenden immer "long", um XID-Werte darzustellen. Ihr Array muss ein Array von 'long' nicht quint32 sein. –