2012-04-17 21 views
2

私はSDLを使用しており、GTKウィジェット([GTKSDL]、http://gtksdl.sourceforge.net「GTKSDLへのダイレクトリンク」のおかげで)を使用しています。GTKSDL - イベントの処理

ウィジェットはGTKで.objファイルを読み込んでOpenGLでモデリングしてSDLウィジェットに表示するだけです。 これまでのところ、すべてが機能しています。

SDLイベントを使用してウィジェット内のオブジェクトを移動しようとすると問題が発生します。 GTKにSDLウィンドウを統合する前に、イベントは問題なく動作していました。 また、いったん3Dモデルが表示されると、SDLのイベントループが何かを待っているように見えるので、私はGTKとやりとりすることができません。

私は2つのイベントループをフォークすることを考えましたが、GTKとSDLが同時にXサーバーにアクセスしようとしているようで、複数の競合が発生するようです。 私はSDLで無限ループを削除しようとしましたが、動作しません。

私はデビアンにいるので、私は "GTKSdl"の実装をインターネットで検索しましたが、それは時代遅れです。

UPDATE:

私はすでにSDLPollEventとg_idleアドオンを使用しています。私は(GTKとの)ファイルを選びました後 だから右、私は、構造体「t_stage」を記入し、g_idle_add使用:

g_idle_add((GSourceFunc) &mainloop, stage); 


gboolean   mainloop(t_stage *stage) 
{ 
    SDL_Event  evt; 

    while (SDL_PollEvent(&evt) != 0) 
    { 
     if (evt.type == SDL_MOUSEBUTTONDOWN) 
     on_mouse_down(stage, &(evt.button)); 
     else if (evt.type == SDL_MOUSEBUTTONUP) 
     on_mouse_up(stage, &(evt.button)); 
     else if (evt.type == SDL_MOUSEMOTION) 
     on_mouse_move(stage, &(evt.motion)); 
     else if (evt.type == SDL_KEYDOWN) 
     handle_key(stage, evt.key.keysym.sym, 1); 
     else if (evt.type == SDL_KEYUP) 
     handle_key(stage, evt.key.keysym.sym, 0); 
    } 
    apply_keys(stage); 
    draw(stage, 0); 
    return (1); 
} 

をしかし、イベントがまだ受信されません。何か案は ?

答えて

2

GTKSDLは、2001年に作成されたアルファ品質のウィジェットであり、決して維持されていない(広く使われているとは思えません)。それ以来GTKは大きく変わってしまったので、それがあなたにとって最善の解決策であるかどうかはわかりません。

しかし、あなたが直面している問題の一つは、あなたがGTKにイベントハンドラ内で無限ループを使用することができないということです(と同じことが、私が知っているメッセージポンプを使用して、すべてのイベント駆動型のツールキットについても同様です)。これを行うと、GTKが保留中のイベントを処理する機会を得ることができなくなります。この問題を解決する方法の詳細については、Embedding SDL into GTK+

に表情を与えるUPDATE:

g_idle_addコールバックし、そのコールバック(gpointer data引数)に渡す引数を指定することができます。 gpointerは単なるvoidへのポインタです。コールバックでいくつかのパラメータを認識する必要がある場合は、読み書きする構造体のアドレスを渡すことができます。

g_idle_addで登録されたコールバックでは、SDLイベントを読み取ることができます。 SDL_WaitEventは、SDLイベントが発生するまでブロックされるため、SDL_PollEvent(存在する場合は保留イベントを取得)またはSDL_PeepEvents(存在する場合はすべての保留イベントを取得)を使用しないでください。これらの関数はノンブロッキングで、イベントが保留されていない場合は戻されますが、SDL_WaitEventはイベントが受信されるまでブロックされます。

その後、イベントを処理して、イデールハンドラを終了するまで時間がかかりすぎないようにしてください。そうしないと、GTK UIがフリーズします。また、これらのイベントをGTKイベントに変換し、GTKイベントを処理するためにそれらをGTKにディスパッチすることもできます。

また、古いexample of SDL integration with GTK 1.2があります。私はそれのほとんどがGTK 2で動作すると考えています。基本的な考え方はGTKで廃止されたシンボルを置き換えるコードを更新する必要があります。

+0

g_idle_addはソリューションのようですが、g_idle_addによって呼び出される関数はgPointerデータのパラメータとしてのみ使用されるため、SDLイベントをどのように扱うことができますか? –

+0

私はあなたにそれが通知されているかどうか分からない、私は物事をより明確にするために私の答えに更新を加えた。 – liberforce

+0

私はすでにSDLPollEventとg_idle addを使用しています。 ファイルを選択した直後に、構造体 "t_stage"を埋め込み、g_idle_addを使用します: g_idle_add((GSourceFunc)&mainloop、stage); ここにプロトタイプがあります: void mainloop(t_stage * stage) しかしイベントはまだ受信されません。何か案は ? –