glib2 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data/ext/glib2/extconf.rb +1 -0
  2. data/ext/glib2/glib2.def +23 -0
  3. data/ext/glib2/rbgcompat.h +19 -5
  4. data/ext/glib2/rbglib.c +607 -160
  5. data/ext/glib2/rbglib.h +81 -26
  6. data/ext/glib2/rbglib2conversions.h +57 -0
  7. data/ext/glib2/rbglib_bookmarkfile.c +117 -107
  8. data/ext/glib2/rbglib_completion.c +37 -26
  9. data/ext/glib2/rbglib_convert.c +42 -30
  10. data/ext/glib2/rbglib_error.c +20 -10
  11. data/ext/glib2/rbglib_fileutils.c +48 -37
  12. data/ext/glib2/rbglib_i18n.c +24 -14
  13. data/ext/glib2/rbglib_int64.c +24 -16
  14. data/ext/glib2/rbglib_iochannel.c +146 -204
  15. data/ext/glib2/rbglib_iochannel_win32_socket.c +56 -0
  16. data/ext/glib2/rbglib_iochannelerror.c +49 -0
  17. data/ext/glib2/rbglib_keyfile.c +171 -182
  18. data/ext/glib2/rbglib_maincontext.c +107 -92
  19. data/ext/glib2/rbglib_mainloop.c +34 -21
  20. data/ext/glib2/rbglib_messages.c +53 -44
  21. data/ext/glib2/rbglib_pollfd.c +37 -26
  22. data/ext/glib2/rbglib_shell.c +29 -22
  23. data/ext/glib2/rbglib_shellerror.c +34 -0
  24. data/ext/glib2/rbglib_source.c +49 -36
  25. data/ext/glib2/rbglib_spawn.c +50 -61
  26. data/ext/glib2/rbglib_spawnerror.c +53 -0
  27. data/ext/glib2/rbglib_threads.c +28 -16
  28. data/ext/glib2/rbglib_timer.c +35 -24
  29. data/ext/glib2/rbglib_ucs4.c +79 -0
  30. data/ext/glib2/rbglib_unichar.c +209 -0
  31. data/ext/glib2/rbglib_unicode.c +34 -584
  32. data/ext/glib2/rbglib_utf16.c +78 -0
  33. data/ext/glib2/rbglib_utf8.c +259 -0
  34. data/ext/glib2/rbglib_utils.c +95 -91
  35. data/ext/glib2/rbglib_win32.c +52 -45
  36. data/ext/glib2/rbglibdeprecated.c +56 -0
  37. data/ext/glib2/rbglibdeprecated.h +34 -0
  38. data/ext/glib2/rbgobj_boxed.c +40 -33
  39. data/ext/glib2/rbgobj_closure.c +45 -34
  40. data/ext/glib2/rbgobj_convert.c +19 -9
  41. data/ext/glib2/rbgobj_enumflags.c +109 -0
  42. data/ext/glib2/rbgobj_enums.c +67 -646
  43. data/ext/glib2/rbgobj_flags.c +522 -0
  44. data/ext/glib2/rbgobj_fundamental.c +19 -6
  45. data/ext/glib2/rbgobj_object.c +90 -81
  46. data/ext/glib2/rbgobj_param.c +78 -83
  47. data/ext/glib2/rbgobj_paramspecs.c +20 -12
  48. data/ext/glib2/rbgobj_signal.c +248 -193
  49. data/ext/glib2/rbgobj_strv.c +20 -10
  50. data/ext/glib2/rbgobj_type.c +153 -149
  51. data/ext/glib2/rbgobj_typeinstance.c +49 -39
  52. data/ext/glib2/rbgobj_typeinterface.c +37 -27
  53. data/ext/glib2/rbgobj_typemodule.c +39 -29
  54. data/ext/glib2/rbgobj_typeplugin.c +36 -26
  55. data/ext/glib2/rbgobj_value.c +41 -11
  56. data/ext/glib2/rbgobj_valuearray.c +59 -23
  57. data/ext/glib2/rbgobj_valuetypes.c +27 -17
  58. data/ext/glib2/rbgobject.c +26 -40
  59. data/ext/glib2/rbgobject.h +38 -20
  60. data/ext/glib2/rbgprivate.h +87 -5
  61. data/ext/glib2/rbgutil.c +52 -238
  62. data/ext/glib2/rbgutil.h +55 -42
  63. data/ext/glib2/rbgutil_callback.c +47 -12
  64. data/ext/glib2/rbgutil_list.c +173 -0
  65. data/ext/glib2/rbgutil_list.h +85 -0
  66. data/ext/glib2/rbgutildeprecated.c +252 -0
  67. data/ext/glib2/rbgutildeprecated.h +63 -0
  68. data/lib/glib-mkenums.rb +2 -2
  69. data/lib/glib2.rb +2 -25
  70. data/lib/glib2/deprecatable.rb +149 -0
  71. data/lib/gnome2-raketask.rb +45 -15
  72. data/lib/gnome2-win32-binary-downloader.rb +1 -1
  73. data/lib/mkmf-gnome2.rb +37 -18
  74. data/test/test_flags.rb +129 -0
  75. data/test/test_key_file.rb +6 -2
  76. data/test/test_spawn.rb +33 -0
  77. metadata +26 -7
  78. data/ChangeLog +0 -3513
@@ -1,13 +1,23 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
- /************************************************
3
-
4
- rbgobj_convert.c -
5
-
6
- $Author: mutoh $
7
- $Date: 2006/05/22 17:13:05 $
8
-
9
- Copyright (C) 2006 Sjoerd Simons, Masao Mutoh
10
- ************************************************/
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ * Copyright (C) 2006 Sjoerd Simons, Masao Mutoh
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
+ * MA 02110-1301 USA
20
+ */
11
21
 
12
22
  #include "rbgobject.h"
13
23
  #include "rbgprivate.h"
@@ -0,0 +1,109 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ * Copyright (C) 2004-2006 Ruby-GNOME2 Project Team
5
+ * Copyright (C) 2002,2003 Masahiro Sakai
6
+ *
7
+ * This library is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
+ * MA 02110-1301 USA
21
+ */
22
+
23
+ #include "rbgprivate.h"
24
+ #include <ctype.h>
25
+
26
+ typedef struct {
27
+ char *original;
28
+ char *replacement;
29
+ } constant_map;
30
+
31
+ static GSList *rbgobj_cmap = NULL;
32
+
33
+ static gint
34
+ rbgobj_constant_find(constant_map *a, char *name)
35
+ {
36
+ return strcmp(a->original, name);
37
+ }
38
+
39
+ void
40
+ rbgobj_constant_remap(const char *original, const char *replacement)
41
+ {
42
+ constant_map *map = g_new(constant_map,1);
43
+
44
+ map->original = g_strdup(original);
45
+ map->replacement = g_strdup(replacement);
46
+
47
+ rbgobj_cmap = g_slist_append(rbgobj_cmap, map);
48
+ }
49
+
50
+ char *
51
+ rg_obj_constant_lookup(const char *name)
52
+ {
53
+ GSList *p = rbgobj_cmap;
54
+
55
+ p = g_slist_find_custom(rbgobj_cmap, name,
56
+ (GCompareFunc)rbgobj_constant_find);
57
+ if (p) {
58
+ char *replacement;
59
+ constant_map *map;
60
+
61
+ map = (constant_map *)p->data;
62
+ rbgobj_cmap = g_slist_delete_link(rbgobj_cmap, p);
63
+ replacement = map->replacement;
64
+
65
+ g_free(map->original);
66
+ g_free(map);
67
+
68
+ return replacement;
69
+ }
70
+
71
+ return NULL;
72
+ }
73
+
74
+ void
75
+ rbgobj_define_const(VALUE mod, const char *name,
76
+ VALUE value)
77
+ {
78
+ if (name[0] >= 'A' && name[0] <= 'Z') {
79
+ rb_define_const(mod, name, value);
80
+ } else {
81
+ char *new_name = rg_obj_constant_lookup(name);
82
+
83
+ if (new_name) {
84
+ rb_define_const(mod, new_name, value);
85
+ g_free(new_name);
86
+ } else {
87
+ rb_warn("Invalid constant name '%s' - skipped", name);
88
+ }
89
+ }
90
+ }
91
+
92
+ void
93
+ rbgobj_add_constants(VALUE mod, GType type, const gchar *strip_prefix)
94
+ {
95
+ if (G_TYPE_IS_ENUM(type)) {
96
+ rg_enum_add_constants(mod, type, strip_prefix);
97
+ } else if (G_TYPE_IS_FLAGS(type)) {
98
+ rg_flags_add_constants(mod, type, strip_prefix);
99
+ } else {
100
+ g_warning("`%s' is not an enum/flags type", g_type_name(type));
101
+ }
102
+ }
103
+
104
+ void
105
+ Init_gobject_genumflags(void)
106
+ {
107
+ Init_gobject_genums();
108
+ Init_gobject_gflags();
109
+ }
@@ -1,35 +1,37 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
- /**********************************************************************
3
-
4
- rbgobj_enums.c -
5
-
6
- $Author: ktou $
7
- $Date: 2007/08/08 11:53:09 $
8
- created at: Sat Jul 27 16:56:01 JST 2002
9
-
10
- Copyright (C) 2004-2006 Ruby-GNOME2 Project Team
11
- Copyright (C) 2002,2003 Masahiro Sakai
12
- **********************************************************************/
2
+ /*
3
+ * Copyright (C) 2011 Ruby-GNOME2 Project Team
4
+ * Copyright (C) 2004-2006 Ruby-GNOME2 Project Team
5
+ * Copyright (C) 2002,2003 Masahiro Sakai
6
+ *
7
+ * This library is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
20
+ * MA 02110-1301 USA
21
+ */
13
22
 
14
23
  #include "rbgprivate.h"
15
24
  #include <ctype.h>
16
25
 
17
- VALUE rbgobj_cEnum, rbgobj_cFlags;
26
+ #define RG_TARGET_NAMESPACE rbgobj_cEnum
27
+
28
+ VALUE RG_TARGET_NAMESPACE;
18
29
 
19
30
  static ID id_new;
20
- static ID id_module_eval;
21
31
  static ID id_to_s;
22
- static ID id_or;
23
32
 
24
33
  /**********************************************************************/
25
34
 
26
- typedef struct {
27
- char *original;
28
- char *replacement;
29
- } constant_map;
30
-
31
- static GSList *rbgobj_cmap = NULL;
32
-
33
35
  static gchar *
34
36
  nick_to_const_name(const gchar *nick)
35
37
  {
@@ -49,8 +51,8 @@ nick_to_const_name(const gchar *nick)
49
51
  return const_name;
50
52
  }
51
53
 
52
- static VALUE
53
- resolve_enum_value(VALUE klass, VALUE nick)
54
+ VALUE
55
+ rg_enum_resolve_value(VALUE klass, VALUE nick)
54
56
  {
55
57
  VALUE value = Qnil;
56
58
  gchar *const_nick;
@@ -70,98 +72,8 @@ resolve_enum_value(VALUE klass, VALUE nick)
70
72
  return value;
71
73
  }
72
74
 
73
- static VALUE
74
- resolve_flags_value(VALUE klass, VALUE nick_or_nicks)
75
- {
76
- int i, len;
77
- VALUE flags_value;
78
-
79
- if (!RVAL2CBOOL(rb_obj_is_kind_of(nick_or_nicks, rb_cArray)))
80
- return resolve_enum_value(klass, nick_or_nicks);
81
-
82
- len = RARRAY_LEN(nick_or_nicks);
83
- flags_value = rb_funcall(klass, id_new, 0);
84
- for (i = 0; i < len; i++) {
85
- VALUE value;
86
-
87
- value = resolve_enum_value(klass, RARRAY_PTR(nick_or_nicks)[i]);
88
- if (NIL_P(value))
89
- return Qnil;
90
-
91
- flags_value = rb_funcall(flags_value, id_or, 1, value);
92
- }
93
-
94
- return flags_value;
95
- }
96
-
97
- static gint
98
- rbgobj_constant_find(constant_map *a, char *name)
99
- {
100
- return strcmp(a->original, name);
101
- }
102
-
103
75
  void
104
- rbgobj_constant_remap(const char *original, const char *replacement)
105
- {
106
- constant_map *map = g_new(constant_map,1);
107
-
108
- map -> original = g_strdup(original);
109
- map -> replacement = g_strdup(replacement);
110
-
111
- rbgobj_cmap = g_slist_append(rbgobj_cmap, map);
112
- }
113
-
114
- static char *
115
- rbgobj_constant_lookup(const char *name)
116
- {
117
- GSList *p = rbgobj_cmap;
118
-
119
- p = g_slist_find_custom(rbgobj_cmap, name,
120
- (GCompareFunc)rbgobj_constant_find);
121
- if (p)
122
- {
123
- char *replacement;
124
- constant_map *map;
125
-
126
- map = (constant_map*) p -> data;
127
- rbgobj_cmap = g_slist_delete_link(rbgobj_cmap, p);
128
- replacement = map -> replacement;
129
-
130
- g_free(map -> original);
131
- g_free(map);
132
-
133
- return replacement;
134
- }
135
- return NULL;
136
- }
137
-
138
- void
139
- rbgobj_define_const(VALUE mod, const char *name,
140
- VALUE value)
141
- {
142
- if (name[0] >= 'A' && name[0] <= 'Z')
143
- {
144
- rb_define_const(mod, name, value);
145
- }
146
- else
147
- {
148
- char *new_name = rbgobj_constant_lookup(name);
149
-
150
- if (new_name)
151
- {
152
- rb_define_const(mod, new_name, value);
153
- g_free(new_name);
154
- }
155
- else
156
- {
157
- rb_warn("Invalid constant name '%s' - skipped", name);
158
- }
159
- }
160
- }
161
-
162
- static void
163
- rbgobj_enum_add_constants(VALUE mod, GType enum_type,
164
- const gchar *strip_prefix)
76
+ rg_enum_add_constants(VALUE mod, GType enum_type, const gchar *strip_prefix)
165
77
  {
166
78
  GEnumClass *gclass;
167
79
  guint i;
@@ -185,45 +97,6 @@ rbgobj_enum_add_constants(VALUE mod, GType enum_type,
185
97
  g_type_class_unref(gclass);
186
98
  }
187
99
 
188
- static void
189
- rbgobj_flags_add_constants(VALUE mod, GType flags_type,
190
- const gchar *strip_prefix)
191
- {
192
- GFlagsClass *gclass;
193
- guint i;
194
- int prefix_len = strlen(strip_prefix);
195
-
196
- gclass = G_FLAGS_CLASS(g_type_class_ref(flags_type));
197
-
198
- for (i = 0; i < gclass->n_values; i++) {
199
- const GFlagsValue* value = &gclass->values[i];
200
-
201
- if (strncmp(value->value_name, strip_prefix, prefix_len)) {
202
- g_warning("\"%s\" doesn't have prefix \"%s\"",
203
- value->value_name, strip_prefix);
204
- } else {
205
- const char* name = value->value_name + prefix_len;
206
- rbgobj_define_const(mod, name,
207
- rbgobj_make_flags(value->value, flags_type));
208
-
209
- }
210
- }
211
-
212
- g_type_class_unref(gclass);
213
- }
214
-
215
- void
216
- rbgobj_add_constants(VALUE mod, GType type, const gchar *strip_prefix)
217
- {
218
- if (G_TYPE_IS_ENUM(type)) {
219
- rbgobj_enum_add_constants(mod, type, strip_prefix);
220
- } else if (G_TYPE_IS_FLAGS(type)) {
221
- rbgobj_flags_add_constants(mod, type, strip_prefix);
222
- } else {
223
- g_warning("`%s' is not an enum/flags type", g_type_name(type));
224
- }
225
- }
226
-
227
100
  /**********************************************************************/
228
101
 
229
102
  typedef struct {
@@ -267,7 +140,7 @@ rbgobj_get_enum(VALUE obj, GType gtype)
267
140
  if (!g_type_is_a(gtype, G_TYPE_ENUM))
268
141
  rb_raise(rb_eTypeError, "%s is not a %s: %s",
269
142
  g_type_name(gtype), g_type_name(G_TYPE_ENUM),
270
- RBG_INSPECT(obj));
143
+ RBG_INSPECT(obj));
271
144
 
272
145
  /* for compatibility */
273
146
  if (rb_obj_is_kind_of(obj, rb_cInteger))
@@ -278,7 +151,7 @@ rbgobj_get_enum(VALUE obj, GType gtype)
278
151
  if (!rb_obj_is_kind_of(obj, klass)) {
279
152
  VALUE enum_value;
280
153
 
281
- enum_value = resolve_enum_value(klass, obj);
154
+ enum_value = rg_enum_resolve_value(klass, obj);
282
155
  if (!NIL_P(enum_value))
283
156
  obj = enum_value;
284
157
  }
@@ -287,7 +160,7 @@ rbgobj_get_enum(VALUE obj, GType gtype)
287
160
  return enum_get_holder(obj)->value;
288
161
  else
289
162
  rb_raise(rb_eTypeError, "not a %s: %s",
290
- rb_class2name(klass), RBG_INSPECT(obj));
163
+ rb_class2name(klass), RBG_INSPECT(obj));
291
164
  }
292
165
 
293
166
  /**********************************************************************/
@@ -310,7 +183,7 @@ rbgobj_init_enum_class(VALUE klass)
310
183
  if (rb_is_const_id(id)) {
311
184
  VALUE value;
312
185
 
313
- value = make_enum(entry->value, klass);
186
+ value = make_enum(entry->value, klass);
314
187
  rb_define_const(klass, const_nick_name, value);
315
188
  }
316
189
  }
@@ -319,7 +192,7 @@ rbgobj_init_enum_class(VALUE klass)
319
192
  if (const_nick_name) {
320
193
  VALUE value;
321
194
 
322
- value = make_enum(entry->value, klass);
195
+ value = make_enum(entry->value, klass);
323
196
  rbgobj_define_const(klass, const_nick_name, value);
324
197
  }
325
198
  }
@@ -332,7 +205,7 @@ rbgobj_init_enum_class(VALUE klass)
332
205
  }
333
206
 
334
207
  static VALUE
335
- enum_s_range(VALUE self)
208
+ rg_s_range(VALUE self)
336
209
  {
337
210
  GEnumClass* gclass = g_type_class_ref(CLASS2GTYPE(self));
338
211
  VALUE result = rb_range_new(INT2NUM(gclass->minimum),
@@ -369,7 +242,7 @@ enum_s_values_ensure(VALUE gclass)
369
242
  }
370
243
 
371
244
  static VALUE
372
- enum_s_values(VALUE self)
245
+ rg_s_values(VALUE self)
373
246
  {
374
247
  struct enum_s_values_body_args args = {
375
248
  g_type_class_ref(CLASS2GTYPE(self)),
@@ -397,7 +270,7 @@ enum_s_allocate(VALUE self)
397
270
  }
398
271
 
399
272
  static VALUE
400
- enum_initialize(VALUE self, VALUE arg)
273
+ rg_initialize(VALUE self, VALUE arg)
401
274
  {
402
275
  enum_holder* p = enum_get_holder(self);
403
276
 
@@ -417,28 +290,28 @@ enum_initialize(VALUE self, VALUE arg)
417
290
  }
418
291
 
419
292
  static VALUE
420
- enum_to_i(VALUE self)
293
+ rg_to_i(VALUE self)
421
294
  {
422
295
  enum_holder* p = enum_get_holder(self);
423
296
  return INT2NUM(p->value);
424
297
  }
425
298
 
426
299
  static VALUE
427
- enum_name(VALUE self)
300
+ rg_name(VALUE self)
428
301
  {
429
302
  enum_holder* p = enum_get_holder(self);
430
303
  return p->info ? rb_str_new2(p->info->value_name) : Qnil;
431
304
  }
432
305
 
433
306
  static VALUE
434
- enum_nick(VALUE self)
307
+ rg_nick(VALUE self)
435
308
  {
436
309
  enum_holder* p = enum_get_holder(self);
437
310
  return p->info ? rb_str_new2(p->info->value_nick) : Qnil;
438
311
  }
439
312
 
440
313
  static VALUE
441
- enum_inspect(VALUE self)
314
+ rg_inspect(VALUE self)
442
315
  {
443
316
  const char* cname = rb_class2name(CLASS_OF(self));
444
317
  enum_holder* p = enum_get_holder(self);
@@ -458,25 +331,29 @@ enum_inspect(VALUE self)
458
331
  }
459
332
 
460
333
  static VALUE
461
- enum_eqv(VALUE self, VALUE rhs)
334
+ rg_operator_enum_eqv(VALUE self, VALUE rhs)
462
335
  {
463
336
  enum_holder* p = enum_get_holder(self);
464
337
  GType gtype = G_TYPE_FROM_CLASS(p->gclass);
465
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
466
- !rb_obj_is_kind_of(rhs, rb_cInteger))
467
- return Qnil;
338
+ VALUE klass = GTYPE2CLASS(gtype);
339
+
340
+ if (!rb_obj_is_kind_of(rhs, rb_cInteger)) {
341
+ rhs = rg_enum_resolve_value(klass, rhs);
342
+ if (CLASS_OF(rhs) != CLASS_OF(self))
343
+ return Qnil;
344
+ }
468
345
  return CBOOL2RVAL(rbgobj_get_enum(self, gtype) == rbgobj_get_enum(rhs, gtype));
469
346
  }
470
347
 
471
348
  static VALUE
472
- enum_hash(VALUE self)
349
+ rg_hash(VALUE self)
473
350
  {
474
351
  enum_holder* p = enum_get_holder(self);
475
352
  return UINT2NUM(p->value ^ G_TYPE_FROM_CLASS(p->gclass));
476
353
  }
477
354
 
478
355
  static VALUE
479
- enum_coerce(VALUE self, VALUE other)
356
+ rg_coerce(VALUE self, VALUE other)
480
357
  {
481
358
  enum_holder *holder;
482
359
  GType gtype;
@@ -490,491 +367,35 @@ enum_coerce(VALUE self, VALUE other)
490
367
  return rb_ary_new3(2, other, self);
491
368
  }
492
369
 
493
- static void
494
- Init_enum()
495
- {
496
- VALUE cEnum;
497
-
498
- rbgobj_cEnum = G_DEF_CLASS(G_TYPE_ENUM, "Enum", mGLib);
499
- cEnum = rbgobj_cEnum;
500
-
501
- rb_define_singleton_method(cEnum, "gtype", generic_s_gtype, 0);
502
- rb_define_method(cEnum, "gtype", generic_gtype, 0);
503
-
504
- rb_define_singleton_method(cEnum, "range", enum_s_range, 0);
505
- rb_define_singleton_method(cEnum, "values", enum_s_values, 0);
506
-
507
- rb_define_alloc_func(cEnum, enum_s_allocate);
508
-
509
- rb_define_method(cEnum, "initialize", enum_initialize, 1);
510
- rb_define_method(cEnum, "to_i", enum_to_i, 0);
511
- rb_define_method(cEnum, "name", enum_name, 0);
512
- rb_define_method(cEnum, "nick", enum_nick, 0);
513
-
514
- rb_define_method(cEnum, "inspect", enum_inspect, 0);
515
- rb_define_method(cEnum, "==", enum_eqv, 1);
516
- rb_define_method(cEnum, "hash", enum_hash, 0);
517
- rb_define_method(cEnum, "eql?", enum_eqv, 1);
518
-
519
- /* for compatibility */
520
- rb_define_method(cEnum, "coerce", enum_coerce, 1);
521
- rb_define_alias(cEnum, "to_int", "to_i");
522
- }
523
-
524
- /**********************************************************************/
525
-
526
- typedef struct {
527
- GFlagsClass* gclass;
528
- guint value;
529
- GFlagsValue* info;
530
- } flags_holder;
531
-
532
- static void
533
- flags_free(enum_holder* p)
534
- {
535
- g_type_class_unref(p->gclass);
536
- free(p);
537
- }
538
-
539
- static flags_holder*
540
- flags_get_holder(VALUE obj)
541
- {
542
- flags_holder* p;
543
- Data_Get_Struct(obj, flags_holder, p);
544
- return p;
545
- }
546
-
547
- static VALUE
548
- make_flags(guint n, VALUE klass)
549
- {
550
- return rb_funcall(klass, id_new, 1, UINT2NUM(n));
551
- }
552
-
553
- VALUE
554
- rbgobj_make_flags(guint n, GType gtype)
555
- {
556
- return make_flags(n, GTYPE2CLASS(gtype));
557
- }
558
-
559
- guint
560
- rbgobj_get_flags(VALUE obj, GType gtype)
561
- {
562
- VALUE klass;
563
-
564
- if (!g_type_is_a(gtype, G_TYPE_FLAGS))
565
- rb_raise(rb_eTypeError, "%s is not a %s",
566
- g_type_name(gtype), g_type_name(G_TYPE_FLAGS));
567
-
568
- /* for compatibility */
569
- if (rb_obj_is_kind_of(obj, rb_cInteger))
570
- obj = rbgobj_make_flags(NUM2UINT(obj), gtype);
571
-
572
- klass = GTYPE2CLASS(gtype);
573
-
574
- if (!rb_obj_is_kind_of(obj, klass)) {
575
- VALUE flags_value = Qnil;
576
-
577
- flags_value = resolve_flags_value(klass, obj);
578
- if (!NIL_P(flags_value))
579
- obj = flags_value;
580
- }
581
-
582
- if (rb_obj_is_kind_of(obj, klass))
583
- return flags_get_holder(obj)->value;
584
- else
585
- rb_raise(rb_eTypeError, "not a %s: %s",
586
- rb_class2name(klass), RBG_INSPECT(obj));
587
- }
588
-
589
370
  /**********************************************************************/
590
371
 
591
372
  void
592
- rbgobj_init_flags_class(VALUE klass)
593
- {
594
- GFlagsClass* gclass = g_type_class_ref(CLASS2GTYPE(klass));
595
- GString* source = g_string_new(NULL);
596
- guint i;
597
-
598
- for (i = 0; i < gclass->n_values; i++) {
599
- GFlagsValue* entry = &(gclass->values[i]);
600
- gchar* nick;
601
- gchar* p;
602
- gchar* replace_nick;
603
-
604
- replace_nick = rbgobj_constant_lookup(entry->value_nick);
605
- if (replace_nick){
606
- nick = g_strdup(replace_nick);
607
- } else {
608
- nick = g_strdup(entry->value_nick);
609
- }
610
-
611
- for (p = nick; *p; p++)
612
- if (*p == '-' || *p == ' ')
613
- *p = '_';
614
- else
615
- *p = tolower(*p);
616
-
617
- g_string_append_printf(
618
- source,
619
- "def %s%s?; self >= self.class.new(%d); end\n",
620
- g_ascii_isdigit(nick[0]) ? "_" : "",
621
- nick, entry->value);
622
-
623
- for (p = nick; *p; p++)
624
- *p = g_ascii_toupper(*p);
625
-
626
- #if 0
627
- {
628
- ID id = rb_intern(nick);
629
- if (rb_is_const_id(id)) {
630
- rb_define_const(klass, nick, make_flags(entry->value, klass));
631
- }
632
- }
633
- #else
634
- {
635
- rbgobj_define_const(klass, nick, make_flags(entry->value, klass));
636
- }
637
- #endif
638
-
639
- g_free(nick);
640
- }
641
-
642
- rb_funcall(klass, id_module_eval, 1, rb_str_new2(source->str));
643
- g_string_free(source, TRUE);
644
-
645
- g_type_class_unref(gclass);
646
- }
647
-
648
- static VALUE
649
- flags_s_mask(VALUE klass)
650
- {
651
- GFlagsClass* gclass = g_type_class_ref(CLASS2GTYPE(klass));
652
- VALUE result = UINT2NUM(gclass->mask);
653
- g_type_class_unref(gclass);
654
- return result;
655
- }
656
-
657
- static VALUE
658
- flags_s_values(VALUE klass)
373
+ Init_gobject_genums(void)
659
374
  {
660
- GFlagsClass *gclass;
661
- VALUE result;
662
- guint i;
663
-
664
- gclass = g_type_class_ref(CLASS2GTYPE(klass));
665
- result = rb_ary_new();
666
- for (i = 0; i < gclass->n_values; i++) {
667
- GFlagsValue *p = &(gclass->values[i]);
668
- rb_ary_push(result, make_flags(p->value, klass));
669
- }
670
- g_type_class_unref(gclass);
671
-
672
- return result;
673
- }
674
-
675
- static VALUE
676
- flags_s_allocate(VALUE self)
677
- {
678
- GType gtype = CLASS2GTYPE(self);
679
-
680
- if (G_TYPE_IS_ABSTRACT(gtype)) {
681
- rb_raise(rb_eTypeError, "abstract class");
682
- } else {
683
- flags_holder* p;
684
- VALUE result = Data_Make_Struct(self, flags_holder, NULL, flags_free, p);
685
- p->gclass = g_type_class_ref(gtype);
686
- p->value = 0;
687
- p->info = NULL;
688
- return result;
689
- }
690
- }
691
-
692
- static VALUE
693
- flags_initialize(int argc, VALUE* argv, VALUE self)
694
- {
695
- flags_holder* p = flags_get_holder(self);
696
- VALUE arg;
697
-
698
- rb_scan_args(argc, argv, "01", &arg);
699
-
700
- if (argc == 0) {
701
- p->value = 0;
702
- } else {
703
- if (rb_respond_to(arg, rb_intern("to_str"))) {
704
- const char* str = StringValuePtr(arg);
705
- p->info = g_flags_get_value_by_name(p->gclass, str);
706
- if (!p->info)
707
- p->info = g_flags_get_value_by_nick(p->gclass, str);
708
- if (!p->info)
709
- rb_raise(rb_eArgError, "invalid argument");
710
- p->value = p->info->value;
711
- } else {
712
- p->value = NUM2UINT(arg);
713
- }
714
- }
715
-
716
- if (!p->info) {
717
- guint i;
718
- for (i = 0; i < p->gclass->n_values; i++){
719
- GFlagsValue* val = &(p->gclass->values[i]);
720
- if (val->value == p->value){
721
- p->info = val;
722
- break;
723
- }
724
- }
725
- }
726
-
727
- return Qnil;
728
- }
729
-
730
- static VALUE
731
- flags_to_i(VALUE self)
732
- {
733
- flags_holder* p = flags_get_holder(self);
734
- return UINT2NUM(p->value);
735
- }
736
-
737
- static VALUE
738
- flags_name(VALUE self)
739
- {
740
- flags_holder* p = flags_get_holder(self);
741
- return p->info ? rb_str_new2(p->info->value_name) : Qnil;
742
- }
743
-
744
- static VALUE
745
- flags_nick(VALUE self)
746
- {
747
- flags_holder* p = flags_get_holder(self);
748
- return p->info ? rb_str_new2(p->info->value_nick) : Qnil;
749
- }
750
-
751
- static VALUE
752
- flags_compare(VALUE self, VALUE rhs)
753
- {
754
- flags_holder* p = flags_get_holder(self);
755
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
756
- guint rhs_val;
757
-
758
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
759
- !rb_obj_is_kind_of(rhs, rb_cInteger))
760
- return Qnil;
761
-
762
- rhs_val = rbgobj_get_flags(rhs, gtype);
763
-
764
- if (p->value == rhs_val)
765
- return INT2FIX(0);
766
- else if ((p->value & rhs_val) == rhs_val)
767
- return INT2FIX(1);
768
- else if ((p->value & rhs_val) == p->value)
769
- return INT2FIX(-1);
770
- else
771
- return Qnil;
772
- }
773
-
774
- static VALUE
775
- flags_eqv(VALUE self, VALUE rhs)
776
- {
777
- flags_holder* p = flags_get_holder(self);
778
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
779
- guint rhs_val;
780
-
781
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
782
- !rb_obj_is_kind_of(rhs, rb_cInteger))
783
- return Qnil;
784
-
785
- rhs_val = rbgobj_get_flags(rhs, gtype);
786
- return CBOOL2RVAL(p->value == rhs_val);
787
- }
788
-
789
- static VALUE
790
- flags_gt_eq(VALUE self, VALUE rhs)
791
- {
792
- flags_holder* p = flags_get_holder(self);
793
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
794
- guint rhs_val;
795
-
796
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
797
- !rb_obj_is_kind_of(rhs, rb_cInteger))
798
- return Qnil;
799
-
800
- rhs_val = rbgobj_get_flags(rhs, gtype);
801
- return CBOOL2RVAL((p->value & rhs_val) == rhs_val);
802
- }
803
-
804
- static VALUE
805
- flags_lt_eq(VALUE self, VALUE rhs)
806
- {
807
- flags_holder* p = flags_get_holder(self);
808
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
809
- guint rhs_val;
810
-
811
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
812
- !rb_obj_is_kind_of(rhs, rb_cInteger))
813
- return Qnil;
814
-
815
- rhs_val = rbgobj_get_flags(rhs, gtype);
816
- return CBOOL2RVAL((p->value & rhs_val) == p->value);
817
- }
818
-
819
- static VALUE
820
- flags_gt(VALUE self, VALUE rhs)
821
- {
822
- flags_holder* p = flags_get_holder(self);
823
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
824
- guint rhs_val;
825
-
826
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
827
- !rb_obj_is_kind_of(rhs, rb_cInteger))
828
- return Qnil;
829
-
830
- rhs_val = rbgobj_get_flags(rhs, gtype);
831
- return CBOOL2RVAL((p->value & rhs_val) == rhs_val &&
832
- p->value != rhs_val);
833
- }
834
-
835
- static VALUE
836
- flags_lt(VALUE self, VALUE rhs)
837
- {
838
- flags_holder* p = flags_get_holder(self);
839
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
840
- guint rhs_val;
841
-
842
- if (CLASS_OF(rhs) != CLASS_OF(self) &&
843
- !rb_obj_is_kind_of(rhs, rb_cInteger))
844
- return Qnil;
845
-
846
- rhs_val = rbgobj_get_flags(rhs, gtype);
847
- return CBOOL2RVAL((p->value & rhs_val) == p->value &&
848
- p->value != rhs_val);
849
- }
850
-
851
- static VALUE
852
- flags_not(VALUE self, VALUE rhs)
853
- {
854
- flags_holder* p = flags_get_holder(self);
855
- return rbgobj_make_flags((~ p->value) & p->gclass->mask,
856
- G_TYPE_FROM_CLASS(p->gclass));
857
- }
858
-
859
- #define LIFT_BINARY_OP(funcname, op) \
860
- static VALUE \
861
- funcname(VALUE self, VALUE rhs) \
862
- { \
863
- flags_holder* p = flags_get_holder(self); \
864
- GType gtype = G_TYPE_FROM_CLASS(p->gclass); \
865
- return rbgobj_make_flags(p->value op rbgobj_get_flags(rhs, gtype), \
866
- gtype); \
867
- }
868
-
869
- LIFT_BINARY_OP(flags_and, &)
870
- LIFT_BINARY_OP(flags_or, |)
871
- LIFT_BINARY_OP(flags_xor, ^)
872
-
873
- static VALUE
874
- flags_minus(VALUE self, VALUE rhs)
875
- {
876
- flags_holder* p = flags_get_holder(self);
877
- GType gtype = G_TYPE_FROM_CLASS(p->gclass);
878
- return rbgobj_make_flags(p->value & ~rbgobj_get_flags(rhs, gtype),
879
- gtype);
880
- }
881
-
882
- static VALUE
883
- flags_empty_p(VALUE self)
884
- {
885
- flags_holder* p = flags_get_holder(self);
886
- return CBOOL2RVAL(p->value == 0);
887
- }
888
-
889
- static VALUE
890
- flags_hash(VALUE self)
891
- {
892
- flags_holder* p = flags_get_holder(self);
893
- return UINT2NUM(p->value ^ G_TYPE_FROM_CLASS(p->gclass));
894
- }
895
-
896
- static VALUE
897
- flags_coerce(VALUE self, VALUE other)
898
- {
899
- flags_holder *holder;
900
- GType gtype;
901
-
902
- if (rb_obj_is_kind_of(other, rb_cInteger))
903
- rb_raise(rb_eTypeError, "can't coerce");
904
-
905
- holder = flags_get_holder(self);
906
- gtype = G_TYPE_FROM_CLASS(holder->gclass);
907
- other = rbgobj_make_flags(NUM2UINT(other), gtype);
908
- return rb_ary_new3(2, other, self);
909
- }
910
-
911
- static VALUE
912
- flags_nonzero_p(VALUE self)
913
- {
914
- flags_holder* p = flags_get_holder(self);
915
- return CBOOL2RVAL(p->value != 0);
916
- }
917
-
918
- static void
919
- Init_flags()
920
- {
921
- VALUE cFlags;
922
-
923
- rbgobj_cFlags = G_DEF_CLASS(G_TYPE_FLAGS, "Flags", mGLib);
924
- cFlags = rbgobj_cFlags;
925
-
926
- rb_define_singleton_method(cFlags, "gtype", generic_s_gtype, 0);
927
- rb_define_method(cFlags, "gtype", generic_gtype, 0);
928
-
929
- rb_define_singleton_method(cFlags, "mask", flags_s_mask, 0);
930
- rb_define_singleton_method(cFlags, "values", flags_s_values, 0);
931
-
932
- rb_define_alloc_func(cFlags, flags_s_allocate);
375
+ id_new = rb_intern("new");
376
+ id_to_s = rb_intern("to_s");
933
377
 
934
- rb_define_method(cFlags, "initialize", flags_initialize, -1);
378
+ RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_ENUM, "Enum", mGLib);
935
379
 
936
- rb_define_method(cFlags, "to_i", flags_to_i, 0);
937
- rb_define_alias(cFlags, "to_int", "to_i");
938
- rb_define_method(cFlags, "name", flags_name, 0);
939
- rb_define_method(cFlags, "nick", flags_nick, 0);
380
+ rb_define_singleton_method(RG_TARGET_NAMESPACE, "gtype", generic_s_gtype, 0);
381
+ rb_define_method(RG_TARGET_NAMESPACE, "gtype", generic_gtype, 0);
940
382
 
941
- /*
942
- rb_define_method(cFlags, "inspect", flags_inspect, 0);
943
- */
383
+ RG_DEF_SMETHOD(range, 0);
384
+ RG_DEF_SMETHOD(values, 0);
944
385
 
945
- rb_define_method(cFlags, "<=>", flags_compare, 1);
946
- rb_define_method(cFlags, "==", flags_eqv, 1);
947
- rb_define_method(cFlags, ">=", flags_gt_eq, 1);
948
- rb_define_method(cFlags, "<=", flags_lt_eq, 1);
949
- rb_define_method(cFlags, ">", flags_gt, 1);
950
- rb_define_method(cFlags, "<", flags_lt, 1);
951
- rb_define_method(cFlags, "~", flags_not, 0);
952
- rb_define_method(cFlags, "&", flags_and, 1);
953
- rb_define_method(cFlags, "|", flags_or, 1);
954
- rb_define_method(cFlags, "^", flags_xor, 1);
955
- rb_define_method(cFlags, "-", flags_minus, 1);
386
+ rb_define_alloc_func(RG_TARGET_NAMESPACE, enum_s_allocate);
956
387
 
957
- rb_define_method(cFlags, "empty?", flags_empty_p, 0);
388
+ RG_DEF_METHOD(initialize, 1);
389
+ RG_DEF_METHOD(to_i, 0);
390
+ RG_DEF_METHOD(name, 0);
391
+ RG_DEF_METHOD(nick, 0);
958
392
 
959
- rb_define_method(cFlags, "hash", flags_hash, 0);
960
- rb_define_method(cFlags, "eql?", flags_eqv, 1);
393
+ RG_DEF_METHOD(inspect, 0);
394
+ RG_DEF_METHOD_OPERATOR("==", enum_eqv, 1);
395
+ RG_DEF_METHOD(hash, 0);
396
+ RG_DEF_ALIAS("eql?", "==");
961
397
 
962
398
  /* for compatibility */
963
- rb_define_method(cFlags, "coerce", flags_coerce, 1);
964
- rb_define_method(cFlags, "zero?", flags_empty_p, 0);
965
- rb_define_method(cFlags, "nonzero?", flags_nonzero_p, 0);
966
- }
967
-
968
- /**********************************************************************/
969
-
970
- void
971
- Init_gobject_genums()
972
- {
973
- id_module_eval = rb_intern("module_eval");
974
- id_new = rb_intern("new");
975
- id_to_s = rb_intern("to_s");
976
- id_or = rb_intern("|");
977
-
978
- Init_enum();
979
- Init_flags();
399
+ RG_DEF_METHOD(coerce, 1);
400
+ RG_DEF_ALIAS("to_int", "to_i");
980
401
  }