glib2 3.4.0 → 3.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/Rakefile +6 -4
- data/ext/glib2/extconf.rb +1 -5
- data/ext/glib2/glib2.def +1 -0
- data/ext/glib2/rbglib-bytes.c +1 -5
- data/ext/glib2/rbglib-gc.c +98 -52
- data/ext/glib2/rbglib-variant-type.c +1 -5
- data/ext/glib2/rbglib-variant.c +3 -5
- data/ext/glib2/rbglib.c +4 -0
- data/ext/glib2/rbglib.h +13 -3
- data/ext/glib2/rbglib_bookmarkfile.c +4 -4
- data/ext/glib2/rbglib_datetime.c +1 -5
- data/ext/glib2/rbglib_error.c +3 -1
- data/ext/glib2/rbglib_fileutils.c +1 -17
- data/ext/glib2/rbglib_iochannel.c +4 -4
- data/ext/glib2/rbglib_keyfile.c +16 -41
- data/ext/glib2/rbglib_maincontext.c +6 -32
- data/ext/glib2/rbglib_mainloop.c +2 -17
- data/ext/glib2/rbglib_matchinfo.c +1 -5
- data/ext/glib2/rbglib_pollfd.c +1 -25
- data/ext/glib2/rbglib_regex.c +1 -13
- data/ext/glib2/rbglib_source.c +1 -39
- data/ext/glib2/rbglib_spawn.c +5 -10
- data/ext/glib2/rbglib_spawnerror.c +2 -2
- data/ext/glib2/rbglib_threads.c +2 -15
- data/ext/glib2/rbglib_timezone.c +1 -5
- data/ext/glib2/rbglib_unichar.c +46 -5
- data/ext/glib2/rbglib_unicode.c +1 -18
- data/ext/glib2/rbglib_utils.c +1 -14
- data/ext/glib2/rbglib_win32.c +3 -7
- data/ext/glib2/rbgobj_binding.c +1 -7
- data/ext/glib2/rbgobj_closure.c +22 -9
- data/ext/glib2/rbgobj_object.c +113 -104
- data/ext/glib2/rbgobj_param.c +2 -8
- data/ext/glib2/rbgobj_paramspecs.c +6 -24
- data/ext/glib2/rbgobj_signal.c +104 -92
- data/ext/glib2/rbgobj_strv.c +2 -2
- data/ext/glib2/rbgobj_type.c +58 -68
- data/ext/glib2/rbgobj_typeinterface.c +38 -2
- data/ext/glib2/rbgobj_value.c +3 -7
- data/ext/glib2/rbgobj_valuetypes.c +14 -62
- data/ext/glib2/rbgobject.c +4 -6
- data/ext/glib2/rbgobject.h +2 -27
- data/ext/glib2/rbgprivate.h +6 -6
- data/ext/glib2/rbgutil_callback.c +23 -26
- data/lib/glib2.rb +32 -3
- data/lib/glib2/deprecated.rb +22 -1
- data/lib/mkmf-gnome.rb +4 -4
- data/test/glib-test-utils.rb +18 -3
- data/test/run-test.rb +49 -14
- data/test/test-binding.rb +1 -11
- data/test/test-bytes.rb +1 -5
- data/test/test-date-time.rb +1 -3
- data/test/test-file-utils.rb +1 -32
- data/test/test-iochannel.rb +3 -5
- data/test/test-key-file.rb +5 -6
- data/test/test-match-info.rb +1 -5
- data/test/test-regex.rb +1 -5
- data/test/test-source.rb +1 -14
- data/test/test-spawn.rb +2 -1
- data/test/test-time-zone.rb +1 -5
- data/test/test-timeout.rb +2 -3
- data/test/test-unicode.rb +16 -12
- data/test/test-utils.rb +2 -8
- data/test/test-variant-type.rb +1 -3
- data/test/test-win32.rb +6 -6
- metadata +3 -7
- data/ext/glib2/glib-enum-types.c +0 -1233
- data/ext/glib2/glib-enum-types.h +0 -154
- data/ext/glib2/rbgobj_valuearray.c +0 -100
- data/test/glib-test-init.rb +0 -21
data/ext/glib2/rbgobj_param.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2011-
|
3
|
+
* Copyright (C) 2011-2021 Ruby-GNOME Project Team
|
4
4
|
* Copyright (C) 2002,2003 Masahiro Sakai
|
5
5
|
*
|
6
6
|
* This library is free software; you can redistribute it and/or
|
@@ -276,7 +276,7 @@ rg_value_convert(int argc, VALUE* argv, VALUE self)
|
|
276
276
|
rb_scan_args(argc, argv, "21", &src, &src_type, &strict_validation);
|
277
277
|
|
278
278
|
/* FIXME: use rb_ensure to ensure following g_value_unset() call*/
|
279
|
-
g_value_init(&src_value,
|
279
|
+
g_value_init(&src_value, rbgobj_gtype_from_ruby(src_type));
|
280
280
|
g_value_init(&dest_value, G_PARAM_SPEC_VALUE_TYPE(pspec));
|
281
281
|
|
282
282
|
rbgobj_rvalue_to_gvalue(src, &src_value);
|
@@ -344,9 +344,7 @@ param_is_flag(G_PARAM_LAX_VALIDATION)
|
|
344
344
|
param_is_flag(G_PARAM_STATIC_NAME)
|
345
345
|
param_is_flag(G_PARAM_STATIC_NICK)
|
346
346
|
param_is_flag(G_PARAM_STATIC_BLURB)
|
347
|
-
#if GLIB_CHECK_VERSION(2, 42, 0)
|
348
347
|
param_is_flag(G_PARAM_EXPLICIT_NOTIFY)
|
349
|
-
#endif
|
350
348
|
param_is_flag(G_PARAM_DEPRECATED)
|
351
349
|
|
352
350
|
/**********************************************************************/
|
@@ -376,10 +374,8 @@ Init_gobject_gparam(void)
|
|
376
374
|
INT2FIX(G_PARAM_STATIC_NICK));
|
377
375
|
rb_define_const(RG_TARGET_NAMESPACE, "STATIC_BLURB",
|
378
376
|
INT2FIX(G_PARAM_STATIC_BLURB));
|
379
|
-
#if GLIB_CHECK_VERSION(2, 42, 0)
|
380
377
|
rb_define_const(RG_TARGET_NAMESPACE, "EXPLICIT_NOTIFY",
|
381
378
|
INT2FIX(G_PARAM_EXPLICIT_NOTIFY));
|
382
|
-
#endif
|
383
379
|
rb_define_const(RG_TARGET_NAMESPACE, "DEPRECATED",
|
384
380
|
INT2FIX(G_PARAM_DEPRECATED));
|
385
381
|
rb_define_const(RG_TARGET_NAMESPACE, "MASK",
|
@@ -432,10 +428,8 @@ Init_gobject_gparam(void)
|
|
432
428
|
param_is_G_PARAM_STATIC_NICK, 0);
|
433
429
|
rbg_define_method(RG_TARGET_NAMESPACE, "static_blurb?",
|
434
430
|
param_is_G_PARAM_STATIC_BLURB, 0);
|
435
|
-
#if GLIB_CHECK_VERSION(2, 42, 0)
|
436
431
|
rbg_define_method(RG_TARGET_NAMESPACE, "explicit_notify?",
|
437
432
|
param_is_G_PARAM_EXPLICIT_NOTIFY, 0);
|
438
|
-
#endif
|
439
433
|
rbg_define_method(RG_TARGET_NAMESPACE, "deprecated?",
|
440
434
|
param_is_G_PARAM_DEPRECATED, 0);
|
441
435
|
}
|
@@ -1,7 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C)
|
4
|
-
* Copyright (C) 2004 Ruby-GNOME2 Project Team
|
3
|
+
* Copyright (C) 2004-2021 Ruby-GNOME Project Team
|
5
4
|
* Copyright (C) 2002,2003 Masahiro Sakai
|
6
5
|
*
|
7
6
|
* This library is free software; you can redistribute it and/or
|
@@ -116,7 +115,7 @@ enum_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
|
116
115
|
VALUE enum_type, VALUE default_value, VALUE flags)
|
117
116
|
{
|
118
117
|
GParamSpec* pspec;
|
119
|
-
GType gtype =
|
118
|
+
GType gtype = rbgobj_gtype_from_ruby(enum_type);
|
120
119
|
|
121
120
|
pspec = g_param_spec_enum(StringValuePtr(name),
|
122
121
|
StringValuePtr(nick),
|
@@ -133,7 +132,7 @@ flags_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
|
133
132
|
VALUE flags_type, VALUE default_value, VALUE flags)
|
134
133
|
{
|
135
134
|
GParamSpec* pspec;
|
136
|
-
GType gtype =
|
135
|
+
GType gtype = rbgobj_gtype_from_ruby(flags_type);
|
137
136
|
|
138
137
|
pspec = g_param_spec_flags(StringValuePtr(name),
|
139
138
|
StringValuePtr(nick),
|
@@ -167,7 +166,7 @@ param_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
|
167
166
|
pspec = g_param_spec_param(StringValuePtr(name),
|
168
167
|
StringValuePtr(nick),
|
169
168
|
StringValuePtr(blurb),
|
170
|
-
|
169
|
+
rbgobj_gtype_from_ruby(param_type),
|
171
170
|
NUM2UINT(flags));
|
172
171
|
rbgobj_param_spec_initialize(self, pspec);
|
173
172
|
return Qnil;
|
@@ -181,7 +180,7 @@ boxed_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
|
181
180
|
pspec = g_param_spec_boxed(StringValuePtr(name),
|
182
181
|
StringValuePtr(nick),
|
183
182
|
StringValuePtr(blurb),
|
184
|
-
|
183
|
+
rbgobj_gtype_from_ruby(boxed_type),
|
185
184
|
NUM2UINT(flags));
|
186
185
|
rbgobj_param_spec_initialize(self, pspec);
|
187
186
|
return Qnil;
|
@@ -199,20 +198,6 @@ pointer_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb, VALUE flags)
|
|
199
198
|
return Qnil;
|
200
199
|
}
|
201
200
|
|
202
|
-
static VALUE
|
203
|
-
value_array_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
204
|
-
VALUE element_spec, VALUE flags)
|
205
|
-
{
|
206
|
-
GParamSpec* pspec;
|
207
|
-
pspec = g_param_spec_value_array(StringValuePtr(name),
|
208
|
-
StringValuePtr(nick),
|
209
|
-
StringValuePtr(blurb),
|
210
|
-
RVAL2GOBJ(element_spec),
|
211
|
-
NUM2UINT(flags));
|
212
|
-
rbgobj_param_spec_initialize(self, pspec);
|
213
|
-
return Qnil;
|
214
|
-
}
|
215
|
-
|
216
201
|
static VALUE
|
217
202
|
object_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
218
203
|
VALUE object_type, VALUE flags)
|
@@ -221,7 +206,7 @@ object_initialize(VALUE self, VALUE name, VALUE nick, VALUE blurb,
|
|
221
206
|
pspec = g_param_spec_object(StringValuePtr(name),
|
222
207
|
StringValuePtr(nick),
|
223
208
|
StringValuePtr(blurb),
|
224
|
-
|
209
|
+
rbgobj_gtype_from_ruby(object_type),
|
225
210
|
NUM2UINT(flags));
|
226
211
|
rbgobj_param_spec_initialize(self, pspec);
|
227
212
|
return Qnil;
|
@@ -303,9 +288,6 @@ Init_gobject_gparamspecs(void)
|
|
303
288
|
c = G_DEF_CLASS(G_TYPE_PARAM_POINTER, "Pointer", cParamSpec);
|
304
289
|
rbg_define_method(c, "initialize", pointer_initialize, 4);
|
305
290
|
|
306
|
-
c = G_DEF_CLASS(G_TYPE_PARAM_VALUE_ARRAY, "ValueArray", cParamSpec);
|
307
|
-
rbg_define_method(c, "initialize", value_array_initialize, 5);
|
308
|
-
|
309
291
|
c = G_DEF_CLASS(G_TYPE_PARAM_OBJECT, "Object", cParamSpec);
|
310
292
|
rbg_define_method(c, "initialize", object_initialize, 5);
|
311
293
|
}
|
data/ext/glib2/rbgobj_signal.c
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C)
|
4
|
-
* Copyright (C) 2002-2004 Ruby-GNOME Project Team
|
3
|
+
* Copyright (C) 2002-2021 Ruby-GNOME Project Team
|
5
4
|
* Copyright (C) 2002,2003 Masahiro Sakai
|
6
5
|
*
|
7
6
|
* This library is free software; you can redistribute it and/or
|
@@ -27,8 +26,6 @@
|
|
27
26
|
static VALUE RG_TARGET_NAMESPACE;
|
28
27
|
VALUE rbgobj_signal_wrap(guint sig_id);
|
29
28
|
|
30
|
-
#define default_handler_method_prefix "signal_do_"
|
31
|
-
|
32
29
|
/**********************************************************************/
|
33
30
|
|
34
31
|
static const rb_data_type_t rg_glib_signal_type = {
|
@@ -64,45 +61,57 @@ rbgobj_signal_get_raw(VALUE rb_signal)
|
|
64
61
|
return query;
|
65
62
|
}
|
66
63
|
|
67
|
-
static
|
64
|
+
static GHashTable *rbg_signal_func_table;
|
65
|
+
static GMutex rbg_signal_func_table_mutex;
|
68
66
|
|
69
67
|
void
|
70
|
-
rbgobj_set_signal_func(VALUE klass,
|
68
|
+
rbgobj_set_signal_func(VALUE klass,
|
69
|
+
const gchar *signal_name,
|
70
|
+
GValToRValSignalFunc func)
|
71
71
|
{
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
guint signal_id = g_signal_lookup(signal_name, CLASS2GTYPE(klass));
|
73
|
+
g_mutex_lock(&rbg_signal_func_table_mutex);
|
74
|
+
g_hash_table_insert(rbg_signal_func_table,
|
75
|
+
GUINT_TO_POINTER(signal_id),
|
76
|
+
func);
|
77
|
+
g_mutex_unlock(&rbg_signal_func_table_mutex);
|
75
78
|
}
|
76
79
|
|
77
80
|
GValToRValSignalFunc
|
78
81
|
rbgobj_get_signal_func(guint signal_id)
|
79
82
|
{
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
g_mutex_lock(&rbg_signal_func_table_mutex);
|
84
|
+
GValToRValSignalFunc func =
|
85
|
+
g_hash_table_lookup(rbg_signal_func_table,
|
86
|
+
GUINT_TO_POINTER(signal_id));
|
87
|
+
g_mutex_unlock(&rbg_signal_func_table_mutex);
|
84
88
|
return func;
|
85
89
|
}
|
86
90
|
|
87
|
-
static
|
91
|
+
static GHashTable *rbg_signal_call_func_table;
|
92
|
+
static GMutex rbg_signal_call_func_table_mutex;
|
88
93
|
|
89
94
|
void
|
90
95
|
rbgobj_set_signal_call_func(VALUE klass,
|
91
96
|
const gchar *signal_name,
|
92
97
|
RGClosureCallFunc func)
|
93
98
|
{
|
94
|
-
VALUE obj = Data_Wrap_Struct(rb_cData, NULL, NULL, func);
|
95
99
|
guint signal_id = g_signal_lookup(signal_name, CLASS2GTYPE(klass));
|
96
|
-
|
100
|
+
g_mutex_lock(&rbg_signal_call_func_table_mutex);
|
101
|
+
g_hash_table_insert(rbg_signal_call_func_table,
|
102
|
+
GUINT_TO_POINTER(signal_id),
|
103
|
+
func);
|
104
|
+
g_mutex_unlock(&rbg_signal_call_func_table_mutex);
|
97
105
|
}
|
98
106
|
|
99
107
|
RGClosureCallFunc
|
100
108
|
rbgobj_get_signal_call_func(guint signal_id)
|
101
109
|
{
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
110
|
+
g_mutex_lock(&rbg_signal_call_func_table_mutex);
|
111
|
+
RGClosureCallFunc func =
|
112
|
+
g_hash_table_lookup(rbg_signal_call_func_table,
|
113
|
+
GUINT_TO_POINTER(signal_id));
|
114
|
+
g_mutex_unlock(&rbg_signal_call_func_table_mutex);
|
106
115
|
return func;
|
107
116
|
}
|
108
117
|
|
@@ -150,7 +159,7 @@ rbg_rval2gtypes_body(VALUE value)
|
|
150
159
|
struct rval2gtypes_args *args = (struct rval2gtypes_args *)value;
|
151
160
|
|
152
161
|
for (i = 0; i < args->n; i++)
|
153
|
-
args->result[i] =
|
162
|
+
args->result[i] = rbgobj_gtype_from_ruby(RARRAY_PTR(args->ary)[i]);
|
154
163
|
|
155
164
|
return Qnil;
|
156
165
|
}
|
@@ -224,23 +233,16 @@ gobj_s_define_signal(int argc, VALUE* argv, VALUE self)
|
|
224
233
|
signal_flags = RVAL2GFLAGS(rbsignal_flags, G_TYPE_SIGNAL_FLAGS);
|
225
234
|
|
226
235
|
{
|
227
|
-
VALUE
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
rb_str_concat(rb_str_new_cstr(default_handler_method_prefix),
|
233
|
-
rbsignal_name);
|
234
|
-
method_id = rb_to_id(rb_method_name);
|
235
|
-
|
236
|
-
proc = rb_funcall(mMetaInterface, rb_intern("signal_callback"), 2,
|
237
|
-
self, ID2SYM(method_id));
|
238
|
-
|
236
|
+
VALUE proc = rb_funcall(mMetaInterface,
|
237
|
+
rb_intern("signal_callback"),
|
238
|
+
2,
|
239
|
+
self,
|
240
|
+
rbsignal_name);
|
239
241
|
class_closure = g_rclosure_new(proc, Qnil, NULL);
|
240
|
-
g_rclosure_set_tag(class_closure, RVAL2CSTR(
|
242
|
+
g_rclosure_set_tag(class_closure, RVAL2CSTR(rbsignal_name));
|
241
243
|
}
|
242
244
|
|
243
|
-
return_type =
|
245
|
+
return_type = rbgobj_gtype_from_ruby(rbreturn_type);
|
244
246
|
param_types = RVAL2GTYPES_ACCEPT_NIL(params, n_params);
|
245
247
|
|
246
248
|
signal = g_signal_newv(signal_name,
|
@@ -440,30 +442,33 @@ struct emit_arg {
|
|
440
442
|
|
441
443
|
GSignalQuery query;
|
442
444
|
GQuark detail;
|
443
|
-
|
445
|
+
GArray *instance_and_params;
|
444
446
|
};
|
445
447
|
|
446
448
|
static VALUE
|
447
449
|
emit_body(VALUE rb_arg)
|
448
450
|
{
|
449
451
|
struct emit_arg *arg = (struct emit_arg *)rb_arg;
|
450
|
-
GValue param = G_VALUE_INIT;
|
451
452
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
453
|
+
gsize value_index = 0;
|
454
|
+
GValue *gself = &g_array_index(arg->instance_and_params,
|
455
|
+
GValue,
|
456
|
+
value_index);
|
457
|
+
g_value_init(gself, G_TYPE_FROM_INSTANCE(RVAL2GOBJ(arg->self)));
|
458
|
+
rbgobj_rvalue_to_gvalue(arg->self, gself);
|
459
|
+
value_index++;
|
456
460
|
|
457
461
|
{
|
458
462
|
guint i;
|
459
463
|
for (i = 0; i < arg->query.n_params; i++){
|
460
464
|
GType gtype = arg->query.param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
|
461
465
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
466
|
+
GValue *gparam = &g_array_index(arg->instance_and_params,
|
467
|
+
GValue,
|
468
|
+
value_index);
|
469
|
+
g_value_init(gparam, gtype);
|
470
|
+
rbgobj_rvalue_to_gvalue(rb_ary_entry(arg->args, i), gparam);
|
471
|
+
value_index++;
|
467
472
|
}
|
468
473
|
}
|
469
474
|
|
@@ -475,7 +480,7 @@ emit_body(VALUE rb_arg)
|
|
475
480
|
g_value_init(&return_value,
|
476
481
|
arg->query.return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE);
|
477
482
|
|
478
|
-
g_signal_emitv(arg->instance_and_params->
|
483
|
+
g_signal_emitv((GValue *)(arg->instance_and_params->data),
|
479
484
|
arg->query.signal_id, arg->detail,
|
480
485
|
(use_ret) ? &return_value : NULL);
|
481
486
|
|
@@ -493,7 +498,7 @@ static VALUE
|
|
493
498
|
emit_ensure(VALUE rb_arg)
|
494
499
|
{
|
495
500
|
struct emit_arg *arg = (struct emit_arg *)rb_arg;
|
496
|
-
|
501
|
+
g_array_unref(arg->instance_and_params);
|
497
502
|
return Qnil;
|
498
503
|
}
|
499
504
|
|
@@ -525,7 +530,13 @@ gobj_sig_emit(int argc, VALUE *argv, VALUE self)
|
|
525
530
|
arg.query.n_params + 1);
|
526
531
|
|
527
532
|
arg.self = self;
|
528
|
-
arg.instance_and_params =
|
533
|
+
arg.instance_and_params = g_array_sized_new(FALSE,
|
534
|
+
TRUE,
|
535
|
+
sizeof(GValue),
|
536
|
+
1 + arg.query.n_params);
|
537
|
+
g_array_set_clear_func(arg.instance_and_params,
|
538
|
+
(GDestroyNotify)g_value_unset);
|
539
|
+
g_array_set_size(arg.instance_and_params, 1 + arg.query.n_params);
|
529
540
|
|
530
541
|
return rb_ensure(emit_body, (VALUE)&arg, emit_ensure, (VALUE)&arg);
|
531
542
|
}
|
@@ -628,17 +639,24 @@ static VALUE
|
|
628
639
|
chain_from_overridden_body(VALUE rb_arg)
|
629
640
|
{
|
630
641
|
struct emit_arg *arg = (struct emit_arg *)rb_arg;
|
631
|
-
|
632
|
-
|
633
|
-
|
642
|
+
gsize value_index = 0;
|
643
|
+
GValue *gself = &g_array_index(arg->instance_and_params,
|
644
|
+
GValue,
|
645
|
+
value_index);
|
646
|
+
g_value_init(gself, G_TYPE_FROM_INSTANCE(RVAL2GOBJ(arg->self)));
|
647
|
+
rbgobj_rvalue_to_gvalue(arg->self, gself);
|
648
|
+
value_index++;
|
634
649
|
|
635
650
|
{
|
636
|
-
GValue* params = arg->instance_and_params->values + 1;
|
637
651
|
guint i;
|
638
652
|
for (i = 0; i < arg->query.n_params; i++) {
|
639
653
|
GType gtype = arg->query.param_types[i] & ~G_SIGNAL_TYPE_STATIC_SCOPE;
|
640
|
-
|
641
|
-
|
654
|
+
GValue *gparam = &g_array_index(arg->instance_and_params,
|
655
|
+
GValue,
|
656
|
+
value_index);
|
657
|
+
g_value_init(gparam, gtype);
|
658
|
+
rbgobj_rvalue_to_gvalue(rb_ary_entry(arg->args, i), gparam);
|
659
|
+
value_index++;
|
642
660
|
}
|
643
661
|
}
|
644
662
|
|
@@ -650,7 +668,7 @@ chain_from_overridden_body(VALUE rb_arg)
|
|
650
668
|
g_value_init(&return_value,
|
651
669
|
arg->query.return_type & ~G_SIGNAL_TYPE_STATIC_SCOPE);
|
652
670
|
|
653
|
-
g_signal_chain_from_overridden(arg->instance_and_params->
|
671
|
+
g_signal_chain_from_overridden((GValue *)(arg->instance_and_params->data),
|
654
672
|
(use_ret) ? &return_value : NULL);
|
655
673
|
|
656
674
|
if (use_ret) {
|
@@ -682,46 +700,38 @@ gobj_sig_chain_from_overridden(int argc, VALUE *argv, VALUE self)
|
|
682
700
|
|
683
701
|
arg.self = self;
|
684
702
|
arg.args = rb_ary_new4(argc, argv);
|
685
|
-
arg.instance_and_params =
|
703
|
+
arg.instance_and_params = g_array_sized_new(FALSE,
|
704
|
+
TRUE,
|
705
|
+
sizeof(GValue),
|
706
|
+
1 + argc);
|
707
|
+
g_array_set_clear_func(arg.instance_and_params,
|
708
|
+
(GDestroyNotify)g_value_unset);
|
709
|
+
g_array_set_size(arg.instance_and_params, 1 + argc);
|
686
710
|
|
687
711
|
return rb_ensure(chain_from_overridden_body, (VALUE)&arg,
|
688
712
|
emit_ensure, (VALUE)&arg);
|
689
713
|
}
|
690
714
|
|
691
715
|
static VALUE
|
692
|
-
|
716
|
+
gobj_s_signal_handler_attach(VALUE klass,
|
717
|
+
VALUE rb_signal,
|
718
|
+
VALUE rb_handler_name)
|
693
719
|
{
|
694
|
-
const RGObjClassInfo*
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
{
|
706
|
-
GSignalQuery query;
|
707
|
-
g_signal_query(signal_id, &query);
|
708
|
-
if (query.itype == cinfo->gtype)
|
709
|
-
return Qnil;
|
710
|
-
}
|
711
|
-
|
712
|
-
{
|
713
|
-
VALUE proc = rb_funcall(mMetaInterface, rb_intern("signal_callback"), 2,
|
714
|
-
klass, id);
|
715
|
-
GClosure* rclosure = g_rclosure_new(proc, Qnil,
|
716
|
-
rbgobj_get_signal_func(signal_id));
|
717
|
-
g_rclosure_attach((GClosure *)rclosure, klass);
|
718
|
-
g_signal_override_class_closure(signal_id, cinfo->gtype, rclosure);
|
719
|
-
}
|
720
|
+
const RGObjClassInfo *cinfo = rbgobj_lookup_class(klass);
|
721
|
+
guint signal_id = rbgobj_signal_get_raw(rb_signal)->signal_id;
|
722
|
+
VALUE handler_name = RVAL2CSTR(rb_handler_name);
|
723
|
+
VALUE proc = rb_block_proc();
|
724
|
+
GClosure* rclosure = g_rclosure_new(proc,
|
725
|
+
Qnil,
|
726
|
+
rbgobj_get_signal_func(signal_id));
|
727
|
+
g_rclosure_set_tag(rclosure, handler_name);
|
728
|
+
g_rclosure_attach((GClosure *)rclosure, klass);
|
729
|
+
g_signal_override_class_closure(signal_id, cinfo->gtype, rclosure);
|
720
730
|
|
721
731
|
{
|
722
732
|
VALUE mod = rb_define_module_under(klass, RubyGObjectHookModule);
|
723
733
|
rb_include_module(klass, mod);
|
724
|
-
rbg_define_method(mod,
|
734
|
+
rbg_define_method(mod, handler_name, gobj_sig_chain_from_overridden, -1);
|
725
735
|
}
|
726
736
|
|
727
737
|
return Qnil;
|
@@ -947,7 +957,7 @@ Init_gobject_gsignal(void)
|
|
947
957
|
{
|
948
958
|
VALUE cSignalFlags, cSignalMatchType;
|
949
959
|
|
950
|
-
RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Signal",
|
960
|
+
RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Signal", rb_cObject);
|
951
961
|
|
952
962
|
RG_DEF_METHOD(id, 0);
|
953
963
|
RG_DEF_METHOD(name, 0);
|
@@ -990,11 +1000,11 @@ Init_gobject_gsignal(void)
|
|
990
1000
|
|
991
1001
|
eNoSignalError = rb_define_class_under(mGLib, "NoSignalError", rb_eNameError);
|
992
1002
|
|
993
|
-
|
994
|
-
|
1003
|
+
rbg_signal_func_table = g_hash_table_new(g_direct_hash, g_direct_equal);
|
1004
|
+
g_mutex_init(&rbg_signal_func_table_mutex);
|
995
1005
|
|
996
|
-
|
997
|
-
|
1006
|
+
rbg_signal_call_func_table = g_hash_table_new(g_direct_hash, g_direct_equal);
|
1007
|
+
g_mutex_init(&rbg_signal_call_func_table_mutex);
|
998
1008
|
|
999
1009
|
rbg_define_method(mMetaInterface, "define_signal", gobj_s_define_signal, -1);
|
1000
1010
|
rb_define_alias(mMetaInterface, "signal_new", "define_signal");
|
@@ -1026,6 +1036,8 @@ Init_gobject_gsignal(void)
|
|
1026
1036
|
rbg_define_method(cInstantiatable, "signal_handler_is_connected?",
|
1027
1037
|
gobj_sig_handler_is_connected, 1);
|
1028
1038
|
|
1029
|
-
rbg_define_singleton_method(cInstantiatable,
|
1030
|
-
|
1039
|
+
rbg_define_singleton_method(cInstantiatable,
|
1040
|
+
"signal_handler_attach",
|
1041
|
+
gobj_s_signal_handler_attach,
|
1042
|
+
2);
|
1031
1043
|
}
|