有没有办法检测鼠标是否已移动到 X Server 上的任何位置或是否发生了键盘事件?我需要对用户使用 X11 输入设备执行任何操作做出反应。
我只能使用 GTK 检测到我自己的窗口上的事件。
我感谢每一个信息(它不必是完整的代码,入口点就足够了!)
是的,您可以使用 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);
在事件队列中,您现在可以查找相应的事件。
Ian D. Allen 关于使用 xinput 命令的回答对我来说效果很好。
对于现代 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"