X11:检测一般的鼠标和键盘事件
X11: Detect general Mouse and Keyboard events
有没有办法检测鼠标是否已在 X 服务器上的任何位置移动或是否发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。
我只能使用 GTK window 自己检测事件。
感谢每一个信息(不一定要是完整的代码,一个入口点就足够了!)
是的,您可以使用 Xinput2 扩展来执行此操作。可以找到一个完整但相当小的工具来为游标事件执行此操作 here (unclutter-xfixes)。作为免责声明,我是该工具的作者。
可以找到另一个教程形式的好资源 here。
使用 XInput2 有很多好处:
- 无需不断轮询位置(资源高效)
- 不会干扰/中断应用程序,例如 select 在所有 windows 上使用鼠标事件。
你不会使用Xinput2很容易得到的是准确的位置(但你可以在需要时查询它),但我的理解是你不需要无论如何。
一旦你加载了我不会在这里展示的扩展,你可以select所有这样的事件:
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);
在您的事件队列中,您现在可以查找相应的事件。
对于现代 X11 实现,xinput --test-xi2 --root
将显示有关根 window 上可用的所有 X11 输入事件的详细信息。我在需要等待任何输入事件的 shell 脚本中使用它:
echo "DEBUG $(date) waiting on X event"
xinput --test-xi2 --root | head -n 15 >/dev/null
echo "DEBUG $(date) got X event"
有没有办法检测鼠标是否已在 X 服务器上的任何位置移动或是否发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。
我只能使用 GTK window 自己检测事件。
感谢每一个信息(不一定要是完整的代码,一个入口点就足够了!)
是的,您可以使用 Xinput2 扩展来执行此操作。可以找到一个完整但相当小的工具来为游标事件执行此操作 here (unclutter-xfixes)。作为免责声明,我是该工具的作者。
可以找到另一个教程形式的好资源 here。
使用 XInput2 有很多好处:
- 无需不断轮询位置(资源高效)
- 不会干扰/中断应用程序,例如 select 在所有 windows 上使用鼠标事件。
你不会使用Xinput2很容易得到的是准确的位置(但你可以在需要时查询它),但我的理解是你不需要无论如何。
一旦你加载了我不会在这里展示的扩展,你可以select所有这样的事件:
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);
在您的事件队列中,您现在可以查找相应的事件。
对于现代 X11 实现,xinput --test-xi2 --root
将显示有关根 window 上可用的所有 X11 输入事件的详细信息。我在需要等待任何输入事件的 shell 脚本中使用它:
echo "DEBUG $(date) waiting on X event"
xinput --test-xi2 --root | head -n 15 >/dev/null
echo "DEBUG $(date) got X event"