ウインドウに絵や文字を書くのはウインドウシステムの機能の半分にすぎま せん。ウインドウシステムの最も重要な側面は描かれた絵や文字(メニューや ボタン)に対して応答したりマウスなどを使って描画のための情報である座標 などをプログラムに送ることです。これらのことはプログラム側で予測して手 順を決めることが出来ません。次にユーザがキーボードキーを押すのかマウス を動かすのかプログラム側からは予測が出来ないからです。そのためウインド ウシステムのプログラムは必然的にイベント駆動型になります。初期化の段階 で起こりうるイベントのそれぞれに処理手順を割り当てておき、実行段階では イベントが起こるとそれに対応する手順を呼び出すメカニズムに制御をまかせ ます。この場合、処理のための関数を定義しておき、それぞれのイベントごと に関数を割り当てて処理をさせます。この、処理をするための関数をコールバッ ク関数と呼びます。そしてプログラム本流はコールバックを呼び出すためのディ スパッチルーチンに入ります。イベントが起こるのを待つ無限ループです。こ のようにXウインドウのプログラムは、コールバック関数の定義と、メインルー チンの中でのコールバック関数の登録、そして無限ループになるディスパッチ ルーチンの呼び出しの3つの部分でつきることになります。
XEvent event; while( 1 ) { XNextEvent( display, &event ); switch( event.type ) { case Expose: expose_action( ); break; case EnterNotify: enter_notify_action( ); break; case LeaveNotify: leave_notify_action( ); break; case ButtonPress: button_press_action( ); break; case ButtonRelease: button_release_action( ); break; case KeyPress: key_press_action( ); break; } }
それぞれのイベントについて処理手続き(上の例ではxxxx_action)を書いてや る必要があります。ボタンが押されたときはその時のポインターの座標を調べ てそれがメニューの中であればその項目に対応した処理を実行することになり ます。このようにして書いていくと非常に煩雑なプログラムになることはあき らかです。それらの問題を解決してくれるのがXt Intrinsicsという上位関数 ライブラリーであるわけです。ここではXtでもイベント情報のやりとりには XEvent構造体を使うということだけ覚えておいてください。