タイトル【MacWIRE配信予定】小池邦人のプログラミング日記》2002/1/23<Dockのからメニューをポップアップさせる>カテゴリーユーザインタフェース, Carbon/CF, 小池邦人のプログラミング日記
作成日2002/1/23 11:4:48作成者新居雅行
今回から、何回かに分けて、Carbonアプリケーションから利用できるMac OS X 10.1特有の機能を紹介したいと思います。まずは、Mac OS X 10.1に搭載されているDock Managerを活用してみます。最初は、アプリケーションが起動するとDockから利用できるようになる、Dockメニューについての解説です。

最近、Macintoshのハードウェア方面は、新機種発表などで活気があるのですが、システムを含めたソフトウェア方面に関しては、随分と静かな日々が続いております(笑)。CarbonLibの新しいバージョンも登場していませんし、Mac SO X 10.2についての噂もすっかり途絶えてしまいました。3月のMACWORLD Expo/TokyoでのMac OS X 10.2発表は、ちょっと無理でしょうか(紹介ぐらいあると嬉しい)。この調子だと、正式発表はWWDC 2002という事になりそうです。ソフトウェアと同様に、CarbonやMac OS Xに関する新しいドキュメントの登場も、今年になってピタリと止まってしまい、まったく進展がありません。

Dock Managerについての参考資料は、昨年の8月に登録された2つPDFドキュメントが最後です。それらは、以下のApple Carbon Documentサイトからダウンロードすることができます。

◇Dock Manager
 http://developer.apple.com/techpubs/macosx/Carbon/HumanInterfaceToolbox/DockManager/dockmanager.html

そのうちの「Customizing Your Application Dock Tile」は、20ページのドキュメントで、もう片方の「Dock Manager Reference」は、わずか10ページのドキュメントです。「Customizing Your Application Dock Tile」の方には、Dockのタイル(何故だかアイコンとは呼ばない)上に画像を描画する方法や、その上部にアプリケーション固有のメニューをポップアップさせる方法などが詳しく解説されています。「Dock Manager Reference」の方は、そうした仕組みを提供するために使われる、Dock Manager API(全部で10種類)の引数の意味や使用方法などが解説されています。

特別な用意をしていないアプリケーションの場合には、以下の様なDockメニューが表示します。

 

アプリケーションがDockに未登録であれば、「Finderに表示する」という項目の上に「Dockに保存する」という項目が追加されます。メニューの最上部には、現在アプリケーションでオープンされているウィンドウのタイトルが並び、それを選択することでウィンドウの切り替えを行えます。この仕組みは、システムのウィンドウメニューが提供している機能と同等です。アプリケーションは、このタイトル項目の下に、独自のメニュー項目を追加することが可能なわけです。

アプリケーションのメニュー構築に、"MENU’リソースを利用している場合には、Dock ManagerのSetApplicationDockTileMenu() APIを使えば、簡単にDockメニューを作成することができます。

 

上記のsetUpMenu()ルーチンでは、メニューバーを構築した後に、ID=131番の"MENU’リソースを呼び込み、その最初の項目にチェックマークを付けてから、SetApplicationDockTileMenu()でDockメニューとして登録しています。ですから、このアプリケーションでは、ウィンドウメニューの左側のメニューとまったく同じ内容の物が、そのままDockメニューに利用されるわけです。

 

では、Dockメニューが選択された時の処理は、どのように記述したら良いのでしょうか?これは、通常のメニュー処理とまったく同じです。‘xmnu’リソースに各メニュー項目のコマンドID(OSType)を登録しておき、それをCarbon Event Handlerで受け取って処理を分岐させます。今回のように、メニューバーのメニューの一部をDockメニューとして再利用している場合には、処理はどちらも同じですので、Dockメニュー用に特別な処理を記述する必要はありません。

次に、アプリケーションがNibファイルからメニューを構築している場合についてです。まず、Interface Builderを起動し、「DockMenu」という名称のメニューオブジェクトを作成します。各メニュー項目には、InfoウィンドウでコマンドIDを割り当てておくことを忘れないでください。

 

メニューオブジェクトが完成したら、そのNibファイルに「DockMenu.nib」と名称を付け保存します。その後、Project Builderを起動させ、保存しておいたNibファイルをプロジェクトウィンドウの「Resources」グループに登録します。

 

続いて、プロジェクトウィンドウからファイルリスト右側の「ターゲット」ダブを選び、アプリケーションと同じのターゲット名をクリックします。すると、ウィンドウの右側にターゲットに対して各種設定をするためのダイアログが表示されます。そこの「アプリケーション設定」ダブを選んで、右上部の「詳細設定」ボタンをクリックします。

 

そこには、アプリケーションバンドルに含まれる「Info.plist」(XMLテキスト)の内容が表示されています。そこで、プロパティリスト「AppleDockMenu」、クラス「文字列」、値「DockMenu」を一行追加します。値として代入する「DockMenu」が、自動で読み込まれるNibファイルの名称なのですが、「.nib」の拡張子部分は省略します。設定が終了したら、アプリケーションをメイクして起動させると、Nibファイルで保存しておいたメニューをDockメニューとして利用できます。メニュー選択による処理の実行は、SetApplicationDockTileMenu() の場合とまったく同じで、メニュー項目に付けたコマンドIDを認識してCarbon Event Handllerで行います。

 

アプリケーションの状況により、メニュー項目の内容を差し替えたい場合には、イベントクラスがkEventClassApplicationで、イベント種類がkEventAppGetDockTileMenuでのCarbonイベントを受け取った時点で処理するのが便利です。このイベントは、ユーザがDockでメニューを表示した場合に発生します。以下は、そのEvent Handlerルーチンの一部です。

 

ここでは、強制的にID=131番のメニューへと内容を差し替えています。差し替えるMenuRefの値は、SetEventParameter()ルーチンでシステムに渡してやればOKです。

次回は、Dockのタイル上に、オリジナルの図形や画像を描画する方法の話です。Mac OS X 10.1付属のMailアプリケーションが、未読メール数をDockタイルに表示していますが、あの機能を実現している仕組みについて解説する予定です。
[小池邦人/オッティモ]
関連リンクオッティモ