X11:如何让一个窗口在另一个窗口后面移动?

3
我有两个顶级窗口win1和win2。
我想让win2在win1移动时跟随win1,以使win2相对于win1的位置(我将其称为relpos)保持不变。也就是说,实现粘性窗口!
我的想法是在win1的ConfigureNotify中移动win2。为此,我需要知道relpos。
当移动win2时,我可以在win2的ConfigureNotify中获取(并存储)relpos。
问题在于,无论是用户移动还是程序移动,win2都会收到ConfigureNotify。有没有办法区分这两种情况?
如果没有,整个方法都失败了,那么下一个问题是:还有其他方法吗?
谢谢。
注意:我不能仅设置“moving_programmatically”标志,移动窗口,然后在ConfigureNotify上检查标志,因为X是异步的(它的最大缺点之一-许多人认为这是一个特征),而且不能保证我何时以及我得到多少ConfigureNotify事件。尝试这样做并快速移动win1,看看win2如何落后。

@n.m. 是的,如果 X 像任何合理的 API(winapi/cocoa)一样是同步的,我可以这样做。我添加了一个澄清说明。 - user519179
因为当我移动win2时,我必须存储relpos,但是当我移动win1时,我必须根据relpos移动win2(这会触发win2的ConfigureNotify事件,从而改变relpos等)。 - user519179
当我移动win1时,我必须根据relpos移动win2。没错。这会触发win2的ConfigureNotify事件,从而改变relpos。也没错。等等,“etc”在哪里?它只是改变了relpos,仅此而已。你什么都没做。 - n. m.
如果您所说的方法可行,当移动win2时,您甚至不需要保存relpos,只需保存win1的先前位置并计算win1的先前位置和当前位置之间的差值,然后将win2移动该差值。这是一种更简单的解决方案,但在异步环境中仍然是错误的。 - user519179
你引用的示例与你的情况无关。你的操作都是幂等且原子的。win1 收到 ConfigureNotify 事件?移动 win2。win2 收到 ConfigureNotify 事件?更新 relpos。就这样。 - n. m.
显示剩余21条评论
1个回答

0

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

其他应用程序(如LibreOffice)通过允许将这些窗口拖入主窗口(主窗口增大,子窗口成为侧边栏)来解决此问题。


1
没错,但编写一个窗口管理器并不是应用程序的解决方案。而且采用 MDI 也不是一个好的选择(大多数用户都讨厌 MDI)。 - user519179

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接