关于 c:X11:检测一般鼠标和键盘事件

X11: Detect general Mouse and Keyboard events

有没有办法检测鼠标是否已在 X 服务器上的任何地方移动或是否发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。

我只设法使用 GTK 在我自己的窗口中检测到事件。

感谢所有信息(不必是完整的代码,一个入口点就足够了!)


是的,您可以使用 Xinput2 扩展来执行此操作。可以在此处找到一个完整但相当小的工具,用于处理光标事件(unclutter-xfixes)。作为免责声明,我是该工具的作者。

可以在这里找到另一个很好的教程形式的资源。

使用 XInput2 有很多好处:

  • 无需不断轮询位置(资源高效)
  • 不会干扰/破坏应用程序,例如在所有窗口上选择鼠标事件。

使用Xinput2不容易得到的是准确的位置(但需要的时候可以查询),但我的理解是反正你也不需要。

一旦你加载了我不会在这里展示的扩展,你可以像这样选择所有事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
XIEventMask masks[1];
unsigned char mask[(XI_LASTEVENT + 7)/8];

memset(mask, 0, sizeof(mask));
XISetMask(mask, XI_RawMotion);
XISetMask(mask, XI_RawButtonPress);
XISetMask(mask, XI_RawKeyPress);

masks[0].deviceid = XIAllMasterDevices;
masks[0].mask_len = sizeof(mask);
masks[0].mask = mask;

XISelectEvents(display, DefaultRootWindow(display), masks, 1);
XFlush(display);

在您的事件队列中,您现在可以查找相应的事件。