我正试图在屏幕上的某个位置获取X窗口。当我向人们询问一个函数来做到这一点时,他们说你只会递归地调用XQueryTree。我的X11代码有什么问题?
这是我认为是错误的代码片段。当我调试它时,它似乎完美地工作。唯一的问题是它的输出看起来有点奇怪。当我在根窗口上执行XQueryTree时,我得到了儿童的数百,当我只有五个左右的时候打开。此外,它似乎认为有一个顶级窗口,其中没有一个窗口,并返回结果。不管我如何移动我的实际窗口,XQueryTree似乎表明我窗口顶部的还有另一个窗口(不覆盖整个屏幕)。当我查看它说窗口的位置时,它在某些任意位置指向我的桌面。
如果这有任何帮助: 显示来自XOpenDisplay(NULL),并且我最初传递它的根窗口是XDefaultRootWindow(display)。我在debian中用metacity运行gnome。
point getwindowatloc(Display * display, Window root, jint x, jint y) {
Window returnedroot;
Window returnedparent;
Window * children;
unsigned int numchildren;
XQueryTree(display,root,&returnedroot,&returnedparent,&children, &numchildren);
XWindowAttributes w;
int i;
for(i=numchildren-1; i>=0; i--) {
XGetWindowAttributes(display,children[i],&w);
if(x>=w.x && x<=w.x+w.width && y>=w.y && y <= w.y+w.height) {
point result={w.x,w.y};
XFree(children);
return result;
} else {
point result=getwindowatloc(display,children[i],x-w.x,y-w.y);
if(result.x!=INT_MAX) {
result.x+=w.x;
result.y+=w.y;
XFree(children);
return result;
}
}
}
if(children) {
XFree(children);
}
return notfound;
}
谢谢!
编辑:任何正在寻找类似信息的人:我最终都在寻找xwininfo的来源。关键功能是dsimple.c中的Find_Client,它以某种方式忽略窗口管理器以获取您实际正在查找的窗口。如果你想查看子窗口,这是我添加到dsimple.c的Select_Window中的一些代码,它将使用XTranslateCoordinates以递归方式查看子窗口内部。
Window child;
do {
XTranslateCoordinates(dpy,target_temp,target_win,x,y,&x,&y,&child);
target_temp=target_win;
target_win=child;
} while(target_win);
return target_temp;
我不敢相信有人真的在这里问一个xlib问题!我已经使用了xlib,但还不足以帮助调试您的问题:( – hhafez 2009-07-07 04:58:47
它会更好,它将您的解决方案发布为答案,而不是编辑问题帖。 – 2015-01-23 13:19:20