2

3D モデリング プロジェクトでは、SDL を使用し、GTK ウィジェットに含めています ([GTKSDL] のおかげで、http ://gtksdl.sourceforge.net "GTKSDL への直接リンク")。

ウィジェットは、GTK を使用して .obj ファイルをロードし、OpenGL を使用してモデル化し、SDL ウィジェットに表示するだけです。これまでのところ、すべてが機能しています。

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

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

私は Devian を使用しています。インターネットで「GTKSdl」の実装を検索しましたが、時代遅れのようです。パッチを適用する方法はありますか?

アップデート:

私はすでに SDLPollEvent と g_idle add を使用しています。したがって、(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);
}

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

4

1 に答える 1

2

GTKSDL seems to be an alpha-quality widget created back in 2001 and never maintained (nor widely used, I think). GTK has changed a lot since then, so I'm not sure it's the best solution for you.

However, one of the problems you're facing is that you can't use an endless loop inside an event handler in GTK (and the same is true for every event-driven toolkit using a message pump I know). If you do that, you just prevent GTK from getting a chance to process the pending events. For more information on how to solve this, give a look to Embedding SDL into GTK+

UPDATE:

g_idle_add allows to specify a callback and an argument to pass to that callback (the gpointer data argument). A gpointer is merely a pointer to void. You can pass it the address of a structure to read/write if you need your callback to be aware of several parameters.

In your callback registered with g_idle_add, you may read SDL events. Don't use SDL_WaitEvent for that because it will block until an SDL event occurred, use SDL_PollEvent (retrieves a pending event if any) or SDL_PeepEvents (retrieves all pending events if any). These functions are non-blocking, they return if no event is pending, whereas SDL_WaitEvent would block until an event is received.

You may then process the events, making sure it doesn't take too long until you exit the idele handler, otherwise the GTK UI will freeze. You may also prefer to just translate these events into GTK events and just dispatch them to GTK for it to process them.

You also have an old example of SDL integration with GTK 1.2. I think most of it would work with GTK 2, the basic idea is there, just need to update the code to replace symbols that were since then deprecated in GTK.

于 2012-04-17T14:38:06.227 に答える