XNextEvent 抛出 BadAccess 错误与 ButtonPressMask

XNextEvent throw BadAccess error with ButtonPressMask

本文关键字:ButtonPressMask 错误 BadAccess 抛出 XNextEvent      更新时间:2023-10-16

这是我的代码,我用它来实现非阻塞全局热键行为:

#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

从协议规范:

多个客户端可以在同一窗口中选择输入;他们的 事件掩码是不相交的。生成事件时,它将 报告给所有感兴趣的客户。但是,一次只能有一个客户端 可以选择子结构重定向,一次只能有一个客户端可以 选择"调整大小重定向",并且一次只能选择一个客户端可以选择 用于按钮按下。试图违反这些限制会导致 访问错误。