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);
}
다음은 두 기능의 결과가 다를 수 있음을 보여주는 결과입니다.
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"명령 줄을 사용하여 진입 점 이름을 정의하는 것입니다. 아무 것도하지 않아도됩니다. 여전히 우분투 터미널에서 실행되면 0을 반환하지만 xterm에서 작동합니다. 이유가 있습니까? – killercode