【发布时间】:2016-09-16 04:55:02
【问题描述】:
有没有办法检测鼠标是否在 X 服务器上的任何地方移动或发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。
我只设法使用 GTK 在我自己的窗口中检测到事件。
感谢所有信息(不必是完整的代码,入口点就足够了!)
【问题讨论】:
标签: c linux keyboard mouse x11
有没有办法检测鼠标是否在 X 服务器上的任何地方移动或发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。
我只设法使用 GTK 在我自己的窗口中检测到事件。
感谢所有信息(不必是完整的代码,入口点就足够了!)
【问题讨论】:
标签: c linux keyboard mouse x11
是的,您可以使用 Xinput2 扩展来执行此操作。可以在here (unclutter-xfixes) 找到一个完整但相当小的工具,它可以为光标事件执行此操作。作为免责声明,我是该工具的作者。
另一个很好的教程形式的资源可以找到here。
使用 XInput2 有很多好处:
你不容易使用 Xinput2 得到的是确切的位置(但你可以在需要时查询它),但我的理解是你反正不需要它。 p>
加载扩展程序后,我不会在此处显示,您可以像这样选择所有事件:
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);
在您的事件队列中,您现在可以查找相应的事件。
【讨论】:
XGetEventData 从事件中获取数据并阅读该数据含义的扩展规范。我会假设你得到了信息(deviceid),是的,但还没有看过它。我上面提到的工具 unclutter-xfixes 可以向您展示如何识别队列中的事件以及如何调用XGetEventData。之后别忘了也致电XFreeEventData。