タイトル【MTM2000-11 Nov】Carbonイベントの組み込みにより、効率的にMac OS X上で稼動させるカテゴリーCarbon/CF, MOSA Softwre Meeting 2000
作成日2000/11/13 13:39:30作成者新居雅行
アップルのStephen Chick氏による「Mac OS X Carbonの詳細」と題したセッションが行われた。Carbonで新しく追加されたAPIであるイベント関連やメニュー、シートの概要が説明された。
CarbonイベントモデルはCarbonLib 1.1以降でサポートされ、WaitNextEventを置き換えるネイティブのイベントモデルとなっている。従来のイベントモデルと新しいイベントモデルは共存できるので、段階的に新しいイベントモデルに移行することができる。新しいモデルは、アプリケーションの設計を簡単にし、パフォーマンスを向上し、イベントモデルを統一化するものである。新しいモデルだと、デフォルトの動作がシステム側で定義されている。今まではイベントループの処理をWaitNextEventで処理をしていた。Mac OS Xではアプリケーションごとのイベントキューとイベントループがある。たとえばマウスをクリックするとイベントが発生するが、カーネルが反応しウインドウサーバに伝達される。そして、該当するアプリケーションのイベントループに伝達され、イベントキューに入るといった流れになる。WaitNextEventはCarbonでも使え、sleep値は尊重されるが、パフォーマンスについては注意が必要になる。WNEでは、イベントを1個取ってきてイベントハンドラに送信し、キューから削除するという一連の動作をくり返す。マスクの結果を見てキューを引っ張り処理を終了する。
一方、RunApplicationEventLoopはこれを実行するとアプリケーション終了までは帰ってこない。タイマーの機能を使うことによって定期的なタスクや時間待ちなどが実現できる。イベントを管理するデータ構造であるEventRefについても解説された。イベントのターゲットはイベントを受け取るところで、通常はToolboxのオブジェクトであり、イベントハンドラをスタック形式で複数持たせることもできる。イベントのターゲットは階層化されており、階層の末端から上位のものに対して伝達される仕組みになっている。
用意されているイベントはたくさんある。マウスイベントは、マルチボタンマウスに対応しており、マウスホイールやマルチクリックにも対応している。キー入力イベントについては、今までと違ってテキスト入力に2系統ある。キー入力とText Inputイベントの2つがある。キー入力では修飾キーだけの変更も分かる。Text InputイベントはUNICODE文字が得られる。インプットメソッドの処理結果だと文字列である場合もある。これは文字列のペーストとして扱うという方法もある。TSMのイベントを置き換えるものである。Carbonイベントはダイアログボックスでも使える。WDEF、CDEFもCarbonイベントで処理する。
Carbonイベントを受け取るには、ハンドラをインストールし、パラメータを取り出し、イベントハンドラへさらに伝達を行う必要がある。イベントの伝達はeventNotHandledErrを戻すと行われる。イベントの直接送付も行える。また、イベントキューはスレッドセーフである。カーソルのトラッキングはGetMouseではなく、TrackMouseLocationを使う。TrackMouseLocationでイベント処理がなされる。タイマーはNullイベントを使うのではなく、InstallEventLoopTimeを使うが、使い終わったらRemoveEventLoopTimeで削除しておく。
Mac OS Xの特殊メニュー項目についても説明された。アプリケーションメニューに「環境設定」「隠す」「終了」がある。なお、「サービス」はCarbonでは使えない。いずれの項目も、Carbonイベントで扱うようになっている。環境設定は、メニュー項目をアクティブにして、Carbonイベントで受けるようすればよい(Appleイベントでもいい)。実際にコードを追加して、Preferencesを選択して関数が呼び出されることをデモで示した。終了についてはCarbonイベントないしはAppleイベントで処理する。その他、たくさんの特殊メニュー項目として定義されている。
シートは実際には重なった2つのウインドウとして実現されている。シートはCarbonイベントに対応している必要がある。CreateNewWindowでシートを新たに作成し、イベントハンドラを登録して、ShowSheetWindow、HideSheetWindowで表示と消去を行う。シートアラートは、CreateStandardSheetで簡単にシートを作ることができる。詳しくは、CarbonEvent.h、シートについてはMacWindows.hとDialogs.hを参照するとよい。
関連リンク