Intel Mac 対応のポイント

3.0 で Intel Mac に対応しましたが、コーディング上のポイントを簡単にまとめておきます。AquaSKK はアプリケーションに密着して動作するコンポーネント部分と、それらとメッセージ通信して変換などを行なうサーバー部分に大きくわかれています。

1. コンポーネントの対応

まずコンポーネントですが、Universal Binary としてビルドすることに加えて、'thng' Resource に動作プラットフォームを適切に記述する必要がありました。
http://developer.apple.com/technotes/tn/tn2012.html

2. 変換サーバーの対応

こちらは単純に Universal Binary としてビルドすればいいと踏んでいたのですが、意外と苦戦しました。最初に躓いたのが、キーボードレイアウト毎に用意されたアイコンを IconRef から NSImage に変換するところです。google 樣にお尋ねして、よりポータブルな方法で対応しました。

3. メッセージ通信の対応

コンポーネントと変換サーバーとの通信には、Mach Port を利用しています。通信するメッセージには整数というか、生の数値も含まれますが、これが、Rosetta 経由のアプリケーションと通信する時にエンディアンの問題を引き起こしていました。なので、通信中のメッセージは全てビッグエンディアンに統一しています。

ただし、文字列に関しては CFString の外部表現*1を使うことで、同一エンディアン同士の通信では余計な変換が発生しないようにしています。

4. ことえり辞書の対応

Intel Mac で全く検索ができない状態になりました。問題は検索キーのエンディアンでしたので、こちらもビッグエンディアンに統一しています。変換結果については、CFString の外部表現で受け取るようにしました。

5. ペーストの対応

やはり Rosetta 経由のアプリケーションではうまくペーストできなくなりました。エンディアンの問題を解決するために、Scrap Manager から Pasteboard Manager に移行しました。

6. その他

Universal Binary とは関係がありませんが、環境設定を全面的に Cocoa Bindings に移行しました。個人的にはかなりスッキリ ;-)


こうしてみると結構ありますね。まあなんにせよ、ようやく一息できました。ただちょっと気になるのが、Panther 用の回避コードが少しずつ増えてきていることです。


次のリリースに向けては、細かな使い勝手の向上に主眼を置きつつ、リファクタリングも同時平行させていく予定です。見た目の変化は少なくても、中身は随分激しく変わりそうな予感があります。自動ダイナミック補完に向けての下地作りという重要な役目もあるので、じっくり取り組んで行きたいです。

*1:文字列の先頭にエンディアン判定用の BOM(Byte Order Mark) が付加された形式