glib2 3.5.1 → 4.0.2

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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/ext/glib2/extconf.rb +4 -3
  3. data/ext/glib2/glib2.def +6 -0
  4. data/ext/glib2/rbglib-bytes.c +1 -1
  5. data/ext/glib2/rbglib-gc.c +1 -1
  6. data/ext/glib2/rbglib-variant-type.c +1 -1
  7. data/ext/glib2/rbglib-variant.c +75 -2
  8. data/ext/glib2/rbglib.c +25 -59
  9. data/ext/glib2/rbglib.h +16 -3
  10. data/ext/glib2/rbglib_bookmarkfile.c +3 -2
  11. data/ext/glib2/rbglib_convert.c +2 -2
  12. data/ext/glib2/rbglib_datetime.c +14 -3
  13. data/ext/glib2/rbglib_error.c +2 -2
  14. data/ext/glib2/rbglib_fileutils.c +2 -2
  15. data/ext/glib2/rbglib_gettext.c +1 -1
  16. data/ext/glib2/rbglib_i18n.c +2 -2
  17. data/ext/glib2/rbglib_io_constants.c +1 -1
  18. data/ext/glib2/rbglib_iochannel.c +2 -2
  19. data/ext/glib2/rbglib_iochannel_win32_socket.c +2 -2
  20. data/ext/glib2/rbglib_iochannelerror.c +1 -1
  21. data/ext/glib2/rbglib_keyfile.c +2 -2
  22. data/ext/glib2/rbglib_maincontext.c +6 -6
  23. data/ext/glib2/rbglib_mainloop.c +1 -1
  24. data/ext/glib2/rbglib_matchinfo.c +1 -1
  25. data/ext/glib2/rbglib_messages.c +1 -1
  26. data/ext/glib2/rbglib_pollfd.c +1 -1
  27. data/ext/glib2/rbglib_regex.c +3 -3
  28. data/ext/glib2/rbglib_shell.c +1 -1
  29. data/ext/glib2/rbglib_shellerror.c +1 -1
  30. data/ext/glib2/rbglib_source.c +1 -1
  31. data/ext/glib2/rbglib_spawn.c +1 -1
  32. data/ext/glib2/rbglib_spawnerror.c +1 -1
  33. data/ext/glib2/rbglib_threads.c +1 -1
  34. data/ext/glib2/rbglib_timer.c +1 -1
  35. data/ext/glib2/rbglib_timezone.c +1 -1
  36. data/ext/glib2/rbglib_ucs4.c +1 -1
  37. data/ext/glib2/rbglib_unichar.c +1 -1
  38. data/ext/glib2/rbglib_unicode.c +3 -3
  39. data/ext/glib2/rbglib_utf16.c +1 -1
  40. data/ext/glib2/rbglib_utf8.c +1 -1
  41. data/ext/glib2/rbglib_utils.c +1 -1
  42. data/ext/glib2/rbglib_win32.c +3 -3
  43. data/ext/glib2/rbgobj_binding.c +1 -1
  44. data/ext/glib2/rbgobj_boxed.c +1 -1
  45. data/ext/glib2/rbgobj_closure.c +76 -85
  46. data/ext/glib2/rbgobj_enums.c +1 -1
  47. data/ext/glib2/rbgobj_flags.c +1 -1
  48. data/ext/glib2/rbgobj_object.c +32 -5
  49. data/ext/glib2/rbgobj_param.c +1 -1
  50. data/ext/glib2/rbgobj_signal.c +63 -19
  51. data/ext/glib2/rbgobj_type.c +2 -2
  52. data/ext/glib2/rbgobj_typeinstance.c +1 -1
  53. data/ext/glib2/rbgobj_typeinterface.c +4 -4
  54. data/ext/glib2/rbgobj_typemodule.c +1 -1
  55. data/ext/glib2/rbgobj_typeplugin.c +1 -1
  56. data/ext/glib2/rbgobj_value.c +1 -1
  57. data/ext/glib2/rbgobj_valuetypes.c +14 -4
  58. data/ext/glib2/rbgobject.c +7 -21
  59. data/ext/glib2/rbgobject.h +4 -1
  60. data/ext/glib2/rbgprivate.h +7 -4
  61. data/ext/glib2/rbgutil.c +20 -1
  62. data/ext/glib2/rbgutil.h +3 -0
  63. data/ext/glib2/rbgutil_callback.c +7 -7
  64. data/lib/glib2/date-time.rb +35 -0
  65. data/lib/glib2/variant.rb +25 -0
  66. data/lib/glib2.rb +6 -1
  67. data/lib/mkmf-gnome.rb +2 -2
  68. data/test/test-date-time.rb +14 -2
  69. data/test/test-glib2.rb +21 -9
  70. data/test/test-variant.rb +44 -1
  71. metadata +7 -7
  72. data/ext/glib2/glib-enum-types.c +0 -1233
  73. data/ext/glib2/glib-enum-types.h +0 -154
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2002-2021 Ruby-GNOME Project Team
3
+ * Copyright (C) 2002-2022 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
@@ -23,6 +23,7 @@
23
23
 
24
24
  #define RG_TARGET_NAMESPACE cSignal
25
25
 
26
+ static ID id_connected_closures;
26
27
  static VALUE RG_TARGET_NAMESPACE;
27
28
  VALUE rbgobj_signal_wrap(guint sig_id);
28
29
 
@@ -39,20 +40,28 @@ static const rb_data_type_t rg_glib_signal_type = {
39
40
  RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
40
41
  };
41
42
 
42
- VALUE
43
- rbgobj_signal_new(guint id)
43
+ static VALUE
44
+ rbgobj_signal_alloc_func(VALUE klass)
44
45
  {
45
- VALUE rb_query;
46
46
  GSignalQuery *query;
47
-
48
- rb_query = TypedData_Make_Struct(RG_TARGET_NAMESPACE,
49
- GSignalQuery,
50
- &rg_glib_signal_type,
51
- query);
52
- g_signal_query(id, query);
47
+ VALUE rb_query = TypedData_Make_Struct(RG_TARGET_NAMESPACE,
48
+ GSignalQuery,
49
+ &rg_glib_signal_type,
50
+ query);
53
51
  return rb_query;
54
52
  }
55
53
 
54
+ VALUE
55
+ rbgobj_signal_new(guint id)
56
+ {
57
+ ID id_new;
58
+ CONST_ID(id_new, "new");
59
+ return rb_funcall(RG_TARGET_NAMESPACE,
60
+ id_new,
61
+ 1,
62
+ UINT2NUM(id));
63
+ }
64
+
56
65
  static GSignalQuery *
57
66
  rbgobj_signal_get_raw(VALUE rb_signal)
58
67
  {
@@ -398,17 +407,28 @@ gobj_sig_connect_impl(gboolean after, int argc, VALUE *argv, VALUE self)
398
407
  rbgobj_get_signal_func(signal_id));
399
408
  }
400
409
  }
401
- g_rclosure_attach((GClosure *)rclosure, self);
410
+ g_rclosure_attach_gobject(rclosure, self);
402
411
  g_object = RVAL2GOBJ(self);
403
412
  tag = g_strdup_printf("%s::%s",
404
413
  G_OBJECT_CLASS_NAME(G_OBJECT_GET_CLASS(g_object)),
405
414
  sig_name);
406
- g_rclosure_set_tag((GClosure *)rclosure, tag);
415
+ g_rclosure_set_tag(rclosure, tag);
407
416
  g_free(tag);
408
417
  handler_id = g_signal_connect_closure_by_id(g_object, signal_id, detail,
409
418
  rclosure, after);
419
+ VALUE rb_handler_id = ULONG2NUM(handler_id);
420
+ if (handler_id != 0) {
421
+ VALUE rb_connected_closures = rb_ivar_get(self, id_connected_closures);
422
+ if (NIL_P(rb_connected_closures)) {
423
+ rb_connected_closures = rb_hash_new();
424
+ rb_ivar_set(self, id_connected_closures, rb_connected_closures);
425
+ }
426
+ rb_hash_aset(rb_connected_closures,
427
+ rb_handler_id,
428
+ POINTER2NUM(rclosure));
429
+ }
410
430
 
411
- return ULONG2NUM(handler_id);
431
+ return rb_handler_id;
412
432
  }
413
433
 
414
434
  static VALUE
@@ -595,6 +615,19 @@ static VALUE
595
615
  gobj_sig_handler_disconnect(VALUE self, VALUE id)
596
616
  {
597
617
  g_signal_handler_disconnect(RVAL2GOBJ(self), NUM2ULONG(id));
618
+ VALUE rb_connected_closures = rb_ivar_get(self, id_connected_closures);
619
+ if (NIL_P(rb_connected_closures)) {
620
+ return self;
621
+ }
622
+ VALUE rb_rclosure_pointer = rb_hash_aref(rb_connected_closures, id);
623
+ if (NIL_P(rb_rclosure_pointer)) {
624
+ return self;
625
+ }
626
+ GClosure *rclosure = NUM2POINTER(rb_rclosure_pointer);
627
+ if (!rclosure) {
628
+ return self;
629
+ }
630
+ g_rclosure_detach_gobject(rclosure, self);
598
631
  return self;
599
632
  }
600
633
 
@@ -725,7 +758,7 @@ gobj_s_signal_handler_attach(VALUE klass,
725
758
  Qnil,
726
759
  rbgobj_get_signal_func(signal_id));
727
760
  g_rclosure_set_tag(rclosure, handler_name);
728
- g_rclosure_attach((GClosure *)rclosure, klass);
761
+ g_rclosure_attach(rclosure, klass);
729
762
  g_signal_override_class_closure(signal_id, cinfo->gtype, rclosure);
730
763
 
731
764
  {
@@ -745,6 +778,13 @@ rbgobj_signal_wrap(guint sig_id)
745
778
  return rbgobj_signal_new(sig_id);
746
779
  }
747
780
 
781
+ static VALUE
782
+ rg_initialize(VALUE self, VALUE id)
783
+ {
784
+ g_signal_query(NUM2UINT(id), rbgobj_signal_get_raw(self));
785
+ return RUBY_Qnil;
786
+ }
787
+
748
788
  static VALUE
749
789
  rg_id(VALUE self)
750
790
  {
@@ -955,10 +995,14 @@ rbgobj_define_action_methods(VALUE klass)
955
995
  void
956
996
  Init_gobject_gsignal(void)
957
997
  {
998
+ id_connected_closures = rb_intern("connected_closures");
999
+
958
1000
  VALUE cSignalFlags, cSignalMatchType;
959
1001
 
960
- RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Signal", rb_cObject);
1002
+ RG_TARGET_NAMESPACE = rb_define_class_under(rbg_mGLib(), "Signal", rb_cObject);
1003
+ rb_define_alloc_func(RG_TARGET_NAMESPACE, rbgobj_signal_alloc_func);
961
1004
 
1005
+ RG_DEF_METHOD(initialize, 1);
962
1006
  RG_DEF_METHOD(id, 0);
963
1007
  RG_DEF_METHOD(name, 0);
964
1008
  RG_DEF_METHOD(flags, 0);
@@ -972,7 +1016,7 @@ Init_gobject_gsignal(void)
972
1016
  RG_DEF_METHOD(remove_emission_hook, 1);
973
1017
 
974
1018
  /* GSignalFlags */
975
- cSignalFlags = G_DEF_CLASS(G_TYPE_SIGNAL_FLAGS, "SignalFlags", mGLib);
1019
+ cSignalFlags = G_DEF_CLASS(G_TYPE_SIGNAL_FLAGS, "SignalFlags", rbg_mGLib());
976
1020
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_SIGNAL_FLAGS, "G_SIGNAL_");
977
1021
  rb_define_const(cSignalFlags, "MASK", INT2NUM(G_SIGNAL_FLAGS_MASK));
978
1022
  rb_define_const(RG_TARGET_NAMESPACE, "FLAGS_MASK", INT2NUM(G_SIGNAL_FLAGS_MASK));
@@ -986,19 +1030,19 @@ Init_gobject_gsignal(void)
986
1030
  rbg_define_method(RG_TARGET_NAMESPACE, "no_hooks?", query_is_G_SIGNAL_NO_HOOKS, 0);
987
1031
 
988
1032
  /* GConnectFlags */
989
- G_DEF_CLASS(G_TYPE_CONNECT_FLAGS, "ConnectFlags", mGLib);
1033
+ G_DEF_CLASS(G_TYPE_CONNECT_FLAGS, "ConnectFlags", rbg_mGLib());
990
1034
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_CONNECT_FLAGS, "G_");
991
1035
 
992
1036
  /* GSignalMatchType */
993
1037
  cSignalMatchType = G_DEF_CLASS(G_TYPE_SIGNAL_MATCH_TYPE,
994
- "SignalMatchType", mGLib);
1038
+ "SignalMatchType", rbg_mGLib());
995
1039
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_SIGNAL_MATCH_TYPE, "G_SIGNAL_");
996
1040
  rb_define_const(cSignalMatchType, "MASK", INT2NUM(G_SIGNAL_MATCH_MASK));
997
1041
  rb_define_const(RG_TARGET_NAMESPACE, "MATCH_MASK", INT2NUM(G_SIGNAL_MATCH_MASK));
998
1042
 
999
1043
  rb_define_const(RG_TARGET_NAMESPACE, "TYPE_STATIC_SCOPE", INT2FIX(G_SIGNAL_TYPE_STATIC_SCOPE));
1000
1044
 
1001
- eNoSignalError = rb_define_class_under(mGLib, "NoSignalError", rb_eNameError);
1045
+ eNoSignalError = rb_define_class_under(rbg_mGLib(), "NoSignalError", rb_eNameError);
1002
1046
 
1003
1047
  rbg_signal_func_table = g_hash_table_new(g_direct_hash, g_direct_equal);
1004
1048
  g_mutex_init(&rbg_signal_func_table_mutex);
@@ -993,12 +993,12 @@ Init_gobject_gtype(void)
993
993
  id_lock = rb_intern("lock");
994
994
  id_unlock = rb_intern("unlock");
995
995
  lookup_class_mutex = rb_funcall(rb_cMutex, id_new, 0);
996
- rb_iv_set(mGLib, "lookup_class_mutex", lookup_class_mutex);
996
+ rb_iv_set(rbg_mGLib(), "lookup_class_mutex", lookup_class_mutex);
997
997
 
998
998
  dynamic_gtype_list = g_hash_table_new(g_str_hash, g_str_equal);
999
999
  id_gtype = rb_intern("__gobject_gtype__");
1000
1000
 
1001
- RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Type", rb_cObject);
1001
+ RG_TARGET_NAMESPACE = rb_define_class_under(rbg_mGLib(), "Type", rb_cObject);
1002
1002
 
1003
1003
  RG_DEF_SMETHOD(try_convert, 1);
1004
1004
 
@@ -125,7 +125,7 @@ void
125
125
  Init_gobject_typeinstance(void)
126
126
  {
127
127
  /* should be renamed to GLib::Instance? */
128
- RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Instantiatable", rb_cObject);
128
+ RG_TARGET_NAMESPACE = rb_define_class_under(rbg_mGLib(), "Instantiatable", rb_cObject);
129
129
  rb_extend_object(RG_TARGET_NAMESPACE, mMetaInterface);
130
130
 
131
131
  rb_define_alloc_func(RG_TARGET_NAMESPACE, (VALUE(*)_((VALUE)))instantiatable_s_allocate);
@@ -107,7 +107,7 @@ rg_property(VALUE self, VALUE property_name)
107
107
  rb_raise(rb_eTypeError, "%s isn't interface module", rb_class2name(self));
108
108
  /* XXX: g_type_default_interface_ref(G_TYPE_INTERFACE) causes SEGV. */
109
109
  if (gtype == G_TYPE_INTERFACE) {
110
- rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
110
+ rb_raise(rb_const_get(rbg_mGLib(), rb_intern("NoPropertyError")),
111
111
  "No such property: %s", name);
112
112
  }
113
113
 
@@ -115,7 +115,7 @@ rg_property(VALUE self, VALUE property_name)
115
115
  prop = g_object_interface_find_property(ginterface, name);
116
116
  if (!prop){
117
117
  g_type_default_interface_unref(ginterface);
118
- rb_raise(rb_const_get(mGLib, rb_intern("NoPropertyError")),
118
+ rb_raise(rb_const_get(rbg_mGLib(), rb_intern("NoPropertyError")),
119
119
  "No such property: %s", name);
120
120
  }
121
121
  result = GOBJ2RVAL(prop);
@@ -173,7 +173,7 @@ rbgobj_init_interface(VALUE interf)
173
173
  void
174
174
  Init_gobject_typeinterface(void)
175
175
  {
176
- RG_TARGET_NAMESPACE = rb_define_module_under(mGLib, "MetaInterface");
176
+ RG_TARGET_NAMESPACE = rb_define_module_under(rbg_mGLib(), "MetaInterface");
177
177
  rbg_define_method(RG_TARGET_NAMESPACE, "gtype", generic_s_gtype, 0);
178
178
  RG_DEF_METHOD(append_features, 1);
179
179
  RG_DEF_METHOD(included, 1);
@@ -181,5 +181,5 @@ Init_gobject_typeinterface(void)
181
181
  RG_DEF_METHOD(property, 1);
182
182
  RG_DEF_METHOD(properties, -1);
183
183
 
184
- rbgobj_mInterface = G_DEF_INTERFACE(G_TYPE_INTERFACE, "Interface", mGLib);
184
+ rbgobj_mInterface = G_DEF_INTERFACE(G_TYPE_INTERFACE, "Interface", rbg_mGLib());
185
185
  }
@@ -64,7 +64,7 @@ void g_type_module_add_interface (GTypeModule *module,
64
64
  void
65
65
  Init_gobject_gtypemodule(void)
66
66
  {
67
- VALUE RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_TYPE_MODULE, "TypeModule", mGLib);
67
+ VALUE RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_TYPE_MODULE, "TypeModule", rbg_mGLib());
68
68
  RG_DEF_METHOD(use, 0);
69
69
  RG_DEF_METHOD(unuse, 0);
70
70
  RG_DEF_METHOD(name, 0);
@@ -51,7 +51,7 @@ void g_type_plugin_complete_interface_info (GTypePlugin *plugin,
51
51
  void
52
52
  Init_gobject_gtypeplugin(void)
53
53
  {
54
- VALUE RG_TARGET_NAMESPACE = G_DEF_INTERFACE(G_TYPE_TYPE_PLUGIN, "TypePlugin", mGLib);
54
+ VALUE RG_TARGET_NAMESPACE = G_DEF_INTERFACE(G_TYPE_TYPE_PLUGIN, "TypePlugin", rbg_mGLib());
55
55
  RG_DEF_METHOD(use, 0);
56
56
  RG_DEF_METHOD(unuse, 0);
57
57
  }
@@ -422,7 +422,7 @@ Init_gobject_gvalue(void)
422
422
  qRValueToGValueFunc = g_quark_from_static_string("__ruby_r2g_func__");
423
423
  qGValueToRValueFunc = g_quark_from_static_string("__ruby_g2r_func__");
424
424
 
425
- RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_VALUE, "Value", mGLib);
425
+ RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_VALUE, "Value", rbg_mGLib());
426
426
  RG_DEF_METHOD(initialize, -1);
427
427
  RG_DEF_METHOD(type, 0);
428
428
  RG_DEF_METHOD(value, 0);
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2011-2020 Ruby-GNOME Project Team
3
+ * Copyright (C) 2011-2022 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
@@ -22,11 +22,21 @@
22
22
  #include "rbgprivate.h"
23
23
  #include "rbgobject.h"
24
24
 
25
+ static const rb_data_type_t rbg_pointer_type = {
26
+ "GLib::Poitner",
27
+ {
28
+ NULL,
29
+ NULL,
30
+ },
31
+ NULL,
32
+ NULL,
33
+ RUBY_TYPED_FREE_IMMEDIATELY,
34
+ };
25
35
 
26
36
  VALUE
27
37
  rbgobj_ptr_new(GType type, gpointer ptr)
28
38
  {
29
- return Data_Wrap_Struct(GTYPE2CLASS(type), NULL, NULL, ptr);
39
+ return TypedData_Wrap_Struct(GTYPE2CLASS(type), &rbg_pointer_type, ptr);
30
40
  }
31
41
 
32
42
  gpointer
@@ -34,7 +44,7 @@ rbgobj_ptr2cptr(VALUE ptr)
34
44
  {
35
45
  gpointer dest;
36
46
  if (rb_obj_is_kind_of(ptr, GTYPE2CLASS(G_TYPE_POINTER))){
37
- Data_Get_Struct(ptr, void, dest);
47
+ TypedData_Get_Struct(ptr, void, &rbg_pointer_type, dest);
38
48
  } else if (rb_obj_is_kind_of(ptr, rb_cObject)){
39
49
  dest = (gpointer)ptr;
40
50
  } else{
@@ -58,7 +68,7 @@ ptr_gtype(VALUE self)
58
68
  static void
59
69
  Init_gtype_pointer(void)
60
70
  {
61
- VALUE cPtr = G_DEF_CLASS(G_TYPE_POINTER, "Pointer", mGLib);
71
+ VALUE cPtr = G_DEF_CLASS(G_TYPE_POINTER, "Pointer", rbg_mGLib());
62
72
  rbg_define_singleton_method(cPtr, "gtype", ptr_s_gtype, 1);
63
73
  rbg_define_method(cPtr, "gtype", ptr_gtype, 1);
64
74
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2003-2021 Ruby-GNOME Project Team
3
+ * Copyright (C) 2003-2022 Ruby-GNOME Project Team
4
4
  * Copyright (C) 2002,2003 Masahiro Sakai
5
5
  * Copyright (C) 1998-2000 Yukihiro Matsumoto,
6
6
  * Daisuke Kanda,
@@ -179,12 +179,7 @@ rbgobj_ruby_object_from_instance_with_unref(gpointer instance)
179
179
  void
180
180
  rbgobj_add_relative(VALUE obj, VALUE relative)
181
181
  {
182
- static VALUE mGLibObject = Qnil;
183
- if (NIL_P(mGLibObject)) {
184
- mGLibObject = rb_const_get(mGLib, rb_intern("Object"));
185
- }
186
-
187
- if (rb_obj_is_kind_of(obj, mGLibObject)) {
182
+ if (rb_obj_is_kind_of(obj, rbg_cGLibObject())) {
188
183
  rbgobj_object_add_relative(obj, relative);
189
184
  } else {
190
185
  VALUE rb_gc_marker = Qnil;
@@ -212,13 +207,8 @@ rbgobj_invalidate_relatives(VALUE obj)
212
207
  void
213
208
  rbgobj_add_relative_removable(VALUE obj, VALUE relative, ID obj_ivar_id, VALUE hash_key)
214
209
  {
215
- static VALUE cGLibObject = Qnil;
216
- if (NIL_P(cGLibObject)) {
217
- cGLibObject = rb_const_get(mGLib, rb_intern("Object"));
218
- }
219
-
220
210
  if (obj_ivar_id == rbgobj_id_children &&
221
- rb_obj_is_kind_of(obj, cGLibObject)) {
211
+ rb_obj_is_kind_of(obj, rbg_cGLibObject())) {
222
212
  rbgobj_object_add_relative(obj, hash_key);
223
213
  } else {
224
214
  VALUE hash = Qnil;
@@ -251,17 +241,12 @@ rbgobj_get_relative_removable(VALUE obj, ID obj_ivar_id, VALUE hash_key)
251
241
  void
252
242
  rbgobj_remove_relative(VALUE obj, ID obj_ivar_id, VALUE relative)
253
243
  {
254
- static VALUE cGLibObject = Qnil;
255
- if (NIL_P(cGLibObject)) {
256
- cGLibObject = rb_const_get(mGLib, rb_intern("Object"));
257
- }
258
-
259
244
  if (obj_ivar_id == (ID)0) {
260
245
  obj_ivar_id = id_relatives;
261
246
  }
262
247
 
263
248
  if ((obj_ivar_id == id_relatives || obj_ivar_id == rbgobj_id_children) &&
264
- rb_obj_is_kind_of(obj, cGLibObject)) {
249
+ rb_obj_is_kind_of(obj, rbg_cGLibObject())) {
265
250
  rbgobj_object_remove_relative(obj, relative);
266
251
  } else {
267
252
  VALUE rb_gc_marker = Qnil;
@@ -343,7 +328,7 @@ rbgobj_define_property_accessors(VALUE klass)
343
328
 
344
329
  if (pspec->flags & G_PARAM_READABLE){
345
330
  g_string_append_printf(
346
- source,
331
+ source,
347
332
  "def %s%s; get_property('%s'); end\n",
348
333
  prop_name,
349
334
  (G_PARAM_SPEC_VALUE_TYPE(pspec) == G_TYPE_BOOLEAN) ? "?" : "",
@@ -361,11 +346,12 @@ rbgobj_define_property_accessors(VALUE klass)
361
346
  g_free(buf);
362
347
  }
363
348
 
364
- if (source->len > 0)
349
+ if (source->len > 0) {
365
350
  rb_funcall(klass, id_module_eval, 3,
366
351
  rb_str_new2(source->str),
367
352
  rb_str_new2(__FILE__),
368
353
  INT2NUM(__LINE__));
354
+ }
369
355
  g_string_free(source, TRUE);
370
356
  }
371
357
 
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2003-2021 Ruby-GNOME Project Team
3
+ * Copyright (C) 2003-2022 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
@@ -237,6 +237,9 @@ extern GClosure* g_rclosure_new_call(VALUE callback_proc,
237
237
  VALUE extra_args,
238
238
  RGClosureCallFunc func);
239
239
  extern void g_rclosure_attach(GClosure *closure, VALUE object);
240
+ extern void g_rclosure_attach_gobject(GClosure *closure, VALUE object);
241
+ extern void g_rclosure_detach(GClosure *closure, VALUE object);
242
+ extern void g_rclosure_detach_gobject(GClosure *closure, VALUE object);
240
243
  extern void g_rclosure_set_tag(GClosure *closure, const gchar *tag);
241
244
 
242
245
  /* rbgobj_value.c */
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2007-2021 Ruby-GNOME Project Team
3
+ * Copyright (C) 2007-2022 Ruby-GNOME Project Team
4
4
  *
5
5
  * This library is free software; you can redistribute it and/or
6
6
  * modify it under the terms of the GNU Lesser General Public
@@ -22,12 +22,15 @@
22
22
 
23
23
  /*
24
24
  * CentOS 7: GLib 2.50
25
- * CentOS 8: GLib 2.56
26
- * Ubuntu 16.04: GLib 2.48
25
+ * AlmaLinux 8: GLib 2.56
26
+ * AlmaLinux 9: GLib 2.68
27
27
  * Ubuntu 18.04: GLib 2.56
28
28
  * Ubuntu 20.04: GLib 2.64
29
+ * Ubuntu 22.04: GLib 2.72
29
30
  */
30
- #define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_48
31
+ #define GLIB_VERSION_MIN_REQUIRED GLIB_VERSION_2_50
32
+
33
+ #define G_LOG_DOMAIN "Ruby/GLib2"
31
34
 
32
35
  #include "rbgobject.h"
33
36
 
data/ext/glib2/rbgutil.c CHANGED
@@ -46,6 +46,25 @@ rbg_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int arg
46
46
  INT2NUM(__LINE__));
47
47
  }
48
48
 
49
+ void
50
+ rbg_define_private_method(VALUE klass,
51
+ const char *name,
52
+ VALUE (*func)(ANYARGS),
53
+ int argc)
54
+ {
55
+ rb_define_private_method(klass, name, func, argc);
56
+ if ((argc != 1) || strncmp(name, "set_", 4))
57
+ return;
58
+
59
+ name += 4;
60
+ rb_funcall(klass, rbgutil_id_module_eval, 3,
61
+ CSTR2RVAL_FREE(g_strdup_printf("def %s=(val); set_%s(val); val; end\n"
62
+ "private :%s=\n",
63
+ name, name, name)),
64
+ rb_str_new2(__FILE__),
65
+ INT2NUM(__LINE__));
66
+ }
67
+
49
68
  void
50
69
  rbg_define_singleton_method(VALUE obj, const char *name, VALUE (*func)(ANYARGS), int argc)
51
70
  {
@@ -84,7 +103,7 @@ rbgutil_set_properties(VALUE self, VALUE hash)
84
103
  VALUE
85
104
  rbgutil_def_setters(VALUE klass)
86
105
  {
87
- return rb_funcall(mGLib, id_add_one_arg_setter, 1, klass);
106
+ return rb_funcall(rbg_mGLib(), id_add_one_arg_setter, 1, klass);
88
107
  }
89
108
 
90
109
  void
data/ext/glib2/rbgutil.h CHANGED
@@ -55,6 +55,8 @@ G_BEGIN_DECLS
55
55
  #define RG_DEF_ATTR(attr, read, write, ex) \
56
56
  rb_attr(RG_TARGET_NAMESPACE, rb_intern(attr), read, write, ex)
57
57
  #define RG_DEF_ALIAS(new, old) rb_define_alias(RG_TARGET_NAMESPACE, new, old)
58
+ #define RG_DEF_PRIVATE_METHOD(method, argc) \
59
+ rbg_define_private_method(RG_TARGET_NAMESPACE, #method, rg_ ## method, argc)
58
60
 
59
61
  #define RG_REG_GLIBID_SETTER(name) \
60
62
  rbgobj_register_property_setter(CLASS2GTYPE(RG_TARGET_NAMESPACE), name, rbgutil_glibid_r2g_func)
@@ -88,6 +90,7 @@ G_BEGIN_DECLS
88
90
  (rbgutil_string_set_utf8_encoding(string))
89
91
 
90
92
  extern void rbg_define_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc);
93
+ extern void rbg_define_private_method(VALUE klass, const char *name, VALUE (*func)(ANYARGS), int argc);
91
94
  extern void rbg_define_singleton_method(VALUE obj, const char *name, VALUE (*func)(ANYARGS), int argc);
92
95
  extern VALUE rbgutil_def_setters(VALUE klass);
93
96
  extern void rbgutil_set_properties(VALUE self, VALUE hash);
@@ -56,7 +56,7 @@ rbgutil_protect(VALUE (*func) (VALUE), VALUE data)
56
56
  void
57
57
  rbgutil_on_callback_error(VALUE error)
58
58
  {
59
- rb_funcall(mGLib, id_exit_application, 2, error, INT2NUM(EXIT_FAILURE));
59
+ rb_funcall(rbg_mGLib(), id_exit_application, 2, error, INT2NUM(EXIT_FAILURE));
60
60
  }
61
61
 
62
62
  /**********************************************************************/
@@ -228,13 +228,13 @@ rbgutil_start_callback_dispatch_thread(void)
228
228
  VALUE callback_dispatch_thread;
229
229
 
230
230
  g_mutex_lock(&callback_dispatch_thread_mutex);
231
- callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
231
+ callback_dispatch_thread = rb_ivar_get(rbg_mGLib(), id_callback_dispatch_thread);
232
232
  if (NIL_P(callback_dispatch_thread)) {
233
233
  if (pipe(callback_pipe_fds) == -1)
234
234
  rb_sys_fail("pipe()");
235
235
 
236
236
  callback_dispatch_thread = rb_thread_create(mainloop, NULL);
237
- rb_ivar_set(mGLib, id_callback_dispatch_thread,
237
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread,
238
238
  callback_dispatch_thread);
239
239
  }
240
240
  g_mutex_unlock(&callback_dispatch_thread_mutex);
@@ -248,10 +248,10 @@ rbgutil_stop_callback_dispatch_thread(void)
248
248
  VALUE callback_dispatch_thread;
249
249
 
250
250
  g_mutex_lock(&callback_dispatch_thread_mutex);
251
- callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
251
+ callback_dispatch_thread = rb_ivar_get(rbg_mGLib(), id_callback_dispatch_thread);
252
252
  if (!NIL_P(callback_dispatch_thread)) {
253
253
  queue_callback_request(NULL);
254
- rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
254
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread, Qnil);
255
255
  }
256
256
  g_mutex_unlock(&callback_dispatch_thread_mutex);
257
257
  #endif
@@ -262,12 +262,12 @@ Init_gutil_callback(void)
262
262
  {
263
263
  id_exit_application = rb_intern("exit_application");
264
264
  rbgutil_eGLibCallbackNotInitializedError =
265
- rb_define_class_under(mGLib, "CallbackNotInitializedError",
265
+ rb_define_class_under(rbg_mGLib(), "CallbackNotInitializedError",
266
266
  rb_eRuntimeError);
267
267
 
268
268
  #ifdef HAVE_NATIVETHREAD
269
269
  id_callback_dispatch_thread = rb_intern("callback_dispatch_thread");
270
- rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
270
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread, Qnil);
271
271
 
272
272
  callback_request_queue = g_async_queue_new();
273
273
  g_mutex_init(&callback_dispatch_thread_mutex);
@@ -0,0 +1,35 @@
1
+ # Copyright (C) 2022 Ruby-GNOME Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ module GLib
18
+ class DateTime
19
+ class << self
20
+ def try_convert(value)
21
+ case value
22
+ when ::Time
23
+ new(year: value.year,
24
+ month: value.month,
25
+ day: value.day,
26
+ hour: value.hour,
27
+ minute: value.min,
28
+ second: value.sec + (value.nsec / 1_000_000_000.0))
29
+ else
30
+ nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,25 @@
1
+ # Copyright (C) 2022 Ruby-GNOME Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ module GLib
18
+ class Variant
19
+ def inspect
20
+ super.gsub(/>\z/) do
21
+ " type=#{type} value=#{value.inspect}>"
22
+ end
23
+ end
24
+ end
25
+ end
data/lib/glib2.rb CHANGED
@@ -335,8 +335,13 @@ GLib::Log.set_log_domain(GLib::Thread::LOG_DOMAIN)
335
335
  GLib::Log.set_log_domain(GLib::Module::LOG_DOMAIN)
336
336
 
337
337
  require "glib2/version"
338
- require "glib2/regex"
338
+
339
339
  require "glib2/deprecated"
340
+
341
+ require "glib2/date-time"
342
+ require "glib2/regex"
343
+ require "glib2/variant"
344
+
340
345
  =begin
341
346
  Don't we need this?
342
347
  ObjectSpace.define_finalizer(GLib) {
data/lib/mkmf-gnome.rb CHANGED
@@ -191,12 +191,12 @@ end
191
191
 
192
192
  def add_depend_package_path(target_name, target_source_dir, target_build_dir)
193
193
  if File.exist?(target_source_dir)
194
- $INCFLAGS = "-I#{target_source_dir} #{$INCFLAGS}"
194
+ $INCFLAGS = "-I#{target_source_dir}".quote + " #{$INCFLAGS}"
195
195
  end
196
196
 
197
197
  return unless File.exist?(target_build_dir)
198
198
  if target_source_dir != target_build_dir
199
- $INCFLAGS = "-I#{target_build_dir} #{$INCFLAGS}"
199
+ $INCFLAGS = "-I#{target_build_dir}".quote + " #{$INCFLAGS}"
200
200
  end
201
201
 
202
202
  library_base_name = File.basename(target_source_dir).gsub(/-/, "_")
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2016-2021 Ruby-GNOME Project Team
1
+ # Copyright (C) 2016-2022 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -24,7 +24,6 @@ class TestDateTime < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  sub_test_case "new" do
27
-
28
27
  test "unix: :local" do
29
28
  time = Time.now
30
29
  format = "%Y-%m-%d-%H-%M"
@@ -111,4 +110,17 @@ class TestDateTime < Test::Unit::TestCase
111
110
  assert_equal(time.sec, datetime.second)
112
111
  end
113
112
  end
113
+
114
+ def test_format_iso8601
115
+ only_glib_version(2, 66, 0)
116
+ datetime = GLib::DateTime.new(year: 2022,
117
+ month: 7,
118
+ day: 18,
119
+ hour: 23,
120
+ minute: 24,
121
+ second: 4.9,
122
+ timezone: GLib::TimeZone.utc)
123
+ assert_equal("2022-07-18T23:24:04.900000Z",
124
+ datetime.format_iso8601)
125
+ end
114
126
  end