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.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/ext/glib2/extconf.rb +1 -5
  4. data/ext/glib2/glib-enum-types.c +1233 -0
  5. data/ext/glib2/glib-enum-types.h +154 -0
  6. data/ext/glib2/glib2.def +2 -0
  7. data/ext/glib2/rbglib-bytes.c +1 -5
  8. data/ext/glib2/rbglib-gc.c +98 -52
  9. data/ext/glib2/rbglib-variant-type.c +1 -5
  10. data/ext/glib2/rbglib-variant.c +6 -7
  11. data/ext/glib2/rbglib.c +68 -1
  12. data/ext/glib2/rbglib.h +13 -3
  13. data/ext/glib2/rbglib_bookmarkfile.c +1 -1
  14. data/ext/glib2/rbglib_datetime.c +1 -5
  15. data/ext/glib2/rbglib_error.c +39 -12
  16. data/ext/glib2/rbglib_fileutils.c +1 -17
  17. data/ext/glib2/rbglib_iochannel.c +4 -4
  18. data/ext/glib2/rbglib_keyfile.c +1 -35
  19. data/ext/glib2/rbglib_maincontext.c +6 -32
  20. data/ext/glib2/rbglib_mainloop.c +2 -17
  21. data/ext/glib2/rbglib_matchinfo.c +1 -5
  22. data/ext/glib2/rbglib_messages.c +4 -5
  23. data/ext/glib2/rbglib_pollfd.c +1 -25
  24. data/ext/glib2/rbglib_regex.c +1 -13
  25. data/ext/glib2/rbglib_source.c +1 -39
  26. data/ext/glib2/rbglib_spawn.c +5 -10
  27. data/ext/glib2/rbglib_spawnerror.c +2 -2
  28. data/ext/glib2/rbglib_threads.c +2 -15
  29. data/ext/glib2/rbglib_timezone.c +1 -5
  30. data/ext/glib2/rbglib_unichar.c +46 -5
  31. data/ext/glib2/rbglib_unicode.c +1 -18
  32. data/ext/glib2/rbglib_utils.c +1 -14
  33. data/ext/glib2/rbglib_win32.c +3 -7
  34. data/ext/glib2/rbgobj_binding.c +1 -7
  35. data/ext/glib2/rbgobj_boxed.c +1 -1
  36. data/ext/glib2/rbgobj_closure.c +22 -9
  37. data/ext/glib2/rbgobj_enums.c +3 -2
  38. data/ext/glib2/rbgobj_flags.c +1 -1
  39. data/ext/glib2/rbgobj_object.c +117 -106
  40. data/ext/glib2/rbgobj_param.c +3 -9
  41. data/ext/glib2/rbgobj_paramspecs.c +6 -24
  42. data/ext/glib2/rbgobj_signal.c +105 -93
  43. data/ext/glib2/rbgobj_strv.c +2 -2
  44. data/ext/glib2/rbgobj_type.c +58 -67
  45. data/ext/glib2/rbgobj_typeinterface.c +38 -2
  46. data/ext/glib2/rbgobj_value.c +23 -8
  47. data/ext/glib2/rbgobj_valuetypes.c +14 -62
  48. data/ext/glib2/rbgobject.c +4 -6
  49. data/ext/glib2/rbgobject.h +2 -27
  50. data/ext/glib2/rbgprivate.h +10 -6
  51. data/ext/glib2/rbgutil.h +3 -2
  52. data/ext/glib2/rbgutil_callback.c +30 -27
  53. data/lib/glib2/deprecated.rb +22 -1
  54. data/lib/glib2.rb +54 -3
  55. data/lib/mkmf-gnome.rb +7 -6
  56. data/test/glib-test-utils.rb +22 -3
  57. data/test/run-test.rb +49 -15
  58. data/test/test-binding.rb +1 -11
  59. data/test/test-bytes.rb +1 -5
  60. data/test/test-date-time.rb +1 -3
  61. data/test/{glib-test-init.rb → test-error.rb} +25 -3
  62. data/test/test-file-utils.rb +1 -32
  63. data/test/test-iochannel.rb +3 -5
  64. data/test/test-key-file.rb +5 -6
  65. data/test/test-match-info.rb +1 -5
  66. data/test/test-regex.rb +1 -5
  67. data/test/test-source.rb +1 -14
  68. data/test/test-spawn.rb +4 -1
  69. data/test/test-time-zone.rb +1 -5
  70. data/test/test-timeout.rb +2 -3
  71. data/test/test-unicode.rb +16 -12
  72. data/test/test-utils.rb +2 -8
  73. data/test/test-variant-type.rb +1 -3
  74. data/test/test-win32.rb +6 -6
  75. metadata +6 -5
  76. data/ext/glib2/rbgobj_valuearray.c +0 -100
@@ -1,7 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2011-2019 Ruby-GNOME Project Team
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 VALUE signal_func_table;
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, const gchar *sig_name, GValToRValSignalFunc func)
68
+ rbgobj_set_signal_func(VALUE klass,
69
+ const gchar *signal_name,
70
+ GValToRValSignalFunc func)
71
71
  {
72
- VALUE obj = Data_Wrap_Struct(rb_cData, NULL, NULL, func);
73
- guint signal_id = g_signal_lookup(sig_name, CLASS2GTYPE(klass));
74
- rb_hash_aset(signal_func_table, UINT2NUM(signal_id), obj);
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
- GValToRValSignalFunc func = NULL;
81
- VALUE func_obj = rb_hash_aref(signal_func_table, UINT2NUM(signal_id));
82
- if (!NIL_P(func_obj))
83
- Data_Get_Struct(func_obj, void, func);
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 VALUE signal_call_func_table;
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
- rb_hash_aset(signal_call_func_table, UINT2NUM(signal_id), obj);
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
- RGClosureCallFunc func = NULL;
103
- VALUE func_obj = rb_hash_aref(signal_call_func_table, UINT2NUM(signal_id));
104
- if (!NIL_P(func_obj))
105
- Data_Get_Struct(func_obj, void, func);
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] = rbgobj_gtype_get(RARRAY_PTR(args->ary)[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 rb_method_name;
228
- VALUE proc;
229
- ID method_id;
230
-
231
- rb_method_name =
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(rb_method_name));
242
+ g_rclosure_set_tag(class_closure, RVAL2CSTR(rbsignal_name));
241
243
  }
242
244
 
243
- return_type = rbgobj_gtype_get(rbreturn_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
- GValueArray* instance_and_params;
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
- g_value_init(&param, G_TYPE_FROM_INSTANCE(RVAL2GOBJ(arg->self)));
453
- rbgobj_rvalue_to_gvalue(arg->self, &param);
454
- g_value_array_append(arg->instance_and_params, &param);
455
- g_value_unset(&param);
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
- g_value_init(&param, gtype);
463
-
464
- rbgobj_rvalue_to_gvalue(rb_ary_entry(arg->args, i), &param);
465
- g_value_array_append(arg->instance_and_params, &param);
466
- g_value_unset(&param);
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->values,
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
- g_value_array_free(arg->instance_and_params);
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 = g_value_array_new(1 + arg.query.n_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
- g_value_init(arg->instance_and_params->values,
632
- G_TYPE_FROM_INSTANCE(RVAL2GOBJ(arg->self)));
633
- rbgobj_rvalue_to_gvalue(arg->self, arg->instance_and_params->values);
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
- g_value_init(params + i, gtype);
641
- rbgobj_rvalue_to_gvalue(rb_ary_entry(arg->args, i), params + i);
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->values,
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 = g_value_array_new(1 + argc);
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
- gobj_s_method_added(VALUE klass, VALUE id)
716
+ gobj_s_signal_handler_attach(VALUE klass,
717
+ VALUE rb_signal,
718
+ VALUE rb_handler_name)
693
719
  {
694
- const RGObjClassInfo* cinfo = rbgobj_lookup_class(klass);
695
- const char* name = rb_id2name(SYM2ID(id));
696
- const int prefix_len = strlen(default_handler_method_prefix);
697
- guint signal_id;
698
-
699
- if (cinfo->klass != klass) return Qnil;
700
- if (strncmp(default_handler_method_prefix, name, prefix_len)) return Qnil;
701
-
702
- signal_id = g_signal_lookup(name + prefix_len, cinfo->gtype);
703
- if (!signal_id) return Qnil;
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, name, gobj_sig_chain_from_overridden, -1);
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", rb_cData);
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
- signal_func_table = rb_hash_new();
994
- rb_global_variable(&signal_func_table);
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
- signal_call_func_table = rb_hash_new();
997
- rb_global_variable(&signal_call_func_table);
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, "method_added",
1030
- gobj_s_method_added, 1);
1039
+ rbg_define_singleton_method(cInstantiatable,
1040
+ "signal_handler_attach",
1041
+ gobj_s_signal_handler_attach,
1042
+ 2);
1031
1043
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2011 Ruby-GNOME2 Project Team
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
- const gchar **strings = RVAL2STRV(from);
33
+ gchar **strings = RVAL2STRV(from);
34
34
  g_value_set_boxed(to, strings);
35
35
  g_free(strings);
36
36
  }