なかだです。

At Sat, 14 Aug 2004 10:15:39 +0900,
米倉正和 wrote in [ruby-ext:02292]:
> これをRubyでWrapして
> 
> window = OpenCV::GUI::Window.new "window name", 0
> window.set_mouse_callback{|event, x, y, flags|
>    ...
> }

ブロックを直接取るのなら、set_mouse_callbackよりもon_mouseのほ
うがいいように感じます。

> st_table *WindowClass::mousecallback = st_init_numtable();
> 
> VALUE WindowClass::setMouseCallback(int argc, VALUE *argv, VALUE self){

他の引数を使わないのなら、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を調べるような関数は提供されていないのでしょう
か。

# 個人的には、コールバックには追加の引数を渡せるように設計する
# ものではないかと思いますが。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦