Estoy tratando de 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 IU de cambio de aplicación de administradores de ventana (comúnmente abierta cuando el usuario presiona ALT + TAB).¿Cómo identificar las ventanas de X11 de alto nivel utilizando xlib?
que nunca he hecho ningún tipo de programación X11 antes, pero hasta ahora he logrado enumerar a través de toda la lista de ventanas, con el código que se ve algo como 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 el 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 determinado Window
es una ventana de aplicación de escritorio de nivel superior (no estoy seguro 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 X11 ha sido terriblemente seca y difícil de entender. Tal vez alguien podría señalar a un mejor recurso?
Este código no es correcto, el El formato de 32 bits se refiere a la cantidad de bits utilizados en el servidor, no al cliente. Los clientes siempre usan 'largo' para representar los valores de XID. Su matriz debe ser una matriz de 'largo' no quint32. –