[AquaSKK] cbnm, Component Bundle Name

閉塞感漂う Panther 対応ですが、ちょっとだけ進展がありましたので、そのご報告。

謎の cbnm

MacUIM のリソースファイル MUIM.r にあって、AquaSKK の BIM.r にないものがあります。それは、

data 'cbnm' (0) {
...
};

という箇所です。以前から気になってはいたのですが、ADC や Google で調べても手がかりがつかめなかったため、放置していました。

で、今回たまたま BIM.r にこの部分をコピペしてビルド & インストールしたところ、なんと AquaSKK でもアイコンが表示されるようになったのです!!! *1

一体全体、cbnm は何者なんでしょうか?

DeRez でダンプする

早速 Developer ツール付属の DeRez を使って「ことえり」のリソースをダンプしてみました。

% /Developer/Tools/DeRez Kotoeri.rsrc -useDF
...
data 'cbnm' (0, "Component Bundle Name", sysheap, purgeable) {
        $"1163 6F6D 2E61 7070 6C65 2E4B 6F74 6F65"            /* .com.apple.Kotoe */
        $"7269"                                               /* ri */
};
...

どうやら cbnm は「Component Bundle Name」の略で、Info.plist の CFBundleIdentifier を 16進で表現したもののようです。しかし、先頭が 0x11 で始まっているのが不可解です。これは制御文字の DC1 です。文字列の長さを表わしているわけでもないようだし、MacUIM も 0x11 で始まってます。固定のプレフィクスなんでしょうか?

cbnm の役割

今までにわかったことを材料に、cbnm の役割を推測してみます。

  1. コンポーネントマネージャがリソースファイルをロードする
  2. もし cbnm が定義されていれば、その値を取得する
  3. cbnm と一致する CFBundleIdentifier を持つ Info.plist をロードする
  4. Info.plist に定義されている入力モードとアイコンが表示される

では確認してみます。MacUIM のリソースから cbnm をコメントアウトすると... 見事アイコンがメニューに表示されなくなりました!!! Tiger では必要のないものですが、Panther では大切な働きをしていたわけですね。いずれにしても、cbnm なしではアイコン表示できないことがわかったので、BIM.r にも定義を追加することにしました。

AquaSKK のアイコン表示は?
% echo .org.ccm-software.AquaSKKInputMethod|od -x

の結果を先頭だけ 0x11 に変えて BIM.r に取り込んでみたのですが、駄目でした。自分でも期待していただけに、とても悔しい。でも、あともう少しというところまで来ていると思うので、引き続き調査してみます。それにしても、なんとも泥臭いやり方ですね。残念なことですが、開発者向けドキュメントの充実度に関しては圧倒的に Windows が勝っていると感じます。なんとか改善して欲しいところです。

ASCII/U.S. 問題

2 ちゃんねるの AquaSKK スレで ASCII モード関連の要望がたくさんありました。ASCII モードが U.S. とは違うために、いろいろと不便が生じてます。こちらもどうすれば幸せになれるか、考えてみます。

*1:この時点では、MacUIM 側の Info.plist を読んで表示していたわけですが...