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;
|
||||
}
|
||||
|
||||
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:
|
||||
* set_mouse_callback(&block)
|
||||
|
@ -332,12 +339,12 @@ rb_set_mouse_callback(int argc, VALUE* argv, VALUE self)
|
|||
|
||||
VALUE block = Qnil;
|
||||
rb_scan_args(argc, argv, "0&", &block);
|
||||
void *callback = (void *)alloc_callback(&mouse_callback, block);
|
||||
cvSetMouseCallback(GET_WINDOW_NAME(self), (CvMouseCallback)callback);
|
||||
cvSetMouseCallback(GET_WINDOW_NAME(self), on_mouse, (void*)block);
|
||||
st_table *holder;
|
||||
if (st_lookup(windows, (st_data_t)DATA_PTR(self), (st_data_t*)&holder)) {
|
||||
st_insert(holder, rb_cProc, block);
|
||||
}else{
|
||||
}
|
||||
else {
|
||||
rb_raise(rb_eStandardError, "window is destroied.");
|
||||
}
|
||||
return block;
|
||||
|
@ -351,18 +358,6 @@ trackbar_callback(VALUE block, va_alist 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_GUI
|
||||
__NAMESPACE_END_OPENCV
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue