/*!
  \page input_handle_page 入力イベントの処理

  入力イベントの扱いについて解説します。\n
  SDL では、定期的にイベント処理を行う必要があります。

  イベント処理用の関数である SDL_PollEvent() を定期的に呼ばないと、他のウィンドウが画面に重なるたびに、描画内容が崩れてしまいます。以下が \ref draw_text_page で作成したサンプルの実行中に、他のウィンドウを重ねた後の結果です。

  \image html input_handle_noupdated.png 他のウィンドウが重なり、一番下の "こんにちはー" が途切れている

  イベント処理のシンプルな例は、このようになります。
  \code
SDL_Event event;
while (SDL_PollEvent(&event)) {
  switch (event.type) {
  case SDL_QUIT:
    // !!! ウィンドウのクローズボタンや、Ctrl-c が押されたときの処理
    exit(0);
    break;

  case SDL_KEYDOWN:
    // !!! キーが押された時の処理
    break;

  case SDL_MOUSEBUTTONDOWN:
    // !!! マウスのボタンが押されたときの処理
    break;
  }
} \endcode

  一定数以上の FPS を実現するためにも \ref basic_loop_page で説明した「入力読み出し」「演算」「描画(出力)」の基本ループは短い間隔で呼ぶべきです。つまり、ゲームを演出する上で「２秒かけてフェードアウトする」という処理を実現するには、基本ループをまたいだ待機が必要になります。「基本となるループを処理しながら、一定時間待つ」といった処理を行う方法は \ref lua_coroutine_page で別途解説します。

  \n
  \section input_handler_signal_section 入力イベントのシグナル処理

  以下では、入力イベントをシグナルに変換するモジュールの実装について解説します。\n
  このモジュールの目的は、各コンポーネントが要求している入力イベントがあったか、を扱い易くすることです。

  具体的には、このモジュールにイベントを登録すると、そのイベントが発生したときにシグナルで通知される仕組みを作成します。

  \dot
  digraph network {
    InputDevice -> SdlEventHandler [label = " SDL_event ", fontsize=10]
    SdlEventHandler -> Components [label = " signal ", fontsize=10]

    InputDevice [label = " Keyboard, Mouse ", shape = box, fontsize=10];
    SdlEventHandler [label = " SDL_event ハンドラ ", fontname = default, fontsize=10];
    Components [label = " 各コンポーネント ", fontname = default, fontsize=10];
  }
  \enddot

  このモジュールが扱えるイベント、情報は以下のように定義します。

  - 登録できるイベント
    - キーが押されたか
    - キーが離されたか
    - カーソルが移動したか
    - カーソルが指定された矩形に入ったか
    - カーソルが指定された矩形から出たか

  - 適宜、取得できる情報
    - キーが押下されているか
    - カーソル位置

  この処理を用いたサンプルを以下に示します。実装には、boost の signals ライブラリを用いています。

  <a href="http://svn.sourceforge.jp/view/trunk/libs/gui/samples/handleEvent.cpp?view=co&root=qrobosdk">handleEvent.cpp</a>
  \include handleEvent.cpp

  \n
  <a href="http://svn.sourceforge.jp/view/trunk/libs/gui/Event.cpp?view=co&root=qrobosdk">CallbackEvent.cpp</a>
  \include CallbackEvent.cpp

  \n
  <a href="http://svn.sourceforge.jp/view/trunk/libs/gui/EventManager.cpp?view=co&root=qrobosdk">EventManager.cpp</a>
  \include EventManager.cpp

  \n
  <a href="http://svn.sourceforge.jp/view/trunk/libs/gui/LayerManager.cpp?view=co&root=qrobosdk">LayerManager.cpp</a>
  \dontinclude LayerManager.cpp
  \skip void updateEvent(void)
  \until }
  \line }
  \line }

  簡単ですね。\n
  signals ライブラリを用いると boost_signals ライブラリのリンクが必要になる点に注意して下さい。

  \n
  \section input_handle_comment_section コメントページ

  - http://sourceforge.jp/forum/forum.php?forum_id=18515

  \n
*/
