Как дождаться входа без остановки программы в Xlib - PullRequest
0 голосов
/ 29 октября 2019

Проблема в том, что я пишу эмулятор чипа 8 на C, и я использую библиотеку, использующую Xlib, для записи спрайтов, участвующих во вводе и т. Д., Метод, который библиотека использует для ожидания ввода, таков:

char gfx_wait(){
XEvent event;

gfx_flush();

while(1) {
    XNextEvent(gfx_display,&event);

    if(event.type==KeyPress) {
        saved_xpos = event.xkey.x;
        saved_ypos = event.xkey.y;
        return XLookupKeysym(&event.xkey,0);
    } else if(event.type==ButtonPress) {
        saved_xpos = event.xkey.x;
        saved_ypos = event.xkey.y;
        return event.xbutton.button;
    }
}

}

когда я вызываю этот метод, программа перестает ждать ввода, мне нужны методы, которые вызываются только тогда, когда я нажимаю или отпускаю кнопку.

1 Ответ

0 голосов
/ 01 ноября 2019

Я просто решаю свою проблему, используя эту функцию:

    int gfx_event_waiting(unsigned char *ch)
{
       XEvent event;

       gfx_flush();

       while (1) {
               if(XCheckMaskEvent(gfx_display,-1,&event)) {
                       if(event.type==KeyPress) {
                                *ch = XLookupKeysym(&event.xkey,0);
                               return 1;
                       }else if(event.type==KeyRelease){
                                return 1;
                        }else if (event.type==ButtonPress) {
                               return 1;
                       } else {
                               return 0;
                       }
               } else {
                       return 0;
               }
       }
}

и это главное:

    int
main(int argc, char *argv[])
{
    int x;
    int i;
    unsigned char  key_pressed,key_released;
    Init();
    LoadRom(SELECTED_ROM);
    gfx_open(WIDTH,HEIGHT,"Chip 8 Emulator");
    gfx_color(255,250,250);

    for(;;){
        if(!gfx_event_waiting(&key_pressed)){
            opcode_cycle();
            key_wait(key_released,0);

            #if DEBUG
                printf("# %d | %c #",x,key_pressed);
            #endif

            key_wait(key_pressed,1);
            key_released = key_pressed;

            gfx_clear();

            if(DrawFlag)
                Draw();

            /*Big for for simulate a delay*/
            for(i = 0; i <= 100000; i++)
                ;
        }else{
            x++;
        }
    }
}

Я уверен, что есть лучший способ сделать это, но вы знаете, это работа ...

...