c - X11:如何让一个窗口一个接一个地移动?

标签 c linux x11 xlib xorg

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

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

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

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

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

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

谢谢。

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

最佳答案

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

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

关于c - X11:如何让一个窗口一个接一个地移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247059/

相关文章:

linux - 嵌入式 Linux 许可 LGPL/GPL/等

linux - 使用 SSH 从 mac 到 linux 时没有 vim 颜色

docker - Docker 容器中的 Gstreamer 相机使用情况

c++ - X11图形编程字体

c - 该宏在什么情况下会导致错误?

c - 将数组从函数传递到 main

linux - 绘制多个文件

c# - 在 GTK# 中创建不可见窗口?

c - 我的未分配指针将指向这里什么?

c++ - "difference of memory address?"是什么意思