XNextEvent 抛出 BadAccess 错误与 ButtonPressMask
XNextEvent throw BadAccess error with ButtonPressMask
这是我的代码,我用它来实现非阻塞全局热键行为:
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/time.h>
typedef struct
{
Display *display;
Window window;
} X11Data;
void handle_focus(X11Data& x11data)
{
int revert_to_return = 0;
XGetInputFocus(x11data.display, &x11data.window, &revert_to_return);
if (x11data.window != None)
{
long EventMask = FocusChangeMask; //working
EventMask |= KeyPressMask; //working
EventMask |= PointerMotionMask; //working
//EventMask |= ButtonPressMask; //non-working, BadAccess ((
XSelectInput(x11data.display, x11data.window, EventMask);
}
}
void some_op(XEvent& ev)
{
//event processing actions
printf("type %dn", ev.type);
fflush(stdout);
}
void handle_event(X11Data& x11data)
{
XEvent ev;
XNextEvent(x11data.display, &ev);
switch (ev.type)
{
case FocusOut:
{
x11data.window = None;
break;
}
case KeyPress:
{
some_op(ev);
break;
}
case MotionNotify:
{
some_op(ev);
break;
}
case ButtonPress:
{
some_op(ev);
break;
}
default: break;
}
}
int main()
{
X11Data x11data;
x11data.display = XOpenDisplay(NULL);
x11data.window = None;
while (true)
{
if (x11data.window == None)
handle_focus(x11data);
else
handle_event(x11data);
}
return 0;
}
一切正常,除了存在ButtonPressMask标志的情况 - 在这种情况下程序停止。我假设,我可以听键盘,但不能听鼠标。那么谁知道问题的根源和/或如何解决呢?
已选择其他客户端ButtonPressMask
从协议规范:
多个客户端可以在同一窗口中选择输入;他们的 事件掩码是不相交的。生成事件时,它将 报告给所有感兴趣的客户。但是,一次只能有一个客户端 可以选择子结构重定向,一次只能有一个客户端可以 选择"调整大小重定向",并且一次只能选择一个客户端可以选择 用于按钮按下。试图违反这些限制会导致 访问错误。