linux - X11 ConfigureNotify() 始终返回 x,y = (0,0)

标签 linux x11 xlib

我有一个使用 XCreateWindow 创建的 X11 窗口,其父窗口设置为 DefaultRootWindow(dpy)。该窗口接收ConfigureNotify 事件。但是,无论窗口移动到哪里,ConfigureNotify 都会将位置报告为 0,0。对于 XGetWindowAttributes() 的调用也是如此。这是怎么回事?

还有其他一些事情让我抓狂。我告诉 CreateWindow 将窗口放置在特定的坐标处。但没人能猜测窗口实际出现在哪里。非常令人恼火。对此有何想法?

(不,我不能使用 Qt 或其他 API。这是 Xlib。)

最佳答案

您的窗口管理器对这两种现象负有责任。

第一个是因为重新调整父子关系。 WM 可以重新设置顶层窗口的父级,使它们不再是根窗口的直接子级。它这样做是为了创建 window 装饰等。您的 window 成为装饰 window 的子窗或孙子。因此,顶层窗口的相对位置是没有用的。你需要绝对的位置。使用 XTranslateCooperatives 获取它们。

第二个是因为 WM 更了解。不完全是。这是 WM。它应该很聪明。它属于用户。用户(至少在理论上)按照他认为合适的方式配置他的 WM。应用程序编写者不应该关心。如果用户希望他的窗口始终居中显示,那就这样吧。如果他希望它们出现在随机位置,那是他的选择。

在极少数情况下,窗口应该出现在固定位置,并且此类窗口几乎总是应该覆盖重定向。

在更罕见的情况下,您必须将托管窗口定位在已知坐标处。在这种情况下,请参阅this answer一个相关的问题(无耻的插件:这是我的)。您想要指定 PPositionPSize

关于linux - X11 ConfigureNotify() 始终返回 x,y = (0,0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391791/

相关文章:

linux - 在 docker 环境中的 Centos 上出现 "Failed to set locale, defaulting to C"错误(yum 安装)

c - 我需要做什么才能链接到 xlib?

image - 如何使用 Xlib 从窗口上的文件绘制图像

c - 如何在 XLib 中创建半透明的白色窗口

linux - 使用 awk 格式化文本

linux - 终端连接到 OS X 上的 Linux 服务器

linux - Centos Apache - 在进行身份验证之前检测是否插入了智能卡

X11 从 WSL2 转发失败

c++ - X11 资源释放(特别是 Screen 对象)

c++ - 在 64 位 Debian 环境下编译 32 位 qt 源码