예제 #1
0
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;
}
예제 #2
0
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;
}