C 我的X11代码有什么问题?

C 我的X11代码有什么问题?,c,x11,xlib,xorg,C,X11,Xlib,Xorg,我试图在屏幕上的某个位置获取X窗口。当我要求人们提供一个函数来实现这一点时,他们说可以递归调用XQueryTree 这是我认为有点错误的代码片段。当我调试它时,它似乎工作得很好。唯一的问题是它给出的输出似乎有点奇怪。当我在根窗口上执行XQueryTree时,我得到了数百个孩子,而我只打开了五个左右。而且,它似乎认为在某个地方有一个顶级窗口,但实际上没有,因此返回它。无论我如何移动我的实际窗口,XQueryTree似乎表明在我的窗口顶部有另一个窗口(不覆盖整个屏幕)。当我看到它所说的窗口所在的位置

我试图在屏幕上的某个位置获取X窗口。当我要求人们提供一个函数来实现这一点时,他们说可以递归调用XQueryTree

这是我认为有点错误的代码片段。当我调试它时,它似乎工作得很好。唯一的问题是它给出的输出似乎有点奇怪。当我在根窗口上执行XQueryTree时,我得到了数百个孩子,而我只打开了五个左右。而且,它似乎认为在某个地方有一个顶级窗口,但实际上没有,因此返回它。无论我如何移动我的实际窗口,XQueryTree似乎表明在我的窗口顶部有另一个窗口(不覆盖整个屏幕)。当我看到它所说的窗口所在的位置时,它位于我桌面上的某个任意点

如果这有任何帮助: 显示来自XOpenDisplay(NULL),我最初传递给它的根窗口是XDefaultRootWindow(display)。我用metacity在debian下运行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;
    }
您的代码看起来是正确的(我还没有测试过),您描述的结果看起来一点也不奇怪。Metacity(和其他X窗口管理器)将在应用程序拥有的窗口周围和附近创建大量窗口,以显示窗口标题、边框和其他装饰

试着用一些更简单的窗口管理器运行测试,比如TVM(或者根本没有)。TVM应该创建比当前窗口管理器少得多的窗口。这应该使事情更容易理解


然而,通常情况下,反对窗口管理器是个坏主意。您不能直接使用xlib以更高层次的方式解决您的问题吗?

我想您要做的是查询根窗口的
\u NET\u CLIENT\u LIST
属性。这将生成所有客户端窗口的窗口ID列表,不包括窗口管理器创建的所有“虚拟”窗口。大多数窗口管理器显然支持
\u NET\u CLIENT\u LIST
,但您也可以查询是否支持任何给定功能。

我不敢相信有人真的在这里问xlib问题!我使用了xlib,但不足以帮助调试您的问题:(如果你将你的解决方案作为答案发布,而不是编辑问题帖子,那就更好了。我的想法是,我想写一些能在尽可能多的人平台上工作的东西。我想如果我为xlib写的话,它将可移植到许多系统,而不仅仅是为我使用的窗口管理器工作。我将尝试使用dif下一个是ferent窗口管理器。谢谢,但我找到了其他有效的功能。我正在使用xwininfo的功能来完成这项工作。它可能完全符合您的建议,我不确定。谢谢您的帮助。
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;