Comment identifier de haut niveau X11 windows à l'aide de la xlib?
Que j'essaie de faire une liste de tout le haut niveau du bureau de windows dans une session X11. Fondamentalement, je veux obtenir une liste de toutes les fenêtres qui apparaissent dans la fenêtre des gestionnaires de demande de commutation de l'INTERFACE utilisateur (généralement ouvert lorsque l'utilisateur appuie sur les touches ALT+TAB).
Je n'ai jamais fait de toute X11 programmation avant, mais jusqu'à présent, j'ai réussi à énumérer l'intégralité de la liste de la fenêtre, avec un code qui ressemble à quelque chose comme ceci:
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()
est appelé d'abord avec la fenêtre racine.
Cela fonctionne, dans la mesure où il imprime des informations sur des centaines de windows - ce que j'ai besoin, c'est de travailler la propriété de qui je peux interroger pour déterminer si une donnée Window
est une application de Bureau de la fenêtre (pas sûr de ce que la terminologie officielle est), ou pas.
Quelqu'un peut jeter quelque lumière sur ce point? Tous les documents de référence que j'ai trouvé pour X11 programmation a été terriblement sec et difficile à comprendre. Peut-être quelqu'un pourrait point être à une meilleure ressource?
Vous devez vous connecter pour publier un commentaire.
J'ai une solution!
Bien, en quelque sorte.
Si votre gestionnaire de fenêtre utilise l'étendue de la fenêtre du gestionnaire de conseils (EWMH), vous pouvez interroger la fenêtre de la racine à l'aide de la "
_NET_CLIENT_LIST
" atome". Cette returna liste de client windows, le gestionnaire de fenêtre est la gestion. Pour plus d'informations, voir ici.Cependant, il ya quelques problèmes avec cela. Pour commencer, le gestionnaire de fenêtre en cours d'utilisation doit prendre en charge la EWMH. KDE et GNOME, et je suis sûr que certains d'autres faire aussi bien. Cependant, je suis sûr qu'il ya beaucoup qui ne le font pas. Aussi, j'ai remarqué quelques problèmes avec KDE. Fondamentalement, certains non-KDE applications n'ont pas été inclus dans la liste. Par exemple, si vous exécutez xcalc sous KDE il n'apparaît pas dans cette liste.
Si quelqu'un peut fournir des améliorations sur cette méthode, je serais heureux de les entendre. Pour référence, le code que j'utilise est le suivant:
Pour développer la solution précédente, si vous voulez obtenir les noms des fenêtres:
XFetchName
peut réussir mais ensemblename=NULL
. Votre exemple va se planter dans ce cas. Aussichar* name='\0';
est trompeuse, la constante doit ressembler àNULL
, puisque c'est un pointeur non un personnage.Si vous n'avez pas à utiliser de la Xlib, à l'aide de GDK est
gdk_screen_get_window_stack()
etgdk_window_get_window_type()
peut vous aider pour vos besoins.