私はX11セッションですべてのトップレベルデスクトップウィンドウのリストを取得しようとしています。基本的には、ウィンドウマネージャのアプリケーション切り替えUI(一般に、ユーザーがAlt + Tabキーを押したときに開く)に表示されるすべてのウィンドウのリストを取得したいと考えています。xlibを使ってトップレベルのX11ウィンドウを特定する方法は?
私の前に任意の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のプログラミングで見つけたすべてのリファレンスドキュメントは非常に乾燥しており、理解しづらいものです。おそらく、誰かがより良いリソースを指すことができるでしょうか?
このコードは正しくありませんが、 32ビット形式は、クライアントではなくサーバーで使用されるビット数を示します。クライアントは常にXID値を表すために「long」を使用します。あなたの配列はquint32ではなく 'long'の配列でなければなりません。 –