KeyRelease事件从未发送过

时间:2011-03-11 20:20:22

标签: c++ linux xlib

我在抓住一个关键的释放事件时遇到了一些问题,以阻止我的角色走进我的游戏中。

我正在尝试这样做:

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;
    }

但我只获得了重新触发的密钥发布事件,这是我不想要的。 (即使发布/重新发布会产生相同的结果,但将来可能会出现问题) 当我实际释放密钥时,不会发现任何事件。

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

2 个答案:

答案 0 :(得分:1)

注册KeyReleaseMask解决了这个问题。

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

答案 1 :(得分:1)

这是常见问题。如果您没有注册特定事件(或全部),则不会收到通知。 我们所有人,无论经历如何,都会在这一天中落下...... :)。

一些有用的链接: