きりかノート 3冊め

おあそびプログラミング

テキストサービスにまつわるあれやこれや

ひ日誌のコンテキストメニューに項目追加したいに反応して調べてみた。選択した文字列についてのコンテキストメニューを追加する手段について。

まずは Cocoa 使いとして考えるのは、

  • これって NSTextView の機能なんだ(たぶん)からコイツを拡張してやればいいんだよな
  • NSTextView の menuForEvent: をポージングや AspectCocoa などの方法で拡張してやればいいよな

ということ。ちなみに EditCast の ECTTextView がポージングによる拡張を採用している。

でも、この手段には InputManager などの方法で拡張用のコードをロードさせる必要がある、というめんどくささ満点の欠点がある。そもそも OS の標準的な手法として、「/System/Library や /Library になんかバンドルを置いとけばいい」というようなものはないのか?と探索したものの頓挫。

で、コード側からのアプローチとして WebKitソースコードを見てみると、すっごく地道に書いてある。コンテキストメニュー個別に実装かよ!Carbon 系の関数で一発、みたいのを期待していたのに。

というわけで、簡単に拡張する方法は見つからなかった。

ただ WebKit のコード見ていて NSPerformeService() 関数 を知ったのは収穫。これはプログラムからサービスメニューを呼び出すことのでき関数だ。サービスに渡すデータを NSPasteboard で用意しないといけないのがやや手間がかかるものの、活用次第ではいけそう。

サービスメニューはなあ、カスタマイズが弱いのが難点。試しにインストールしたアプリケーションなんかはいらないのだ。