Event GUIWindow::GetNextEvent() { // Setup a temporary event and get the next X11 event Event event; XNextEvent(display, &xEvent); // See what type of event we have switch(xEvent.type) { case Expose: HandleExposeEvent(event); break; case KeyPress: HandleKeyPressEvent(event); break; case KeyRelease: HandleKeyReleaseEvent(event); break; case ButtonPress: HandleButtonPressEvent(event); break; case ButtonRelease: HandleButtonReleaseEvent(event); break; case MotionNotify: HandleMotionNotifyEvent(event); break; case ClientMessage: HandleClientMessageEvent(event); break; case ConfigureNotify: { XConfigureEvent xce = xEvent.xconfigure; // Test for resize event if(xce.width != width || xce.height != height) { width = xce.width; height = xce.height; event.eventType = evResize; event.mouseX = width; event.mouseY = height; } } break; default: HandleIgnoreEvent(event); break; } return event; }
/** Game event loop. */ void EventLoop() { struct timeval last, current; unsigned long elapsedTime; int repeat; XEvent event; SetFirstLevel(); XSelectInput(display, mainWindow, KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | ExposureMask); shouldExit = 0; DoStartDelay(); gettimeofday(&last, NULL); while(!shouldExit) { if(didWin) { WinLoop(); NextLevel(); moveRight = 0; moveLeft = 0; gettimeofday(&last, NULL); } if(didLose) { Redraw(); DoStartDelay(); break; } while(XPending(display) > 0) { XNextEvent(display, &event); switch(event.type) { case Expose: HandleExposeEvent(&event.xexpose); break; case KeyPress: HandleKeyPressEvent(&event.xkey); break; case KeyRelease: HandleKeyReleaseEvent(&event.xkey); break; case ButtonPress: HandleButtonPressEvent(); break; default: break; } } if(isPaused) { gettimeofday(&last, NULL); continue; } gettimeofday(¤t, NULL); elapsedTime = (current.tv_sec - last.tv_sec) * 1000000; elapsedTime += current.tv_usec - last.tv_usec; if(elapsedTime >= SPEED) { last = current; EraseBall(); repeat = (int)(((float)elapsedTime / SPEED) + 0.5); do { if(moveRight && !moveLeft) { MoveBallRight(); } else if(moveLeft && !moveRight) { MoveBallLeft(); } MoveBall(); --repeat; } while(repeat); DrawBall(); Redraw(); if(didDie) { didDie = 0; DoStartDelay(); gettimeofday(&last, NULL); } } } }