嘿,我对X11中事件掩码的概念有点困惑,我在网上看到了很多这个概念的定义,它们似乎彼此不同,这是手动定义:
客户端选择与窗口相关的大多数事件的事件报告。为此,将事件掩码传递给Xlib事件处理函数,该函数接受event_mask参数。事件掩码的位在X11/X.h中定义。事件掩码中的每个位都映射到一个事件掩码名称,该名称描述了您希望X服务器返回到客户端应用程序的一个或多个事件。
link
我从这个定义中了解到,事件掩码是向客户端报告事件的一种方式,但在另一个定义中:
事件掩码定义客户端对此InputOutput或InputOnly窗口感兴趣的事件(或者,对于某些事件类型,是此窗口的下级(。事件掩码是零个或多个有效事件掩码位的按位"或"。您可以通过设置NoEventMask(默认值(来指定不报告可屏蔽事件。
然而,另一个定义表示,这是一种选择是在输入和输出中定义该事件,还是仅在输入中定义的方式,链接
这两个定义看起来既不同又令人困惑,那么X11中的事件掩码究竟是什么,我们为什么需要它们呢?
附言:我在SO.中没有发现类似的问题
这两个定义都是有效的,并且描述了X11生态系统中的相同功能。当您实例化X11窗口时,如果它支持来自用户的输入(即它是InputOnly
或InputOutput
窗口(,那么X服务器可以根据窗口接收到的输入向您的应用程序发送事件。这些事件描述了键盘上按下了哪个键,按下了哪个鼠标按钮等。
但是,您可能对窗口生命周期中可能出现的所有输入事件不感兴趣。例如,您可能只想响应键盘事件而不关心鼠标事件。您需要向X服务器发出信号,表示您只对给定的一组事件感兴趣,并为此使用位掩码。下面给出了一个示例,说明如何仅为给定窗口选择键盘事件。
// We are only interested in keyboard events
long event_mask = KeyPressMask | KeyReleaseMask | KeymapStateMask;
// Set the input mask for our window on the current display
XSelectInput(display, window, event_mask);