米倉です。

>> ブロックを直接取るのなら、set_mouse_callbackよりもon_mouseのほ<>うが
>> いいように感じます。
>
これはメソッド名がon_mouseの方がより「Rubyらしい」ということでしょうか?

>> <>他の引数を使わないのなら、rb_scan_args()を使わなくても
>>
>> VALUE WindowClass::setMouseCallback(VALUE self)
>> {
>> VALUE block = rb_block_given_p() ? rb_block_proc() : Qnil;
>>
>> でも可能です。
>
なるほど、勉強になります。

>>void WindowClass::on_mouse(int event, int x, int y, int flags){
>>  st_data_t val;
>>  st_lookup(mousecallback, /* selfが分からない */, &val);
>>  rb_funcall((VALUE)val, rb_intern("call"), 4, INT2FIX(event), ...);
>>}
>>
>>当初このようにしてProcオブジェクトを格納しておいて、on_mouseから呼び出そ
>>うと考えたのですが、on_mouse上で呼び出し元のwindowが分からないのでできま
>>せん。
>>どなたかよい方法を思いつきませんでしょうか。
>>    
>>
>対象のwindowを渡してくれるなり調べるなりするのはOpenCVの責任で
>あってrubyとは関係ないのではないかと思いますが、例えばx,y座標か
>ら該当するwindowを調べるような関数は提供されていないのでしょう
>か。
>
># 個人的には、コールバックには追加の引数を渡せるように設計する
># ものではないかと思いますが。
>
確かにOpenCV側の責任ですね。
OpenCVのソースを読む限りではこの方法ではできそうにないので別の方法を考え
て見ます。
* 力技になりそうな予感

-- 
--------------------------------------
 [ Kanagawa University ]
 Masakazu Yonekura
 mail: kazu / goto.info.kanagawa-u.ac.jp
--------------------------------------