Psychs 先生が、Text Input Source Services なるものが 「Leopard で追加されたらしい」とさえずっていたので、つい出来心で遊んでみることにした。Leopard で遊ぶということは、RubyCocoa で遊ぶということなので、さくっと ruby で書いてみる。
と思いきや、このモジュール、なんと Carbon だと。もう、いいよ、Carbon は。
で、とりあえず TextInputSources.Private.bridgesupport を手作業で(笑)でっちあげて、いくつか関数を実行して遊んでみた。当然ながら期待どおりにさくっと動いた。前にやった IOKit とかと違ってぜんぜんパラメータもないし、呼ぶだけ系なので楽勝。
たとえば、入力を US (というか ASCII だけれど) に変更するスクリプトは、こんな感じで書ける。
require 'osx/cocoa'
OSX.load_bridge_support_file 'TextInputSources.Private.bridgesupport'
OSX::TISSelectInputSource OSX::TISCopyCurrentASCIICapableKeyboardInputSource()
最初の二行はおまじないなので、じっしつ一行だけ。
たとえば、Terminal とか QuickSilver とか、特定のアプリがフォーカスを得た時にこのスクリプトを呼ぶようにしておけば便利。と思いきや、どうやればそうできるのかが分からない。Psychs 先生に聞いてみたら、どうやら OSX ではすべてのウィンドウのイベントをフックするとか、Windows みたいに簡単にはできないらしい。うーむ。
まあ、それはそれとして、たとえば TISGetInputSourceProperty() を使って、
p OSX::TISGetInputSourceProperty(OSX::TISCopyCurrentKeyboardInputSource(), OSX::KTISPropertyInputSourceLanguages)
みたいなことをやると、たとえば
#
みたいに表示されて、ちゃんと void* なポインタが取れてるのは分かる。なぜか allocated_size はゼロって書いてあるけど、たぶんサイズが分からないからゼロってことにしてあるだけだと思うので気にしない。実際、データは入ってて、読むことはできる。
で、この void* なポインタはキャストして使わないといけない。上の例だと、この void* なポインタは「文字列へのポインタ(CFStringRefs)の配列へのポインタ (CFArrayRef)」にキャストして使う。のだけれど、どうやってキャストするのかが分からない。って、さすがにそれは無理か。
結局、こんな Carbon あがりの半端者をむりやり RubyCocoa で使えるようにしたって、たいして嬉しくならなかったりするらしい。
ちなみに、void* なポインタを、指定されたオブジェクトだと盲目的に信じて無理矢理オブジェクトを生成して返す関数でも作ってみたらどうだろうか。とうぜん、ruby コードなのに SEGV だらけになるんだろうな。
いったい、なんのための ruby かと。冒涜するのもいい加減にしろと。
投稿者: ぼんやりと考えたこと 投稿日時: 2007年11月8日(木) 10:26- 参照(274)
- オリジナルを読む