【问题标题】:KeyRelease event never sent从未发送过 KeyRelease 事件
【发布时间】:2011-03-14 19:06:52
【问题描述】:

我在捕捉一个关键释放事件以阻止我的角色在我的游戏中行走时遇到了一点问题..

我正在尝试这样做:

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

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

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

【问题讨论】:

  • 您是否在应用程序中正确注册了所需的事件(XISelectEvents,如果您使用的是 XI2)?
  • 修复了,谢谢:)

标签: c++ linux xlib


【解决方案1】:

这是一个常见的问题。如果您不注册特定事件(或全部),您将不会收到通知。 我们所有人,无论经历如何,总有一天会陷入这种境地...... :)

一些有用的链接:

【讨论】:

    【解决方案2】:

    注册 KeyReleaseMask 解决了这个问题。

    XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多