glib2 3.4.3 → 3.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/ext/glib2/extconf.rb +1 -5
- data/ext/glib2/glib-enum-types.c +1233 -0
- data/ext/glib2/glib-enum-types.h +154 -0
- data/ext/glib2/glib2.def +2 -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 +6 -7
- data/ext/glib2/rbglib.c +68 -1
- data/ext/glib2/rbglib.h +13 -3
- data/ext/glib2/rbglib_bookmarkfile.c +1 -1
- data/ext/glib2/rbglib_datetime.c +1 -5
- data/ext/glib2/rbglib_error.c +39 -12
- data/ext/glib2/rbglib_fileutils.c +1 -17
- data/ext/glib2/rbglib_iochannel.c +4 -4
- data/ext/glib2/rbglib_keyfile.c +1 -35
- 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_messages.c +4 -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_boxed.c +1 -1
- data/ext/glib2/rbgobj_closure.c +22 -9
- data/ext/glib2/rbgobj_enums.c +3 -2
- data/ext/glib2/rbgobj_flags.c +1 -1
- data/ext/glib2/rbgobj_object.c +117 -106
- data/ext/glib2/rbgobj_param.c +3 -9
- data/ext/glib2/rbgobj_paramspecs.c +6 -24
- data/ext/glib2/rbgobj_signal.c +105 -93
- data/ext/glib2/rbgobj_strv.c +2 -2
- data/ext/glib2/rbgobj_type.c +58 -67
- data/ext/glib2/rbgobj_typeinterface.c +38 -2
- data/ext/glib2/rbgobj_value.c +23 -8
- 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 +10 -6
- data/ext/glib2/rbgutil.h +3 -2
- data/ext/glib2/rbgutil_callback.c +30 -27
- data/lib/glib2/deprecated.rb +22 -1
- data/lib/glib2.rb +54 -3
- data/lib/mkmf-gnome.rb +7 -6
- data/test/glib-test-utils.rb +22 -3
- data/test/run-test.rb +49 -15
- data/test/test-binding.rb +1 -11
- data/test/test-bytes.rb +1 -5
- data/test/test-date-time.rb +1 -3
- data/test/{glib-test-init.rb → test-error.rb} +25 -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 +4 -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 +6 -5
- data/ext/glib2/rbgobj_valuearray.c +0 -100
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 = {
|
@@ -39,7 +36,7 @@ static const rb_data_type_t rg_glib_signal_type = {
|
|
39
36
|
},
|
40
37
|
NULL,
|
41
38
|
NULL,
|
42
|
-
RUBY_TYPED_FREE_IMMEDIATELY,
|
39
|
+
RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
|
43
40
|
};
|
44
41
|
|
45
42
|
VALUE
|
@@ -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
|
-
const
|
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
|
+
const gchar *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
|
}
|
data/ext/glib2/rbgobj_strv.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2011 Ruby-
|
3
|
+
* Copyright (C) 2011-2020 Ruby-GNOME Project Team
|
4
4
|
* Copyright (C) 2005 Masao Mutoh
|
5
5
|
*
|
6
6
|
* This library is free software; you can redistribute it and/or
|
@@ -30,7 +30,7 @@ strv_to_ruby(const GValue *from)
|
|
30
30
|
static void
|
31
31
|
strv_from_ruby(VALUE from, GValue *to)
|
32
32
|
{
|
33
|
-
|
33
|
+
gchar **strings = RVAL2STRV(from);
|
34
34
|
g_value_set_boxed(to, strings);
|
35
35
|
g_free(strings);
|
36
36
|
}
|