如何在不停止Xlib中程序的情况下等待输入

时间:2019-10-29 18:46:10

标签: c xlib chip-8

问题是这样的,我正在用C语言编写一个芯片8模拟器,并且我正在使用一个使用Xlib的库,用于编写出席输入的精灵等,该库具有等待输入的方法是这样的: / p>

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 :(得分:0)

我只是使用此功能解决了我的问题:

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

我敢肯定,这样做有更好的方法,但是您知道,这是可行的...