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

Schreibe einen Kommentar