我一直在尝试使用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 i.e. change any drawings...
repaint(); // Paint again with the new changes from animation...
}
所以基本上,如果用户没有点击鼠标或按下键盘上的键,我想保持循环。当用户按下键或单击鼠标时,我想停止并执行特定操作。上面代码中的问题是,每当我执行操作时它都不会停止。如果我删除if语句,动画将阻塞直到事件发生,但我不想这样做。这是一个简单的问题,但我对Xlib /动画有点新意,所以任何帮助都会受到高度赞赏。感谢。
答案 0 :(得分:2)
使用ConnectionNumber(display)
和select()
返回的文件描述符,并使用timeout参数。如果select()
返回0,则绘制更多帧。请务必在XSync()
之前致电select()
,以便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 */ }