glib2 3.4.9 → 4.0.0

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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/ext/glib2/extconf.rb +4 -3
  3. data/ext/glib2/glib2.def +5 -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 +79 -5
  8. data/ext/glib2/rbglib.c +30 -1
  9. data/ext/glib2/rbglib.h +17 -4
  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 +26 -18
  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 +2 -2
  45. data/ext/glib2/rbgobj_closure.c +55 -85
  46. data/ext/glib2/rbgobj_enums.c +4 -3
  47. data/ext/glib2/rbgobj_flags.c +2 -2
  48. data/ext/glib2/rbgobj_object.c +33 -6
  49. data/ext/glib2/rbgobj_param.c +2 -2
  50. data/ext/glib2/rbgobj_signal.c +37 -19
  51. data/ext/glib2/rbgobj_type.c +3 -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 +21 -2
  57. data/ext/glib2/rbgobj_valuetypes.c +14 -4
  58. data/ext/glib2/rbgobject.c +7 -21
  59. data/ext/glib2/rbgobject.h +1 -0
  60. data/ext/glib2/rbgprivate.h +11 -4
  61. data/ext/glib2/rbgutil.c +20 -1
  62. data/ext/glib2/rbgutil.h +6 -2
  63. data/ext/glib2/rbgutil_callback.c +14 -8
  64. data/lib/glib2/date-time.rb +35 -0
  65. data/lib/glib2/variant.rb +25 -0
  66. data/lib/glib2.rb +29 -2
  67. data/lib/mkmf-gnome.rb +5 -4
  68. data/test/glib-test-utils.rb +6 -2
  69. data/test/test-date-time.rb +14 -2
  70. data/test/test-glib2.rb +21 -9
  71. data/test/test-spawn.rb +3 -1
  72. data/test/test-variant.rb +44 -1
  73. metadata +8 -8
  74. data/ext/glib2/glib-enum-types.c +0 -1233
  75. 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
@@ -36,23 +36,31 @@ static const rb_data_type_t rg_glib_signal_type = {
36
36
  },
37
37
  NULL,
38
38
  NULL,
39
- RUBY_TYPED_FREE_IMMEDIATELY,
39
+ RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE,
40
40
  };
41
41
 
42
- VALUE
43
- rbgobj_signal_new(guint id)
42
+ static VALUE
43
+ rbgobj_signal_alloc_func(VALUE klass)
44
44
  {
45
- VALUE rb_query;
46
45
  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);
46
+ VALUE rb_query = TypedData_Make_Struct(RG_TARGET_NAMESPACE,
47
+ GSignalQuery,
48
+ &rg_glib_signal_type,
49
+ query);
53
50
  return rb_query;
54
51
  }
55
52
 
53
+ VALUE
54
+ rbgobj_signal_new(guint id)
55
+ {
56
+ ID id_new;
57
+ CONST_ID(id_new, "new");
58
+ return rb_funcall(RG_TARGET_NAMESPACE,
59
+ id_new,
60
+ 1,
61
+ UINT2NUM(id));
62
+ }
63
+
56
64
  static GSignalQuery *
57
65
  rbgobj_signal_get_raw(VALUE rb_signal)
58
66
  {
@@ -398,15 +406,16 @@ gobj_sig_connect_impl(gboolean after, int argc, VALUE *argv, VALUE self)
398
406
  rbgobj_get_signal_func(signal_id));
399
407
  }
400
408
  }
401
- g_rclosure_attach((GClosure *)rclosure, self);
409
+ g_rclosure_attach_gobject(rclosure, self);
402
410
  g_object = RVAL2GOBJ(self);
403
411
  tag = g_strdup_printf("%s::%s",
404
412
  G_OBJECT_CLASS_NAME(G_OBJECT_GET_CLASS(g_object)),
405
413
  sig_name);
406
- g_rclosure_set_tag((GClosure *)rclosure, tag);
414
+ g_rclosure_set_tag(rclosure, tag);
407
415
  g_free(tag);
408
416
  handler_id = g_signal_connect_closure_by_id(g_object, signal_id, detail,
409
417
  rclosure, after);
418
+ g_closure_unref(rclosure);
410
419
 
411
420
  return ULONG2NUM(handler_id);
412
421
  }
@@ -725,7 +734,7 @@ gobj_s_signal_handler_attach(VALUE klass,
725
734
  Qnil,
726
735
  rbgobj_get_signal_func(signal_id));
727
736
  g_rclosure_set_tag(rclosure, handler_name);
728
- g_rclosure_attach((GClosure *)rclosure, klass);
737
+ g_rclosure_attach(rclosure, klass);
729
738
  g_signal_override_class_closure(signal_id, cinfo->gtype, rclosure);
730
739
 
731
740
  {
@@ -745,6 +754,13 @@ rbgobj_signal_wrap(guint sig_id)
745
754
  return rbgobj_signal_new(sig_id);
746
755
  }
747
756
 
757
+ static VALUE
758
+ rg_initialize(VALUE self, VALUE id)
759
+ {
760
+ g_signal_query(NUM2UINT(id), rbgobj_signal_get_raw(self));
761
+ return RUBY_Qnil;
762
+ }
763
+
748
764
  static VALUE
749
765
  rg_id(VALUE self)
750
766
  {
@@ -957,8 +973,10 @@ Init_gobject_gsignal(void)
957
973
  {
958
974
  VALUE cSignalFlags, cSignalMatchType;
959
975
 
960
- RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Signal", rb_cObject);
976
+ RG_TARGET_NAMESPACE = rb_define_class_under(rbg_mGLib(), "Signal", rb_cObject);
977
+ rb_define_alloc_func(RG_TARGET_NAMESPACE, rbgobj_signal_alloc_func);
961
978
 
979
+ RG_DEF_METHOD(initialize, 1);
962
980
  RG_DEF_METHOD(id, 0);
963
981
  RG_DEF_METHOD(name, 0);
964
982
  RG_DEF_METHOD(flags, 0);
@@ -972,7 +990,7 @@ Init_gobject_gsignal(void)
972
990
  RG_DEF_METHOD(remove_emission_hook, 1);
973
991
 
974
992
  /* GSignalFlags */
975
- cSignalFlags = G_DEF_CLASS(G_TYPE_SIGNAL_FLAGS, "SignalFlags", mGLib);
993
+ cSignalFlags = G_DEF_CLASS(G_TYPE_SIGNAL_FLAGS, "SignalFlags", rbg_mGLib());
976
994
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_SIGNAL_FLAGS, "G_SIGNAL_");
977
995
  rb_define_const(cSignalFlags, "MASK", INT2NUM(G_SIGNAL_FLAGS_MASK));
978
996
  rb_define_const(RG_TARGET_NAMESPACE, "FLAGS_MASK", INT2NUM(G_SIGNAL_FLAGS_MASK));
@@ -986,19 +1004,19 @@ Init_gobject_gsignal(void)
986
1004
  rbg_define_method(RG_TARGET_NAMESPACE, "no_hooks?", query_is_G_SIGNAL_NO_HOOKS, 0);
987
1005
 
988
1006
  /* GConnectFlags */
989
- G_DEF_CLASS(G_TYPE_CONNECT_FLAGS, "ConnectFlags", mGLib);
1007
+ G_DEF_CLASS(G_TYPE_CONNECT_FLAGS, "ConnectFlags", rbg_mGLib());
990
1008
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_CONNECT_FLAGS, "G_");
991
1009
 
992
1010
  /* GSignalMatchType */
993
1011
  cSignalMatchType = G_DEF_CLASS(G_TYPE_SIGNAL_MATCH_TYPE,
994
- "SignalMatchType", mGLib);
1012
+ "SignalMatchType", rbg_mGLib());
995
1013
  G_DEF_CONSTANTS(RG_TARGET_NAMESPACE, G_TYPE_SIGNAL_MATCH_TYPE, "G_SIGNAL_");
996
1014
  rb_define_const(cSignalMatchType, "MASK", INT2NUM(G_SIGNAL_MATCH_MASK));
997
1015
  rb_define_const(RG_TARGET_NAMESPACE, "MATCH_MASK", INT2NUM(G_SIGNAL_MATCH_MASK));
998
1016
 
999
1017
  rb_define_const(RG_TARGET_NAMESPACE, "TYPE_STATIC_SCOPE", INT2FIX(G_SIGNAL_TYPE_STATIC_SCOPE));
1000
1018
 
1001
- eNoSignalError = rb_define_class_under(mGLib, "NoSignalError", rb_eNameError);
1019
+ eNoSignalError = rb_define_class_under(rbg_mGLib(), "NoSignalError", rb_eNameError);
1002
1020
 
1003
1021
  rbg_signal_func_table = g_hash_table_new(g_direct_hash, g_direct_equal);
1004
1022
  g_mutex_init(&rbg_signal_func_table_mutex);
@@ -974,6 +974,7 @@ static inline void
974
974
  _def_fundamental_type(VALUE ary, GType gtype, const char* name)
975
975
  {
976
976
  VALUE c = rbgobj_gtype_new(gtype);
977
+ rb_obj_freeze(c);
977
978
  rb_define_const(RG_TARGET_NAMESPACE, name, c);
978
979
  rb_ary_push(ary, c);
979
980
  }
@@ -992,12 +993,12 @@ Init_gobject_gtype(void)
992
993
  id_lock = rb_intern("lock");
993
994
  id_unlock = rb_intern("unlock");
994
995
  lookup_class_mutex = rb_funcall(rb_cMutex, id_new, 0);
995
- rb_iv_set(mGLib, "lookup_class_mutex", lookup_class_mutex);
996
+ rb_iv_set(rbg_mGLib(), "lookup_class_mutex", lookup_class_mutex);
996
997
 
997
998
  dynamic_gtype_list = g_hash_table_new(g_str_hash, g_str_equal);
998
999
  id_gtype = rb_intern("__gobject_gtype__");
999
1000
 
1000
- RG_TARGET_NAMESPACE = rb_define_class_under(mGLib, "Type", rb_cObject);
1001
+ RG_TARGET_NAMESPACE = rb_define_class_under(rbg_mGLib(), "Type", rb_cObject);
1001
1002
 
1002
1003
  RG_DEF_SMETHOD(try_convert, 1);
1003
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
  }
@@ -129,6 +129,7 @@ rbgobj_gvalue_to_rvalue(const GValue* value)
129
129
  continue;
130
130
  return func(value);
131
131
  }
132
+ return BOXED2RVAL(g_value_get_boxed(value), type);
132
133
  }
133
134
  case G_TYPE_VARIANT:
134
135
  {
@@ -293,7 +294,24 @@ rbgobj_rvalue_to_gvalue(VALUE val, GValue* result)
293
294
  }
294
295
  case G_TYPE_OBJECT:
295
296
  case G_TYPE_INTERFACE:
296
- g_value_set_object(result, NIL_P(val) ? NULL : RVAL2GOBJ(val));
297
+ if (NIL_P(val)) {
298
+ g_value_set_object(result, NULL);
299
+ } else {
300
+ VALUE value_class = GTYPE2CLASS(type);
301
+ ID id_try_convert;
302
+ CONST_ID(id_try_convert, "try_convert");
303
+ if (!NIL_P(value_class) &&
304
+ rb_respond_to(value_class, id_try_convert)) {
305
+ VALUE converted_value = rb_funcall(value_class,
306
+ id_try_convert,
307
+ 1,
308
+ val);
309
+ if (!NIL_P(converted_value)) {
310
+ val = converted_value;
311
+ }
312
+ }
313
+ g_value_set_object(result, RVAL2GOBJ(val));
314
+ }
297
315
  return;
298
316
  case G_TYPE_PARAM:
299
317
  g_value_set_param(result, NIL_P(val) ? NULL : RVAL2GOBJ(val));
@@ -330,6 +348,7 @@ rbgobj_rvalue_to_gvalue(VALUE val, GValue* result)
330
348
  func(val, result);
331
349
  }
332
350
  }
351
+ break;
333
352
  }
334
353
  }
335
354
 
@@ -403,7 +422,7 @@ Init_gobject_gvalue(void)
403
422
  qRValueToGValueFunc = g_quark_from_static_string("__ruby_r2g_func__");
404
423
  qGValueToRValueFunc = g_quark_from_static_string("__ruby_g2r_func__");
405
424
 
406
- RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_VALUE, "Value", mGLib);
425
+ RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_VALUE, "Value", rbg_mGLib());
407
426
  RG_DEF_METHOD(initialize, -1);
408
427
  RG_DEF_METHOD(type, 0);
409
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
 
@@ -237,6 +237,7 @@ 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);
240
241
  extern void g_rclosure_set_tag(GClosure *closure, const gchar *tag);
241
242
 
242
243
  /* 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
 
@@ -43,6 +46,10 @@
43
46
  # define G_VALUE_INIT { 0, { { 0 } } }
44
47
  #endif
45
48
 
49
+ #ifndef RUBY_TYPED_FROZEN_SHAREABLE
50
+ # define RUBY_TYPED_FROZEN_SHAREABLE 0
51
+ #endif
52
+
46
53
  G_BEGIN_DECLS
47
54
 
48
55
  typedef struct {
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
@@ -1,7 +1,7 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2011-2015 Ruby-GNOME2 Project Team
4
- * Copyright (C) 2002,2003 Masao Mutoh
3
+ * Copyright (C) 2011-2022 Ruby-GNOME Project Team
4
+ * Copyright (C) 2002,2003 Masao Mutoh
5
5
  *
6
6
  * This library is free software; you can redistribute it and/or
7
7
  * modify it under the terms of the GNU Lesser General Public
@@ -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,10 +90,12 @@ 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);
94
97
  extern VALUE rbgutil_protect(VALUE (*proc) (VALUE), VALUE data);
98
+ extern void rbgutil_on_callback_error(VALUE error);
95
99
  extern VALUE rbgutil_invoke_callback(VALUE (*func)(VALUE), VALUE arg);
96
100
  extern void rbgutil_start_callback_dispatch_thread(void);
97
101
  extern void rbgutil_stop_callback_dispatch_thread(void);
@@ -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
@@ -49,10 +49,16 @@ rbgutil_protect(VALUE (*func) (VALUE), VALUE data)
49
49
  VALUE ret = rb_protect(func, data, &state);
50
50
  VALUE e = rb_errinfo();
51
51
  if (state && !NIL_P(e))
52
- rb_funcall(mGLib, id_exit_application, 2, e, INT2NUM(EXIT_FAILURE));
52
+ rbgutil_on_callback_error(e);
53
53
  return ret;
54
54
  }
55
55
 
56
+ void
57
+ rbgutil_on_callback_error(VALUE error)
58
+ {
59
+ rb_funcall(rbg_mGLib(), id_exit_application, 2, error, INT2NUM(EXIT_FAILURE));
60
+ }
61
+
56
62
  /**********************************************************************/
57
63
 
58
64
  #ifdef HAVE_NATIVETHREAD
@@ -222,13 +228,13 @@ rbgutil_start_callback_dispatch_thread(void)
222
228
  VALUE callback_dispatch_thread;
223
229
 
224
230
  g_mutex_lock(&callback_dispatch_thread_mutex);
225
- callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
231
+ callback_dispatch_thread = rb_ivar_get(rbg_mGLib(), id_callback_dispatch_thread);
226
232
  if (NIL_P(callback_dispatch_thread)) {
227
233
  if (pipe(callback_pipe_fds) == -1)
228
234
  rb_sys_fail("pipe()");
229
235
 
230
236
  callback_dispatch_thread = rb_thread_create(mainloop, NULL);
231
- rb_ivar_set(mGLib, id_callback_dispatch_thread,
237
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread,
232
238
  callback_dispatch_thread);
233
239
  }
234
240
  g_mutex_unlock(&callback_dispatch_thread_mutex);
@@ -242,10 +248,10 @@ rbgutil_stop_callback_dispatch_thread(void)
242
248
  VALUE callback_dispatch_thread;
243
249
 
244
250
  g_mutex_lock(&callback_dispatch_thread_mutex);
245
- callback_dispatch_thread = rb_ivar_get(mGLib, id_callback_dispatch_thread);
251
+ callback_dispatch_thread = rb_ivar_get(rbg_mGLib(), id_callback_dispatch_thread);
246
252
  if (!NIL_P(callback_dispatch_thread)) {
247
253
  queue_callback_request(NULL);
248
- rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
254
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread, Qnil);
249
255
  }
250
256
  g_mutex_unlock(&callback_dispatch_thread_mutex);
251
257
  #endif
@@ -256,12 +262,12 @@ Init_gutil_callback(void)
256
262
  {
257
263
  id_exit_application = rb_intern("exit_application");
258
264
  rbgutil_eGLibCallbackNotInitializedError =
259
- rb_define_class_under(mGLib, "CallbackNotInitializedError",
265
+ rb_define_class_under(rbg_mGLib(), "CallbackNotInitializedError",
260
266
  rb_eRuntimeError);
261
267
 
262
268
  #ifdef HAVE_NATIVETHREAD
263
269
  id_callback_dispatch_thread = rb_intern("callback_dispatch_thread");
264
- rb_ivar_set(mGLib, id_callback_dispatch_thread, Qnil);
270
+ rb_ivar_set(rbg_mGLib(), id_callback_dispatch_thread, Qnil);
265
271
 
266
272
  callback_request_queue = g_async_queue_new();
267
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