XGetWMName
機能を試すことができます。 XGetWMName
とXFetchName
のディスクリプションは両方ともWM_NAME
のプロパティを返すと言いますが、それらはお互いに異なるようです。時折、彼らは同じ名前を返します。時々、XGetWMName
だけが名前を返します。
xwininfo -root -tree
を使用してすべてのウィンドウの名前を取得し、XFetchName
とXGetWMName
の結果と比較することもできます。
このコードでは、すべてのウィンドウを一覧表示し、XFetchName
とXGetWMName
のウィンドウIDと結果を出力できます。ウィンドウIDを使用して、xwininfo -root -tree
の出力をルックアップすることができます。
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void enum_windows(Display* display, Window window, int depth) {
int i;
XTextProperty text;
XGetWMName(display, window, &text);
char* name;
XFetchName(display, window, &name);
for (i = 0; i < depth; i++)
printf("\t");
printf("id=0x%x, XFetchName=\"%s\", XGetWMName=\"%s\"\n", window, name != NULL ? name : "(no name)", text.value);
Window root, parent;
Window* children;
int n;
XQueryTree(display, window, &root, &parent, &children, &n);
if (children != NULL) {
for (i = 0; i < n; i++) {
enum_windows(display, children[i], depth + 1);
}
XFree(children);
}
}
int main() {
Display* display = XOpenDisplay(NULL);
Window root = XDefaultRootWindow(display);
enum_windows(display, root, 0);
}
2つの機能の結果が異なる可能性があることを示す出力結果です。
id=0x2c7, XFetchName="(no name)", XGetWMName="(null)"
id=0x400001, XFetchName="(no name)", XGetWMName="(null)"
id=0x800036, XFetchName="(no name)", XGetWMName="(null)"
id=0x1400001, XFetchName="(no name)", XGetWMName="c - XFetchName always returns 0 - Stack Overflow - Chromium"
id=0x1000001, XFetchName="terminator", XGetWMName="terminator"
id=0x1000002, XFetchName="(no name)", XGetWMName="(null)"
id=0x1200001, XFetchName="chromium", XGetWMName="chromium"
id=0x1200002, XFetchName="(no name)", XGetWMName="(null)"
ここに、これらのウィンドウの名前を示すxwininfo -root -tree
の出力があります。 xwininfo:ウィンドウID:0x2c7(ルートウィンドウ)(名前がありません)
Root window id: 0x2c7 (the root window) (has no name)
Parent window id: 0x0 (none)
29 children:
0x1200001 "chromium": ("chromium" "Chromium") 10x10+10+10 +10+10
1 child:
0x1200002 (has no name):() 1x1+-1+-1 +9+9
0x1000001 "terminator": ("terminator" "Terminator") 10x10+10+10 +10+10
1 child:
0x1000002 (has no name):() 1x1+-1+-1 +9+9
0x800036 (has no name):() 1364x741+0+25 +0+25
1 child:
0x1400001 "c - XFetchName always returns 0 - Stack Overflow - Chromium": ("Chromium" "Chromium") 1364x741+0+0 +1+26
0x400001 (has no name):() 10x10+-20+-20 +-20+-20
なぜ_main 'で' _'を'? –
Xterm(デフォルトでは 'xterm'が設定されています)から実行すると、あなたのコードは私が現在使っているマシン(OSX Lion)上で完璧に動作します。さらに、 'XStoreName()'の呼び出しを追加して、最初に何かを設定しました。期待通りに新しい名前を取得するコードでうまくいきました。もちろんこれは '_main()'を 'main()'に改名した後です - あなたはどのようにプログラムを実行していますか? –
'_'はstdlibを使用していないので、コマンドライン "-Wl、-e__main"でエントリポイント名を定義するだけです。何もしないと思います。まだUbuntuのターミナルから実行されたときは0を返しますが、xtermからは動作しますが、これには理由がありますか? – killercode