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

时间:2010-05-22 19:09:43

标签: c animation 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 i.e. change any drawings...
    repaint(); // Paint again with the new changes from animation...
}

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

1 个答案:

答案 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 */ }