LINUX.ORG.RU

Опрос клавиатуры.


0

0

Такая вот проблема:
Мне надо каким-то образом получить состояние клавиш.
Причем всех и сразу. Ну , допустим, не всех но многих.
Причем не только факт нажатия, но факт отпускания.

Когда писал под DOS, то для таких целей писал свой обработчик
клавиатурного прерывания.

А как это делается в Linux?
Ткните плиз носом что почитать, или просто киньне кусок Сишного кода.

P.S. Под Линукс писал только серверы, а тут заинтересовался
openGL и захотел написать простенькую игрушку. Ну понятно, что без
клавы никуда...

★★☆

Используйте SDL или GLUT. В вашем случае достаточно GLUT, но он не умеет джойстики. Если же джойстик важен, то ваш выбор SDL.

andreyu ★★★★★
()
Ответ на: комментарий от Valeriy_Onuchin

> если GL внутри Xго окна, то всё делается через "man XGrabKeyboard"

Не портабельно. Даже если сегодня вам это приложение нужно только под Linux, то нет гарантий в том, что завтра не понадобится перенести его на другую платформу.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Спасибо!

Я, наивный, думал что GLUT -- мелкая глючная либа для
идиотов, пытащихся разобраться с openGL.
Такое впечатление сложилось из-за кучи статей по GLUT, которые 
ограничиваются лишь созданием окна с "Hello world!" заголовком.

А это оказывается.... ну круто в общем....
Спасибо за инфу.

Stahl ★★☆
() автор топика

я делал следующим образом:
  - окно создавал на X11
  - обработчик сообщений выделил в отдельный поток

ниже - нарезка кода, которая касается клавиатуры

#include <X11/X.h>
#include <X11/keysym.h>
#include <X11/Xlib.h>

#include <pthread.h>

...

bool keys[256];
bool gamover;

Dispplay *dpy; //контекст окна, с которым работаете

...

//обработка нажатий
void processKeyboard() {
    gameover = keys[XKeysymToKeycode(dpy, XK_Escape)];
}

//регистрация нажатий
void *Key_Calling (void *arg){
    XEvent event;
    while (!gameover) {
            do {
            XNextEvent(dpy, &event);
            switch (event.type) {
            //тут всякие события X11
            case KeyPress: {
                controls.keys[event.xkey.keycode] = 1;
                break;
            }
            case KeyRelease: {
                controls.keys[event.xkey.keycode] = 0;
                break;
            }
            default:
                break;
            }

        } while (XPending(dpy));

    }
}

int main() {
    
    gameover = 0;
    for (int i = 0; i < 256; controls.keys[i++] = 0);

    /*
        тут создаем окно 
    */

    ///запуск функции регистрации событий в отдельный поток
    pthread_t thread_id;
    pthread_create (&thread_id, NULL, Key_Calling, NULL);


    while (!gameover) {
        //обработать клавиши
        processKeyboard();
	//отрисовать окно
        drawGLScene();
    }

    //останов всех дополнительных потоков
    pthread_exit(NULL);

    return 0;
}

dimass
()
Ответ на: комментарий от dimass

> - обработчик сообщений выделил в отдельный поток

А зачем в отдельный поток? Желаете замучать пользователя лагами?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

если не выделять в отдельный поток, то пока не получатся все сообщения от иксов, не будет отрисовываться сцена.

это подобно регистрации обработчика сообщений/событий в оффтопике

dimass
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.