mirror of
https://github.com/ruby-opencv/ruby-opencv
synced 2023-03-27 23:22:12 -04:00
modified Window#set_mouse_callback to avoid unexplained segmentation fault (caused by ffcall?)
This commit is contained in:
parent
81714f0768
commit
eea97c692b
1 changed files with 10 additions and 15 deletions
|
@ -298,6 +298,13 @@ rb_set_trackbar(int argc, VALUE *argv, VALUE self)
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
on_mouse(int event, int x, int y, int flags, void* param) {
|
||||||
|
VALUE block = (VALUE)param;
|
||||||
|
if (rb_obj_is_kind_of(block, rb_cProc))
|
||||||
|
rb_funcall(block, rb_intern("call"), 1, cMouseEvent::new_object(event, x, y, flags));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* set_mouse_callback(&block)
|
* set_mouse_callback(&block)
|
||||||
|
@ -332,12 +339,12 @@ rb_set_mouse_callback(int argc, VALUE* argv, VALUE self)
|
||||||
|
|
||||||
VALUE block = Qnil;
|
VALUE block = Qnil;
|
||||||
rb_scan_args(argc, argv, "0&", &block);
|
rb_scan_args(argc, argv, "0&", &block);
|
||||||
void *callback = (void *)alloc_callback(&mouse_callback, block);
|
cvSetMouseCallback(GET_WINDOW_NAME(self), on_mouse, (void*)block);
|
||||||
cvSetMouseCallback(GET_WINDOW_NAME(self), (CvMouseCallback)callback);
|
|
||||||
st_table *holder;
|
st_table *holder;
|
||||||
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
||||||
st_insert(holder, rb_cProc, block);
|
st_insert(holder, rb_cProc, block);
|
||||||
}else{
|
}
|
||||||
|
else {
|
||||||
rb_raise(rb_eStandardError, "window is destroied.");
|
rb_raise(rb_eStandardError, "window is destroied.");
|
||||||
}
|
}
|
||||||
return block;
|
return block;
|
||||||
|
@ -351,18 +358,6 @@ trackbar_callback(VALUE block, va_alist ap)
|
||||||
va_return_void(ap);
|
va_return_void(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
mouse_callback(VALUE block, va_alist ap)
|
|
||||||
{
|
|
||||||
va_start_void(ap);
|
|
||||||
int event = va_arg_int(ap);
|
|
||||||
int x = va_arg_int(ap);
|
|
||||||
int y = va_arg_int(ap);
|
|
||||||
int flags = va_arg_int(ap);
|
|
||||||
rb_funcall(block, rb_intern("call"), 1, cMouseEvent::new_object(event, x, y, flags));
|
|
||||||
va_return_void(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
__NAMESPACE_END_WINDOW
|
__NAMESPACE_END_WINDOW
|
||||||
__NAMESPACE_END_GUI
|
__NAMESPACE_END_GUI
|
||||||
__NAMESPACE_END_OPENCV
|
__NAMESPACE_END_OPENCV
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue