¿Cómo identificar las ventanas X11 de nivel superior utilizando xlib?

Estoy intentando obtener una lista de todas las ventanas de escritorio de nivel superior en una sesión X11. Básicamente, quiero obtener una lista de todas las ventanas que se muestran en la interfaz de usuario de cambio de aplicaciones de los administradores de ventanas (comúnmente abierta cuando el usuario presiona ALT + TAB).

Nunca he hecho ninguna programación X11 antes, pero hasta ahora he logrado enumerar toda la lista de ventanas, con un código que se parece a esto:

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() Se llama inicialmente con la ventana raíz.

Esto funciona, en la medida en que imprime información sobre cientos de ventanas, lo que necesito es determinar qué propiedad puedo interrogar para determinar si un determinadoWindow es una ventana de aplicación de escritorio de nivel superior (no estoy seguro de cuál es la terminología oficial), o no.

¿Alguien puede arrojar algo de luz sobre esto? Toda la documentación de referencia que he encontrado para la programación de X11 ha sido terriblemente seca y difícil de entender. ¿Quizás alguien podría apuntar a un mejor recurso?

Respuestas a la pregunta(3)

Su respuesta a la pregunta