glib2 3.4.9 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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