我有一个X11窗口,它是使用XCreateWindow创建的,父窗口设置为DefaultRootWindow(dpy)。该窗口接收ConfigureNotify事件。但是,无论窗口移动到何处,ConfigureNotify都会将位置报告为0,0。调用XGetWindowAttributes()也是如此。这是怎么回事?
还有一些让我疯狂的东西。我告诉CreateWindow将窗口放在特定的坐标上。但这是任何人猜测窗口实际出现的位置。很烦人。对此的想法?
(不,我不能使用Qt或其他API。这是Xlib。)
答案 0 :(得分:1)
您的窗口管理员应对这两种现象负责。
第一个是因为重新定位。 WM可以重新显示顶级窗口,以便它们不再是根的直接子项。它这样做是为了创建窗户装饰等。您的窗口成为装饰窗口的子窗口或孙子窗口。因此,顶级窗户的相对位置是无用的。你需要绝对的位置。使用XTranslateCoordinates
获取它们。
第二个是因为WM只知道更好。不完全是。它是 WM。它应该是聪明的。它属于用户。用户(至少在理论上)配置他的WM然而他认为合适。应用程序编写者不应该关心。如果用户希望他的窗口始终显示居中,那么就这样吧。如果他希望他们出现在随机位置,这是他的选择。
在极少数情况下,窗口应出现在固定位置,此类窗口应该几乎总是覆盖重定向。
在更罕见的情况下,您必须将托管窗口定位在已知坐标处。在这种情况下,请参阅this answer相关问题(无耻插件:它是我的)。您想指定PPosition
和PSize
。