在Xlib中,如何在事件发生之前设置动画?

我一直在尝试使用Xlib在C程序中制作动画,我想在事件发生时做点什么,否则我想保持动画效果。 这是我目前正在做的示例代码片段:

while( 1 ) { // If an event occurs, stop and do whatever is needed. // If no event occurs, skip this if statement. if ( XEventsQueued( display, QueuedAlready ) > 0 ) { XNextEvent( display, &event ) switch ( event.type ) { // Don't do anything case Expose: while ( event.xexpose.count != 0 ) break; // Do something, when a button is pressed case ButtonPress: ... break; // Do something, when a key is pressed case KeyPress: ... break; } } animate(); // Do animation step ie change any drawings... repaint(); // Paint again with the new changes from animation... } 

所以基本上,如果用户没有点击鼠标或按下键盘上的键,我想保持循环。 当用户按下某个键或单击鼠标时,我想停止并执行特定操作。 上面代码中的问题是,每当我执行操作时它都不会停止。 如果我删除if语句,动画将阻塞直到事件发生,但我不想这样做。 这是一个简单的问题,但我对Xlib /动画有点新意,所以任何帮助都会受到高度赞赏。 谢谢。

使用ConnectionNumber(display)返回的文件描述符和select()并使用timeout参数。 如果select()返回0,则绘制更多帧。 请记住在select() XSync()之前调用XSync() ,以便X服务器获取更新。

 int fd,r; struct timeval tv; FD_SET rfds; fd=ConnectionNumber(display); FD_ZERO(&rfds); FD_SET(fd,&rfds); memset(&tv,0,sizeof(tv)); tv.tv_usec = 100000; /* delay in microseconds */ r=select(fd+1,&rfds,0,0,&tv); if(r == 0) { /* draw frame */ } else if (r < 0) { /* error; try again if errno=EINTR */ } else { /* pull events out */ }