glib2 3.2.5 → 3.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING.LIB +502 -0
  3. data/README.md +42 -0
  4. data/Rakefile +8 -7
  5. data/ext/glib2/glib2.def +5 -0
  6. data/ext/glib2/rbglib-gc.c +89 -0
  7. data/ext/glib2/rbglib-variant-type.c +17 -0
  8. data/ext/glib2/rbglib.c +3 -0
  9. data/ext/glib2/rbglib.h +6 -1
  10. data/ext/glib2/rbglib2conversions.h +1 -1
  11. data/ext/glib2/rbgobj_boxed.c +49 -30
  12. data/ext/glib2/rbgobj_closure.c +3 -2
  13. data/ext/glib2/rbgobj_convert.c +1 -2
  14. data/ext/glib2/rbgobj_enums.c +32 -14
  15. data/ext/glib2/rbgobj_flags.c +31 -14
  16. data/ext/glib2/rbgobj_param.c +43 -23
  17. data/ext/glib2/rbgobj_signal.c +78 -66
  18. data/ext/glib2/rbgobj_type.c +22 -10
  19. data/ext/glib2/rbgobject.h +2 -0
  20. data/ext/glib2/rbgprivate.h +11 -0
  21. data/glib2.gemspec +48 -0
  22. data/lib/gnome2/rake/package-task.rb +17 -5
  23. data/lib/gnome2/rake/package.rb +2 -2
  24. data/lib/gnome2/rake/windows-binary-build-task.rb +39 -6
  25. data/lib/mkmf-gnome2.rb +4 -3
  26. data/sample/bookmarkfile.rb +2 -2
  27. data/sample/type-register.rb +6 -6
  28. data/sample/type-register2.rb +6 -6
  29. data/test/{test_enum.rb → test-enum.rb} +0 -0
  30. data/test/{test_file_utils.rb → test-file-utils.rb} +0 -0
  31. data/test/{test_flags.rb → test-flags.rb} +0 -0
  32. data/test/{test_glib2.rb → test-glib2.rb} +0 -0
  33. data/test/{test_key_file.rb → test-key-file.rb} +0 -0
  34. data/test/{test_mkenums.rb → test-mkenums.rb} +0 -0
  35. data/test/{test_poll_fd.rb → test-poll-fd.rb} +0 -0
  36. data/test/{test_signal.rb → test-signal.rb} +34 -2
  37. data/test/{test_source.rb → test-source.rb} +0 -0
  38. data/test/{test_spawn.rb → test-spawn.rb} +0 -0
  39. data/test/{test_timeout.rb → test-timeout.rb} +0 -0
  40. data/test/{test_unicode.rb → test-unicode.rb} +0 -0
  41. data/test/{test_utils.rb → test-utils.rb} +0 -0
  42. data/test/{test_value.rb → test-value.rb} +0 -0
  43. data/test/test-variant.rb +27 -0
  44. data/test/{test_win32.rb → test-win32.rb} +0 -0
  45. data/version.rb +30 -0
  46. metadata +29 -64
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # Ruby/GLib2
2
+
3
+ Ruby/GLib2 is a Ruby binding of GLib-2.12.x.
4
+
5
+ ## Requirements
6
+
7
+ Ruby >= 1.9.x: http://www.ruby-lang.org/
8
+ pkg-config.rb: http://github.com/rcairo/pkg-config
9
+ GLib >= 2.12.x: http://www.gtk.org/
10
+
11
+ ## Install (RubyGems)
12
+
13
+ ```
14
+ % sudo gem install glib2
15
+ ```
16
+ Windows:
17
+
18
+ ```
19
+ > gem install glib2 --platform x86-mingw32
20
+ ```
21
+
22
+ ## Install (traditional)
23
+
24
+ Install ruby-1.9.x or later, pkg-config.rb and GLib-2.12.x.
25
+
26
+ ```
27
+ % ruby extconf.rb
28
+ % make
29
+ % sudo make install
30
+ ```
31
+
32
+ ## Copying
33
+
34
+ Copyright (c) 2002-2010 Ruby-GNOME2 Project Team
35
+
36
+ This program is free software.
37
+ You can distribute/modify this program under the terms of
38
+ the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
39
+
40
+ ## Project Website
41
+
42
+ https://ruby-gnome2.osdn.jp/
data/Rakefile CHANGED
@@ -26,7 +26,10 @@ libffi_lib_dir = nil
26
26
 
27
27
  build_host = nil
28
28
 
29
- package_task = GNOME2::Rake::PackageTask.new do |package|
29
+ package_name = File.basename(__dir__)
30
+ spec = Gem::Specification.load("#{package_name}.gemspec")
31
+
32
+ package_task = GNOME2::Rake::PackageTask.new(spec, __dir__) do |package|
30
33
  bin_dir = (package.windows.absolute_binary_dir + "bin").to_s
31
34
  include_dir = (package.windows.absolute_binary_dir + "include").to_s
32
35
  glib2_include_dir = File.join(include_dir, "glib-2.0")
@@ -34,7 +37,6 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
34
37
 
35
38
  build_host = package.windows.build_host
36
39
 
37
- package.summary = "Ruby/GLib2 is a Ruby binding of GLib-2.x."
38
40
  package.description = "Ruby/GLib2 is a Ruby binding of GLib-2.x."
39
41
  package.dependency.gem.runtime = [
40
42
  ["pkg-config", ">= 1.2.2"],
@@ -88,13 +90,12 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
88
90
  :name => "glib",
89
91
  :download_site => :gnome,
90
92
  :label => "GLib",
91
- :version => "2.56.0",
93
+ :version => "2.56.1",
92
94
  :compression_method => "xz",
93
95
  :windows => {
94
96
  :need_autoreconf => true,
95
97
  :patches => [
96
98
  "glib-2.54.1-add-missing-exeext.diff",
97
- "glib-2.56.0-add-missing-weekday-full-is-locale.patch",
98
99
  ],
99
100
  :built_file => "bin/libglib-2.0-0.dll",
100
101
  },
@@ -137,7 +138,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
137
138
  :download_site => :gnu,
138
139
  :download_name => "libidn",
139
140
  :label => "Libidn2",
140
- :version => "2.0.4",
141
+ :version => "2.0.5",
141
142
  :windows => {
142
143
  :built_file => "bin/libidn2-0.dll",
143
144
  },
@@ -146,7 +147,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
146
147
  :name => "p11-glue/p11-kit",
147
148
  :download_site => :github,
148
149
  :label => "p11-kit",
149
- :version => "0.23.3",
150
+ :version => "0.23.12",
150
151
  :windows => {
151
152
  :built_file => "bin/libp11-kit-0.dll",
152
153
  },
@@ -173,7 +174,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
173
174
  :name => "glib-networking",
174
175
  :download_site => :gnome,
175
176
  :label => "glib-networking",
176
- :version => "2.56.0",
177
+ :version => "2.56.1",
177
178
  :compression_method => "xz",
178
179
  :windows => {
179
180
  :meson_args => [
data/ext/glib2/glib2.def CHANGED
@@ -70,6 +70,7 @@ EXPORTS
70
70
  rbgobj_get_signal_call_func
71
71
  rbgobj_add_constants
72
72
  rbgobj_constant_remap
73
+ rbgobj_signal_new
73
74
  rbgobj_signal_wrap
74
75
  g_rclosure_new
75
76
  g_rclosure_new_call
@@ -165,6 +166,10 @@ EXPORTS
165
166
  rbglib_int64_to_num
166
167
  rbg_variant_to_ruby
167
168
  rbg_variant_from_ruby
169
+ rbg_variant_type_from_ruby
170
+
171
+ rbg_gc_guard
172
+ rbg_gc_unguard
168
173
 
169
174
  g_source_get_type
170
175
  g_connect_flags_get_type
@@ -0,0 +1,89 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2018 Ruby-GNOME2 Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rbgprivate.h"
22
+
23
+ static GHashTable *rbg_objects = NULL;
24
+
25
+ static void
26
+ gc_marker_mark_each(gpointer key, gpointer value, gpointer user_data)
27
+ {
28
+ VALUE rb_object = (VALUE)value;
29
+ rb_gc_mark(rb_object);
30
+ }
31
+
32
+ static void
33
+ gc_marker_mark(void *data)
34
+ {
35
+ GHashTable *hash_table = data;
36
+ g_hash_table_foreach(hash_table, gc_marker_mark_each, NULL);
37
+ }
38
+
39
+ static void
40
+ gc_marker_free(void *data)
41
+ {
42
+ GHashTable *hash_table = data;
43
+ g_hash_table_unref(hash_table);
44
+ rbg_objects = NULL;
45
+ }
46
+
47
+ static const rb_data_type_t rbg_gc_marker_type = {
48
+ "GLib::GCMarker",
49
+ {
50
+ gc_marker_mark,
51
+ gc_marker_free,
52
+ NULL,
53
+ },
54
+ NULL,
55
+ NULL,
56
+ RUBY_TYPED_FREE_IMMEDIATELY,
57
+ };
58
+
59
+ void
60
+ rbg_gc_guard(gpointer key, VALUE rb_object)
61
+ {
62
+ if (!rbg_objects)
63
+ return;
64
+
65
+ g_hash_table_insert(rbg_objects,
66
+ key,
67
+ (gpointer)rb_object);
68
+ }
69
+
70
+ void
71
+ rbg_gc_unguard(gpointer key)
72
+ {
73
+ if (!rbg_objects)
74
+ return;
75
+
76
+ g_hash_table_remove(rbg_objects, key);
77
+ }
78
+
79
+ void
80
+ Init_glib_gc(void)
81
+ {
82
+ VALUE gc_marker;
83
+
84
+ rbg_objects = g_hash_table_new(g_direct_hash, g_direct_equal);
85
+ gc_marker = TypedData_Wrap_Struct(rb_cData,
86
+ &rbg_gc_marker_type,
87
+ rbg_objects);
88
+ rb_ivar_set(mGLib, rb_intern("gc_marker"), gc_marker);
89
+ }
@@ -26,6 +26,23 @@
26
26
 
27
27
  static VALUE RG_TARGET_NAMESPACE;
28
28
 
29
+ GVariantType *
30
+ rbg_variant_type_from_ruby(VALUE rb_variant_type)
31
+ {
32
+ if (NIL_P(rb_variant_type)) {
33
+ return NULL;
34
+ }
35
+
36
+ if (RB_TYPE_P(rb_variant_type, RUBY_T_STRING)) {
37
+ rb_variant_type = rb_funcall(RG_TARGET_NAMESPACE,
38
+ rb_intern("new"),
39
+ 1,
40
+ rb_variant_type);
41
+ }
42
+
43
+ return RVAL2BOXED(rb_variant_type, G_TYPE_VARIANT_TYPE);
44
+ }
45
+
29
46
  static VALUE
30
47
  rg_s_valid_p(G_GNUC_UNUSED VALUE klass, VALUE rb_string)
31
48
  {
data/ext/glib2/rbglib.c CHANGED
@@ -1146,6 +1146,9 @@ union GDoubleIEEE754;
1146
1146
  rb_define_const(RG_TARGET_NAMESPACE, "PRIORITY_LOW", INT2FIX(G_PRIORITY_LOW));
1147
1147
 
1148
1148
  /* Init_mem(); */
1149
+
1150
+ Init_glib_gc();
1151
+
1149
1152
  Init_gutil();
1150
1153
  Init_gutil_callback();
1151
1154
 
data/ext/glib2/rbglib.h CHANGED
@@ -36,7 +36,7 @@ extern "C" {
36
36
 
37
37
  #define RBGLIB_MAJOR_VERSION 3
38
38
  #define RBGLIB_MINOR_VERSION 2
39
- #define RBGLIB_MICRO_VERSION 5
39
+ #define RBGLIB_MICRO_VERSION 6
40
40
 
41
41
  #ifndef RB_ZALLOC
42
42
  # ifdef ZALLOC
@@ -232,6 +232,11 @@ extern guint64 rbglib_num_to_uint64(VALUE val);
232
232
  extern VALUE rbg_variant_to_ruby(GVariant *variant);
233
233
  extern GVariant *rbg_variant_from_ruby(VALUE rb_variant);
234
234
 
235
+ extern GVariantType *rbg_variant_type_from_ruby(VALUE rb_variant_type);
236
+
237
+
238
+ extern void rbg_gc_guard(gpointer key, VALUE rb_object);
239
+ extern void rbg_gc_unguard(gpointer key);
235
240
 
236
241
  #ifdef __cplusplus
237
242
  }
@@ -41,7 +41,7 @@
41
41
  #define GTIMER2RVAL(o) (BOXED2RVAL(o, G_TYPE_TIMER))
42
42
  #define RVAL2GVALUE(o) ((GValue*)RVAL2BOXED(o, G_TYPE_VALUE))
43
43
  #define GVALUE2RVAL(o) (BOXED2RVAL(o, G_TYPE_VALUE))
44
- #define RVAL2GVARIANTTYPE(o) ((GVariantType *)RVAL2BOXED(o, G_TYPE_VARIANT_TYPE))
44
+ #define RVAL2GVARIANTTYPE(o) (rbg_variant_type_from_ruby(o))
45
45
  #define GVARIANTTYPE2RVAL(o) (BOXED2RVAL(o, G_TYPE_VARIANT_TYPE))
46
46
 
47
47
  #define RVAL2GIOCONDITION(o) (RVAL2GFLAGS(o, G_TYPE_IO_CONDITION))
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2011-2017 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2011-2018 Ruby-GNOME2 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
@@ -26,8 +26,9 @@
26
26
  VALUE RG_TARGET_NAMESPACE;
27
27
 
28
28
  static void
29
- boxed_mark(boxed_holder *holder)
29
+ boxed_mark(void *data)
30
30
  {
31
+ boxed_holder *holder = data;
31
32
  const RGObjClassInfo *cinfo;
32
33
 
33
34
  cinfo = GTYPE2CINFO_NO_CREATE(holder->type);
@@ -36,8 +37,9 @@ boxed_mark(boxed_holder *holder)
36
37
  }
37
38
 
38
39
  static void
39
- boxed_free(boxed_holder *holder)
40
+ boxed_free(void *data)
40
41
  {
42
+ boxed_holder *holder = data;
41
43
  const RGObjClassInfo *cinfo;
42
44
 
43
45
  cinfo = GTYPE2CINFO_NO_CREATE(holder->type);
@@ -50,6 +52,26 @@ boxed_free(boxed_holder *holder)
50
52
  xfree(holder);
51
53
  }
52
54
 
55
+ static const rb_data_type_t rg_glib_boxed_type = {
56
+ "GLib::Boxed",
57
+ {
58
+ boxed_mark,
59
+ boxed_free,
60
+ NULL,
61
+ },
62
+ NULL,
63
+ NULL,
64
+ RUBY_TYPED_FREE_IMMEDIATELY,
65
+ };
66
+
67
+ static boxed_holder *
68
+ rbgobj_boxed_get_raw(VALUE rb_boxed)
69
+ {
70
+ boxed_holder *holder;
71
+ TypedData_Get_Struct(rb_boxed, boxed_holder, &rg_glib_boxed_type, holder);
72
+ return holder;
73
+ }
74
+
53
75
  /**********************************************************************/
54
76
 
55
77
  VALUE
@@ -57,18 +79,20 @@ rbgobj_boxed_alloc_func(VALUE klass)
57
79
  {
58
80
  const RGObjClassInfo *cinfo = rbgobj_lookup_class(klass);
59
81
  boxed_holder *holder;
60
- VALUE result;
82
+ VALUE rb_boxed;
61
83
 
62
84
  if (cinfo->gtype == G_TYPE_BOXED)
63
85
  rb_raise(rb_eTypeError, "abstract class");
64
86
 
65
- result = Data_Make_Struct(klass, boxed_holder,
66
- boxed_mark, boxed_free, holder);
87
+ rb_boxed = TypedData_Make_Struct(klass,
88
+ boxed_holder,
89
+ &rg_glib_boxed_type,
90
+ holder);
67
91
  holder->type = cinfo->gtype;
68
92
  holder->boxed = NULL;
69
93
  holder->own = FALSE;
70
94
 
71
- return result;
95
+ return rb_boxed;
72
96
  }
73
97
 
74
98
  static VALUE
@@ -102,21 +126,14 @@ static VALUE
102
126
  rg_inspect(VALUE self)
103
127
  {
104
128
  boxed_holder *holder;
105
- gchar *s;
106
- VALUE result;
107
-
108
- Data_Get_Struct(self, boxed_holder, holder);
109
-
110
- s = g_strdup_printf("#<%s:%p ptr=%p own=%s>",
111
- rb_class2name(CLASS_OF(self)),
112
- (void *)self,
113
- holder->boxed,
114
- holder->own ? "true" : "false");
115
129
 
116
- result = rb_str_new2(s);
117
- g_free(s);
130
+ holder = rbgobj_boxed_get_raw(self);
118
131
 
119
- return result;
132
+ return rb_sprintf("#<%" PRIsVALUE ":%p ptr=%p own=%s>",
133
+ CLASS_OF(self),
134
+ (gpointer)self,
135
+ holder->boxed,
136
+ holder->own ? "true" : "false");
120
137
  }
121
138
 
122
139
  static VALUE
@@ -131,8 +148,8 @@ rg_initialize_copy(VALUE self, VALUE orig)
131
148
  rb_raise(rb_eTypeError, "wrong argument class");
132
149
  }
133
150
 
134
- Data_Get_Struct(self, boxed_holder, holder1);
135
- Data_Get_Struct(orig, boxed_holder, holder2);
151
+ holder1 = rbgobj_boxed_get_raw(self);
152
+ holder2 = rbgobj_boxed_get_raw(orig);
136
153
 
137
154
  holder1->boxed = g_boxed_copy(holder2->type, holder2->boxed);
138
155
  holder1->own = TRUE;
@@ -156,7 +173,7 @@ void
156
173
  rbgobj_boxed_initialize(VALUE obj, gpointer boxed)
157
174
  {
158
175
  boxed_holder *holder;
159
- Data_Get_Struct(obj, boxed_holder, holder);
176
+ holder = rbgobj_boxed_get_raw(obj);
160
177
  holder->boxed = boxed;
161
178
  holder->own = TRUE;
162
179
  }
@@ -167,13 +184,15 @@ rbgobj_boxed_get_default(VALUE obj, GType gtype)
167
184
  boxed_holder *holder;
168
185
 
169
186
  if (!RVAL2CBOOL(rb_obj_is_kind_of(obj, GTYPE2CLASS(gtype))))
170
- rb_raise(rb_eArgError, "invalid argument %s (expect %s)",
171
- rb_class2name(CLASS_OF(obj)),
172
- rb_class2name(GTYPE2CLASS(gtype)));
187
+ rb_raise(rb_eArgError,
188
+ "invalid argument %" PRIsVALUE " (expect %" PRIsVALUE ")",
189
+ CLASS_OF(obj),
190
+ GTYPE2CLASS(gtype));
173
191
 
174
- Data_Get_Struct(obj, boxed_holder, holder);
192
+ holder = rbgobj_boxed_get_raw(obj);
175
193
  if (!holder->boxed)
176
- rb_raise(rb_eArgError, "uninitialize %s", rb_class2name(CLASS_OF(obj)));
194
+ rb_raise(rb_eArgError, "uninitialize %" PRIsVALUE,
195
+ CLASS_OF(obj));
177
196
 
178
197
  return holder->boxed;
179
198
  }
@@ -201,7 +220,7 @@ rbgobj_make_boxed_raw(gpointer p, GType gtype, VALUE klass, gint flags)
201
220
 
202
221
  result = rbgobj_boxed_alloc_func(klass);
203
222
 
204
- Data_Get_Struct(result, boxed_holder, holder);
223
+ holder = rbgobj_boxed_get_raw(result);
205
224
 
206
225
  if (flags & RBGOBJ_BOXED_NOT_COPY) {
207
226
  holder->boxed = p;
@@ -250,7 +269,7 @@ rbgobj_boxed_unown(VALUE boxed)
250
269
  {
251
270
  boxed_holder *holder;
252
271
 
253
- Data_Get_Struct(boxed, boxed_holder, holder);
272
+ holder = rbgobj_boxed_get_raw(boxed);
254
273
 
255
274
  if (!holder->own) {
256
275
  rb_raise(rb_eArgError,
@@ -46,7 +46,7 @@ static VALUE
46
46
  rclosure_default_g2r_func(guint num, const GValue *values)
47
47
  {
48
48
  guint i;
49
- VALUE args = rb_ary_new2(num);
49
+ VALUE args = rb_ary_new_capa(num);
50
50
  for (i = 0; i < num; i++)
51
51
  rb_ary_store(args, i, GVAL2RVAL(&values[i]));
52
52
  return args;
@@ -290,12 +290,13 @@ g_rclosure_attach(GClosure *closure, VALUE object)
290
290
  static VALUE cGLibObject = Qnil;
291
291
  GRClosure *rclosure = (GRClosure *)closure;
292
292
 
293
+ rbgobj_add_relative(object, rclosure->rb_holder);
294
+
293
295
  if (NIL_P(cGLibObject)) {
294
296
  cGLibObject = rb_const_get(mGLib, rb_intern("Object"));
295
297
  }
296
298
  if (rb_obj_is_kind_of(object, cGLibObject)) {
297
299
  GObject *gobject;
298
- rbgobj_object_add_relative(object, rclosure->rb_holder);
299
300
  gobject = RVAL2GOBJ(object);
300
301
  rclosure->count++;
301
302
  g_object_weak_ref(gobject, rclosure_weak_notify, rclosure);