gpt4 book ai didi

c - 我的 X11 代码有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 17:10:56 25 4
gpt4 key购买 nike

我试图在屏幕上的特定位置获取 X Window。当我向人们询问一个函数来执行此操作时,他们说您只需递归调用 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;
}

谢谢!

编辑:对于正在搜索类似信息的任何人:我最终调查了 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;

最佳答案

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

关于c - 我的 X11 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1090402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com