我正在尝试获取 X11 会话中所有顶级桌面窗口的列表。基本上,我想获取在窗口管理器应用程序切换 UI 中显示的所有窗口的列表(通常在用户按下 ALT+TAB 时打开)。
我以前从未做过任何 X11 编程,但到目前为止,我已经设法枚举了整个窗口列表,代码如下所示:
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()
最初使用根窗口调用。
就它打印出有关数百个窗口的信息而言,这是可行的-我需要的是弄清楚我可以询问哪个属性以确定给定Window
的是否是顶级桌面应用程序窗口(不确定官方术语是什么), 或不。
任何人都可以对此有所了解吗?我为 X11 编程找到的所有参考文档都非常枯燥且难以理解。也许有人可以指出更好的资源?