タイトル小池邦人のプログラミング日記》2001/4/6<Navigation Serviceと拡張子>カテゴリーユーザインタフェース, 小池邦人のプログラミング日記
作成日2001/4/6 14:21:55作成者小池邦人
今回は、Carbonアプリケーションの開発現場から見た「Mac OS X v10.0」の問題点を指摘してみたいと思います。NibベースのCarbonアプリの解説は、ProjectBuilderのパブリックβ版からの変更点を見極めてから再開する予定です。ご了承ください。

私が利用しているMetrowerks CodeWarriorは、すでにCarbon化されていますので、Mac OS X上でNativeアプリとして起動できます。ただし、パブリックβ版以前のMac OS Xをリファレンスに開発されていることから、製品版に対する最適化がなされておらず、エディターでの文字入力が非常に遅いといった弊害も目立ちます。風の便りに聞くところによると、Mac OS X正式版をレファレンスに最適化されたCodeWarrior IDE (もしくはアップデータが)が、5月のWWDCごろまでには配布されるのではないかという噂もあります。片やProjectBuilderの方は、β版と比較すれば随分と良くなったのですが、いかんせんコンパイルスピードが遅いのがネックです。現状、Mach-OベースのCarbonアプリを開発するのなら、とりあえずCodeWarrior環境できっちりとソースコードを開発し、それをProjectBuilderに渡して再度メイクするといった手段が一番かもしれません。

さっそく自作のCarbonアプリをMac OS X上で動かしてみたところ、いくつかの問題点に遭遇しました。CarbonLibは未だ発展途上なので、バグを含めて多くの不都合があるのは認識していますが、Mac OS X 環境自身に原因が起因する問題点も多いようです。自作アプリでファイルの保存をしようとしたところ、先んじて入力されているファイル名を(例えば「名称未定義」など)deleteキーで消さないとキー入力できない現象に遭遇しました。

 

それを一度削除してしまえば、その後はちゃんと日本語入力ができます。加えて、ファイル保存が正常に終了しない場合もあるようです。Carbonアプリでファイル保存を行うには、Navigation ServiceのNavPutFile()を呼びます。ソースコードレベルで調べてみると、ファイル名を入力したにもかかわらず、それがFSSpec構造体のnameメンバー(ファイル名)に反映されず、NULLストリングス(ゼロ)が返えって来ているのが原因でした。NavPutFile()からファイル名が得られないわけですからファイル保存は正常に行えません(涙)。これは自作アプリだけの現象でなく、AppleWorks 6でも同様に起こりました。AppleWorks 6でこの現象が起こると、アプリケーション自体が異常終了してしまいます(当然だと思う)。

さらに詳しく調べてみると、NavPutFile()のダイアログが表示された時点で英語スクリプト(英語入力モード)が選択されていると、日本語ファイル名を入力しても、それがFSSpecに反映されないことが分かりました。よって日本語スクリプトに切り替えてから入力すれば、問題なく日本語ファイル名は入ります。しかし、ダイアログを抜ける前に英語スクリプトに戻してしまうと、やはりFSSpecにはファイル名が代入されていません。とりあえず、NavPutFile()を呼ぶ前にKeyScript( smKeySysScript )を実行し、強制的に日本語スクリプトに切り替えておけば事故の確率は下がります。とは言っても、ユーザがダイアログを抜ける前に英語スクリプトに切り替えてしまえば元の木阿弥です。多分Navigation Serviceのバグでしょうが、改善されるまで待てませんので、ファイル名が入っていなかったら再入力を促す処理を追加することにしました。

次は、ファイルオープン時に使うNavGetFile()についての問題点です。昔々、ファイル選択ダイアログでプレビュー表示をさせたい場合には、StandardGetFilePreview()というAPI(CarbonLibでは利用できない)を使っていました。このAPIは、選択ファイルがQuickTimeでインポートできる画像、映像、サウンドなら、特別な処理をしなくても自動でプレビューを表示してくれました。ところが、Carbon環境で使用が義務付けられているNavGetFile()は、画像ファイルにプレビューリソース(’pnot’リソース)とサムネイルデータが付加されていないとプレビュー表示ができません。Navigation Serviceのドキュメントにはちゃんと「できる」と記載されているにもかかわらずです。ただし、この制限はMac OS 9上だけであり、Mac OS XのNavGetFile()では、ちゃんとQuickTimeインポートにによるプレビュー表示が復活しています。

 

「やれ嬉や!」と喜んだのもつかの間..。NavGetFile()のダイアログで画像ファイル名をダブルクリックしてもプレビュー表示が優先され、ファイル選択が認識されない現象が起こります。この現象は、プレビュー表示に時間がかかる場合(大サイズの画像ファイル)に起こるようです。ユーザとしては、プレビューなど見る必要がなく、ダブルクリックで即座にファイルをオープンしたい時があります。現状では、プレビュー表示がファイル選択の操作性を悪くしてしまうケースがあるようです。こちらはソースレベルで解消できる問題ではないので、クリックによるプレビュー表示よりもダブルクリックによるファイル選択を優先するように、Appleに変更してもらうしかありません。また、NavGetFile()が表示するリストに、同じフォルダが二つ表示されるという問題点も見つけました。以下の例では「Users」フォルダが二つ存在してしまっています。

 

Navigation Serviceは、ファイルオープンや保存と言った非常に重要な操作に関わるモジュールですので、Appleは最優先でバグフィックスを行うべきでしょう。
(続く)
関連リンクオッティモ