static VALUE rg_initialize(VALUE self) { GClosure* closure = g_rclosure_new(rb_block_proc(), Qnil, NULL); G_INITIALIZE(self, closure); g_closure_sink(closure); return self; }
static VALUE rbclt_script_do_connect_signal (VALUE user_data) { AutoConnectData *data = (AutoConnectData *) user_data; guint signal_id; GQuark detail; GClosure *rclosure; if (NIL_P (data->proc)) { ID mid; VALUE args; VALUE func; if (!g_signal_parse_name (data->signal_name, G_TYPE_FROM_INSTANCE (data->object), &signal_id, &detail, TRUE)) rb_raise (eNoSignalError, "no such signal: %s", data->signal_name); /* Create a method closure for the given object and method name */ mid = rb_intern (data->handler_name); func = rb_funcall (data->obj, id_method, 1, rb_str_new2 (data->handler_name)); if (data->connect_object) args = rb_ary_new3 (1, GOBJ2RVAL (data->connect_object)); else args = data->args; rclosure = g_rclosure_new (func, args, rbgobj_get_signal_func (signal_id)); g_rclosure_attach ((GClosure *) rclosure, GOBJ2RVAL (data->object)); g_signal_connect_closure_by_id (data->object, signal_id, detail, rclosure, (data->connect_flags & G_CONNECT_AFTER) ? TRUE : FALSE); } else { VALUE args; int i; /* Just pass the details on to the application's function to do the actual connection */ args = rb_ary_new3 (5, GOBJ2RVAL (data->object), rb_str_new2 (data->signal_name), rb_str_new2 (data->handler_name), GOBJ2RVAL (data->connect_object), GENUM2RVAL (data->connect_flags, rbclt_connect_flags_get_type ())); for (i = 0; i < RARRAY_LEN (data->args); i++) rb_ary_push (args, RARRAY_PTR (data->args)[i]); rb_funcall2 (data->proc, id_call, RARRAY_LEN (args), RARRAY_PTR (args)); } return Qnil; }