我正在尝试写一个游戏插件,我需要读取鼠标按钮的状态,而不是阻止或“吃掉”事件。直接阅读/dev/input不是一个选项,因为根访问。我更接近我需要的是下面的代码:
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
int main (int argc, char **argv)
{
Display *display;
XEvent ev;
display = XOpenDisplay(NULL);
Window window = RootWindow(display, XDefaultScreen(display));
XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask);
XGrabButton(display, Button1, AnyModifier, window, False, ButtonPressMask | ButtonReleaseMask, GrabModeSync, GrabModeAsync, None, None);
while(1) {
XAllowEvents(display, ReplayPointer, CurrentTime);
if(XCheckTypedEvent(display, ButtonPress ,&ev))
{
printf("Button pressed\n");
}
else if(XCheckTypedEvent(display, ButtonRelease ,&ev))
{
printf("Button relised\n");
}
}
return 0;
}
问题是,通过设置GrabModeSync并使用XAllowEvents和ReplayPointer,我可以传递事件,但我只得到ButtonPress。ButtonRelease从未被捕获,但我需要它。GrabModeAsync捕获两个事件,但“吃掉”点击。有人能建议一个解决方案吗?10 x
2条答案
按热度按时间ux6nzvsh1#
对于任何人谁可能会绊倒到这个职位,而寻找类似的问题解决方案,这里是什么为我工作.
fnx2tebb2#
谢谢你的解决方案,但它沉重地加载了我的处理器。所以我发现它是如何在
xinput test
命令:https://github.com/freedesktop/xorg-xinput/blob/master/src/test.c