Wie zu erkennen, top-level-X11-windows mit xlib?
Ich versuche, eine Liste aller top-level-windows-desktop in eine X11-Sitzung. Im Grunde möchte ich, um eine Liste aller windows, die angezeigt werden in dem Fenster-Manager-Anwendung-switching Benutzeroberfläche (in der Regel geöffnet, wenn der Benutzer drückt ALT+TAB).
Habe ich noch nie getan, alle X11-Programmierung vor, aber bisher habe ich es geschafft zum Durchlaufen der gesamten Fenster list, mit code, der ungefähr so 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()
genannt wird, zunächst mit dem root-Fenster.
Dieser Werke, soweit es druckt Informationen über Hunderte von windows -, was ich brauche, um herauszufinden, welche Eigenschaft kann ich befragen, um zu bestimmen, ob eine gegebene Window
ist eine top-level-Desktop-Anwendung Fenster (nicht sicher, was die offizielle Bezeichnung ist), oder nicht.
Kann jemand etwas Licht in diese Schuppen? Alle die Referenz-Dokumentation, die ich gefunden habe, die für X11-Programmierung wurde furchtbar trocken und schwer zu verstehen. Vielleicht könnte jemand Punkt sein, um eine bessere Ressource?
InformationsquelleAutor Thomi | 2009-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich eine Lösung!
Gut, irgendwie.
Wenn Ihr Fenster-manager verwendet die extended window manager hints (EWMH), können Sie die Abfrage des root-Fensters mit der "
_NET_CLIENT_LIST
" atom. Diese returna Liste der client-windows-Fenster-manager ist die Verwaltung. Weitere Informationen finden Sie unter hier.Allerdings gibt es einige Probleme mit diesem. Für einen start, der Fenster-manager im Einsatz für die EWMH. KDE und GNOME tun, und ich bin sicher, dass einige andere nicht so gut. Aber ich bin sicher, es gibt viele, die nicht. Auch ich habe bemerkt, ein paar Probleme mit KDE. Im Grunde, einige nicht-KDE-Anwendungen nicht bekommen, in die Liste aufgenommen. Zum Beispiel, wenn Sie ausführen, xcalc unter KDE wird es nicht zeigen, bis in dieser Liste.
Wenn jemand irgendwelche Verbesserungen zu dieser Methode, ich würde mich freuen, Sie zu hören. Für Referenz, der code, den ich verwende, ist nachfolgend aufgeführt:
Nett, aber hilft mir nicht mehr hier, wie ich bin immer noch mit CDE (und als Folge dtwm). Für die meisten Anwender, die diese gültig sein sollte, aber Bedenken Sie, es ist nicht überall, wenn Sie dies Lesen!
InformationsquelleAutor Thomi
Erweitern die bisherige Lösung, wenn Sie wollen, dann Holen Sie sich den Fenster-Namen:
Beachten Sie, dass
XFetchName
schaffen können, abername=NULL
. Dein Beispiel wird crash in diesem Fall. Auchchar* name='\0';
ist irreführend, die ständige Aussehen sollteNULL
, da es ein Zeiger nicht von einem Charakter.Fixed-code zum behandeln von NULL-name.
InformationsquelleAutor Ben
Wenn Sie nicht haben, um zu verwenden Xlib, mit GDK ist
gdk_screen_get_window_stack()
undgdk_window_get_window_type()
kann Ihnen helfen, für Ihre Bedürfnisse.InformationsquelleAutor gc .