Событие KeyRelease никогда не отправлялось - PullRequest
0 голосов
/ 11 марта 2011

У меня небольшая проблема с обнаружением события, выпущенного ключом, чтобы помешать моему персонажу ходить по моей игре ..

Я пытаюсь сделать это:

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

НоЯ получаю только триггерные события выпуска ключей, которые мне не нужны.(даже если отпускание / повторное нажатие будет иметь тот же результат, но в будущем это может вызвать проблемы) Когда я физически отпускаю клавишу, событие не перехватывается.

oh и input-> setKey () в основном устанавливает bool в true (или false) в std :: map, ничего особенного

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Это обычная ошибка. Если вы не зарегистрируетесь для определенных событий (или всех), вы не будете уведомлены. Все мы, независимо от опыта, упадут в один прекрасный день ...:)

Некоторые полезные ссылки:

1 голос
/ 12 марта 2011

Регистрация KeyReleaseMask решила проблему.

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

...