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

问题描述 投票:0回答:3

有没有办法检测鼠标是否已移动到 X Server 上的任何位置或是否发生了键盘事件?我需要对用户使用 X11 输入设备执行任何操作做出反应。

我只能使用 GTK 检测到我自己的窗口上的事件。

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

c linux keyboard mouse x11
3个回答
4
投票

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

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

使用 XInput2 有多种好处:

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

使用Xinput2你容易得到的是确切的位置(但你可以在需要时查询它),但我的理解是你无论如何都不需要它。

加载扩展程序(我不会在此处显示)后,您可以选择所有事件,如下所示:

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);

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


0
投票

Ian D. Allen 关于使用 xinput 命令的回答对我来说效果很好。


-1
投票

对于现代 X11 实现,

xinput --test-xi2 --root
将显示有关根窗口上可用的所有 X11 输入事件的详细信息。 我在需要等待任何输入事件的 shell 脚本中使用它:

echo "DEBUG $(date) waiting on X event"
xinput --test-xi2 --root  | head -n 15 >/dev/null
echo "DEBUG $(date) got X event"
© www.soinside.com 2019 - 2024. All rights reserved.