代码之家  ›  专栏  ›  技术社区  ›  Jeremy Salwen

我的x11代码有什么问题?

  •  7
  • Jeremy Salwen  · 技术社区  · 15 年前

    我正试图在屏幕上的某个位置获得X窗口。当我要求人们使用一个函数来完成这个任务时,他们说您只需要递归地调用XQueryTree。

    这是代码片段,我认为这有点不对。当我调试它时,它似乎工作得很好。唯一的问题是它给出的输出看起来有点奇怪。当我在根窗口上执行XQueryTree时,我得到 数百 当我只有五个左右的孩子时。而且,它似乎认为在某个根本没有顶级窗口的地方有一个顶级窗口,因此返回它。不管我如何移动我的实际窗口,XQueryTree似乎表明有另一个窗口 顶上 当我看到窗口的位置时,它在我桌面上的某个任意点上。

    如果有任何帮助: 显示来自xopendisplay(空),我最初传递的根窗口是xdefaultrootwindow(显示)。我正在用元城市运行地精。

    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中查找客户机,它以某种方式忽略窗口管理器以获取您实际要查找的窗口。如果您想查看子窗口,这是我添加到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;
    
    2 回复  |  直到 10 年前
        1
  •  3
  •   Ricardo Massaro    15 年前

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

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

    然而,通常情况下,与窗口管理器对抗是一个坏主意。你不能用更高层次的方法来解决你的问题吗?我们必须直接使用xlib。

        2
  •  4
  •   user.dz    10 年前

    我想你要做的是查询根窗口的 _NET_CLIENT_LIST 财产。这将为所有客户端窗口生成一个窗口ID列表,不包括所有 事实上的 “由窗口管理器创建的窗口。大多数窗口管理器显然支持 _网络客户列表 ,但您也可以查询是否支持任何给定的功能。