我的X11代码出了什么问题?

Jer*_*wen 7 c x11 xlib xorg

我试图让X Window在屏幕上的某个位置.当我要求人们执行此功能时,他们说你只是递归调用XQueryTree.

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

如果这有任何帮助:显示来自XOpenDisplay(NULL),我最初传递它的根窗口是XDefaultRootWindow(显示).我在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;
    }
Run Code Online (Sandbox Code Playgroud)

谢谢!

编辑:对于正在搜索类似信息的人:我最终查看了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;
Run Code Online (Sandbox Code Playgroud)

小智 3

您的代码看起来是正确的(我没有测试过),并且您描述的结果看起来一点也不奇怪。Metacity(和其他 X 窗口管理器)将在应用程序拥有的窗口周围和附近创建大量窗口,以显示窗口标题、边框和其他装饰。

尝试使用一些更简单的窗口管理器(例如 TVM)(甚至根本不使用)来运行测试。TVM 创建的窗口应该比当前的窗口管理器少得多。这应该会让事情更容易理解。

然而,通常与窗口管理器对抗并不是一个好主意。您不能以更高级别的方式解决您的问题而不必直接使用 xlib 吗?