テキストサービスにまつわるあれやこれや
ひ日誌のコンテキストメニューに項目追加したいに反応して調べてみた。選択した文字列についてのコンテキストメニューを追加する手段について。
まずは Cocoa 使いとして考えるのは、
- これって NSTextView の機能なんだ(たぶん)からコイツを拡張してやればいいんだよな
- NSTextView の menuForEvent: をポージングや AspectCocoa などの方法で拡張してやればいいよな
ということ。ちなみに EditCast の ECTTextView がポージングによる拡張を採用している。
でも、この手段には InputManager などの方法で拡張用のコードをロードさせる必要がある、というめんどくささ満点の欠点がある。そもそも OS の標準的な手法として、「/System/Library や /Library になんかバンドルを置いとけばいい」というようなものはないのか?と探索したものの頓挫。
で、コード側からのアプローチとして WebKit のソースコードを見てみると、すっごく地道に書いてある。コンテキストメニュー個別に実装かよ!Carbon 系の関数で一発、みたいのを期待していたのに。
というわけで、簡単に拡張する方法は見つからなかった。
ただ WebKit のコード見ていて NSPerformeService() 関数 を知ったのは収穫。これはプログラムからサービスメニューを呼び出すことのでき関数だ。サービスに渡すデータを NSPasteboard で用意しないといけないのがやや手間がかかるものの、活用次第ではいけそう。
サービスメニューはなあ、カスタマイズが弱いのが難点。試しにインストールしたアプリケーションなんかはいらないのだ。