2

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 /アニメーションに少し慣れていないので、助けていただければ幸いです。ありがとう。

4

1 に答える 1

2

ConnectionNumber(display)withによって返されたファイル記述子select()を使用し、timeout引数を使用します。0を返す場合select()は、さらにいくつかのフレームを描画します。Xサーバーが更新を取得できるように、XSync()必ず前に電話してください。select()

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 */ }
于 2010-05-22T19:18:45.197 に答える