【问题标题】:X11: how to make a window move after another?X11:如何让一个窗口一个接一个地移动?
【发布时间】:2015-08-27 10:33:34
【问题描述】:

我有两个顶级窗口,win1 和 win2。

我想让 win2 在 win1 移动时跟随 win1,以便 win2 相对于 win1 的位置(我称之为relpos)保持不变。 IOW,粘性窗口!

我的想法是把win2移到win1的ConfigureNotify中。为此,我需要知道relpos

当 win2 被移动时,我可以在 win2 的 ConfigureNotify 中获取(并存储)relpos。

问题在于,当用户移动和以编程方式移动时,win2 都会获取 ConfigureNotify。有没有办法区分这两种情况?

如果没有,整个方法都是失败的,所以下一个问题是:还有其他方法吗?

谢谢。

注意:我不能只设置一个“moving_programmatically”标志,移动窗口然后检查 ConfigureNotify 上的标志,因为 X 是异步的(它最大的缺点之一 - 许多人认为这是一个特性)并且无法保证何时和我得到了多少个 ConfigureNotify 事件。尝试这样做,将 win1 移动得太快,看看 win2 是如何落后的。

【问题讨论】:

  • 您正在以编程方式移动它,以便您知道何时发生这种情况......
  • @n.m.是的,如果 X 像任何理智的 API(winapi/cocoa)一样是同步的,我可以这样做。我添加了一个澄清说明。
  • 如果您想知道为什么在移动子窗口(例如,使用弹性布局)时不会出现此问题,这是因为无法移动/调整子窗口的大小。由 WM 提供,仅由应用提供。
  • 我现在想知道为什么谁移动了窗口会有所不同。相对偏移量是相对偏移量,无论如何。万一它确实对你有影响,当你移动一个窗口时,你知道你移动它的哪里,所以你知道要忽略哪个 ConfigureNotify。
  • 因为当我移动 win2 时,我必须存储 relpos,但是当我移动 win1 时,我必须根据 relpos 移动 win2(这会触发 win2 的 ConfigureNotify,从而更改 relpos 等)。

标签: c linux x11 xlib xorg


【解决方案1】:

我认为您必须为此编写一个窗口管理器。您遇到麻烦的原因是您无法获得“单击 win1 标题”和“在 win1 上释放鼠标按钮”事件 - 窗口管理器在您的应用程序看到它们之前将它们吞下。有了这些事件,解决方案就很简单了:获取用户点击win1的标题栏时的相对偏移量,只在win1移动时使用这个偏移量。

其他应用程序(如 LibreOffice)通过允许将此类窗口拖到主窗口中来解决此问题(主窗口增大,子窗口成为侧面的调色板)。

【讨论】:

  • 没错,但编写 WM 并不是应用程序的解决方案。两者都不会使用 MDI(大多数用户讨厌 MDI)。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2019-05-23
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多