Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从未发送密钥释放事件_C++_Linux_Xlib - Fatal编程技术网

C++ 从未发送密钥释放事件

C++ 从未发送密钥释放事件,c++,linux,xlib,C++,Linux,Xlib,为了阻止我的角色在游戏中行走,我在捕捉一个关键的已发布事件时遇到了一点问题 我正在尝试这样做: switch (xev.type) { case Expose: { XGetWindowAttributes(dpy, win, &gwa); glViewport(0, 0, gwa.width, gwa.height); } break; case K

为了阻止我的角色在游戏中行走,我在捕捉一个关键的已发布事件时遇到了一点问题

我正在尝试这样做:

switch (xev.type)
    {
        case Expose:
        {
            XGetWindowAttributes(dpy, win, &gwa);
            glViewport(0, 0, gwa.width, gwa.height);
        }
        break;

        case KeyPress:
            {
                int key = XLookupKeysym(&xev.xkey, 0);
                if (key == XK_Escape)
                {
                    glXMakeCurrent(dpy, None, NULL);
                    glXDestroyContext(dpy, glc);
                    XDestroyWindow(dpy, win);
                    XCloseDisplay(dpy);

                    running = false;
                    return 0;
                }
                else
                {
                    input->setKey(key, true);
                }
            }
            break;

        case KeyRelease:
            {
                unsigned short is_retriggered = 0;

                if (XEventsQueued(dpy, QueuedAfterReading))
                {
                    XEvent nev;
                    XPeekEvent(dpy, &nev);

                    if (nev.type == KeyPress && nev.xkey.time
                            == xev.xkey.time && nev.xkey.keycode
                            == xev.xkey.keycode)
                    {
                        // delete retriggered KeyPress event
                        XNextEvent(dpy, &xev);
                        is_retriggered = 1;
                    }
                }

                if (!is_retriggered)
                    input->setKey(XLookupKeysym(&xev.xkey, 0), false);
            }
            break;
    }
但我只得到重新触发的密钥释放事件,这是我不想要的。(尽管发布/重新发布会产生相同的结果,但将来可能会出现问题) 当我实际释放钥匙时,不会捕获任何事件


哦,输入->设置键()基本上在std::map中将bool设置为true(或false),没有什么特别的

注册KeyReleaseMask解决了这个问题


XSelectInput(dis、win、按键掩码|按键释放掩码)

这是一个常见的问题。如果您没有注册特定事件(或全部),您将不会收到通知。 我们所有人,不管经历如何,总有一天会坠入爱河……:)

一些有用的链接:


您是否在应用程序中正确注册了所需的事件(
XISelectEvents
如果您使用的是XI2)?这就解决了问题,谢谢:)