Linux中窗口状态的确定与恢复

Linux中窗口状态的确定与恢复,linux,x11,xlib,Linux,X11,Xlib,我使用xlib。我想记住窗口位置,并在下次启动时将其恢复到该位置。这将有助于用户,因为他不需要在每次启动时将窗口移动/调整到所需的位置 除了一种情况外,它的工作原理大致正常。当窗口最大化时,我无法找到确定其真实(非最大化)大小和位置的方法。也许有人知道怎么做?据我所知,没有一种标准的方法可以做到这一点。例如,如果您将源读取到Metacity,您可以看到它在MetaWindow对象中保持此未最大化的大小,但我认为它不会存储在属性中,并且在EWMH或ICCCM规范中也没有看到此属性 某些特定的窗口管

我使用xlib。我想记住窗口位置,并在下次启动时将其恢复到该位置。这将有助于用户,因为他不需要在每次启动时将窗口移动/调整到所需的位置


除了一种情况外,它的工作原理大致正常。当窗口最大化时,我无法找到确定其真实(非最大化)大小和位置的方法。也许有人知道怎么做?

据我所知,没有一种标准的方法可以做到这一点。例如,如果您将源读取到Metacity,您可以看到它在MetaWindow对象中保持此未最大化的大小,但我认为它不会存储在属性中,并且在EWMH或ICCCM规范中也没有看到此属性

某些特定的窗口管理器可能会将其存储在非标准属性中

当一个窗口被最大化时,您可以得到一个带有最大化标志的属性更改事件(libwnck是一个跟踪这类事情的旧库,可能有一个更新的库我不知道)。但是,我怀疑是否定义了调整大小是在设置标志之前还是之后进行的。您可以试探性地假设,在设置最大化标志的1秒内覆盖大部分屏幕的调整大小是最大化,或者类似的攻击

综上所述,我认为获得此功能的最简单方法是将其实现为一个窗口管理器扩展或插件,许多WMs都以某种方式支持它

这个(X会话管理协议)有一个旧的规范,不幸的是,这个规范被破坏得可笑,不清楚,基本上不可能实现。一个从未解决过的核心问题——可能需要应用程序合作来解决——是如何在重启时识别“相同”的窗口以恢复其大小。 这方面只有有缺陷的启发式方法


(很久以前我写过metacity,在几个会话管理器上工作过,所以有一次我可以告诉你更多,但我忘记了很多细节。)

你能给我们看看你的代码并缩小你的问题范围吗?因为现在你所要求的太宽泛了,不可能有用。记住几何体每次变化时,而不是最大化。这样,您就可以知道最大化之前的最新几何体。我是否正确理解您的意思?无法从Windows中类似于GetWindowPlacement()的窗口管理器中获取它,我需要跟踪更改。但是窗口管理器可以在更改大小之前或之后设置最大化属性。当窗口大小因最大化而改变时,是否可以指望已经设置了最大化属性?您的程序不应该太依赖窗口管理器。不能保证有人在场,也不能保证有人的行为符合你的预期。取消最大化(或取消最小化,或取消着色,或…)后的窗口放置是最大化(最小化,着色…)前的窗口放置,因此请记住您上次的“非特殊”放置。如果没有窗口管理器,将不会有最大化。如果没有窗口管理器,没有人会移动窗口,好像他们更了解如何使用程序一样。我如何确定该职位是“特殊”还是“非特殊”?