gpt4 book ai didi

c++ - X11 MotionNotify 事件不会出现在单独的共享库中?

转载 作者:太空宇宙 更新时间:2023-11-04 14:18:57 25 4
gpt4 key购买 nike

我有两个共享库:一个用于设置窗口并使用 opengl 渲染它们,另一个单独的输入库为在渲染库中创建的窗口收集鼠标和键盘输入。

现在,我可以在渲染库中正常接收事件,比如鼠标、键盘等事件。我还可以在输入库中获取按键事件,但不会发送鼠标事件。我设置了一个调试输出,它显示了 XPending() 的返回值,即。队列中的事件数量,在渲染库中它显示了一堆事件。移动鼠标或单击它会导致更多事件排队。在输入库中,我也有调试输出。当按下/释放一个键时,键盘仅显示 1 个事件,否则为零。然而,鼠标始终显示零事件。

为了获得我的 X 窗口句柄,我的窗口类中有一个函数返回一个 64 位整数,它足够大以包含 X11 和 Windows 上的窗口句柄(因为我的库是跨平台的)。在输入库中,我将其转换回 X 窗口句柄。为了获得我的 X 显示,我在鼠标/键盘构造函数中调用了 XOpenDisplay(0)

那么为什么我在渲染库中获得鼠标事件,但在我的输入库中却没有?

编辑:Here是显示问题的源代码(~200 行代码)

最佳答案

打开多个显示会使事情变得棘手。在这种情况下,您有多个独立的套接字和命令/事件流到 X 服务器,并且您在 X 服务器看来是多个不同的应用程序(不同的客户端)。

请求处理和事件的顺序未在两个不同的连接中定义。例如,如果用户按下一个键然后移动鼠标,您将在相同的显示器上按该顺序获得那些,但在两个不同的显示器上以任一顺序获得。

像这样的设置中的一个技巧是,在您使用 XSync() 之前,您在一个显示器上创建的任何 X 资源(窗口、GC 等)不一定对另一个显示器连接可见。这是因为 ID 是在客户端创建的,然后刷新到 X 服务器。 XSync() 会刷新资源创建请求并确保 X 服务器已处理该请求。 (更准确地说:任何往返请求 - 必须等待回复的请求 - 都会执行此操作;XSync 在内部只执行 XGetInputFocus() ,这是一个任意选择的往返请求。所以如果你知道哪些请求是往返,您不必在这些之后进行同步。)

指针和键盘抓取也很棘手。 grab 将指针或键盘锁定到特定连接。因此,无论何时您抓取,您的其他显示器都不会获得抓取涵盖的事件,直到您取消抓取。

XGrabServer() 更加棘手;此请求要求 X 服务器停止处理请求并为所有显示发送事件,但带有服务器抓取的显示除外。因此,如果您的一个 Display 占用了服务器,任何使用另一个 Display 的尝试都可能会锁定您的程序。

最后,您的输入掩码(此处传递给 XCreateWindow,但请参阅 XSelectInput)是针对每个显示连接的。我认为这可能是您的实际问题;您的某些 Display 尚未在窗口上请求所需的事件。但我没有验证这一点。

我建议调用 XOpenDisplay() 一次,然后将单个显示传递给您的各种其他代码。这将使事情变得不那么棘手,甚至可能解决问题。

关于c++ - X11 MotionNotify 事件不会出现在单独的共享库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com