glib2 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/ChangeLog +3023 -0
  2. data/README +28 -0
  3. data/Rakefile +87 -0
  4. data/extconf.rb +61 -0
  5. data/sample/bookmarkfile.rb +66 -0
  6. data/sample/completion.rb +45 -0
  7. data/sample/idle.rb +41 -0
  8. data/sample/iochannel.rb +44 -0
  9. data/sample/keyfile.rb +62 -0
  10. data/sample/shell.rb +36 -0
  11. data/sample/spawn.rb +25 -0
  12. data/sample/timeout.rb +28 -0
  13. data/sample/timeout2.rb +35 -0
  14. data/sample/timer.rb +40 -0
  15. data/sample/type-register.rb +103 -0
  16. data/sample/type-register2.rb +104 -0
  17. data/sample/utils.rb +54 -0
  18. data/src/glib-enum-types.c +1032 -0
  19. data/src/glib-enum-types.h +140 -0
  20. data/src/lib/glib-mkenums.rb +199 -0
  21. data/src/lib/glib2.rb +220 -0
  22. data/src/lib/mkmf-gnome2.rb +390 -0
  23. data/src/lib/pkg-config.rb +137 -0
  24. data/src/rbgcompat.h +30 -0
  25. data/src/rbglib.c +320 -0
  26. data/src/rbglib.h +96 -0
  27. data/src/rbglib_bookmarkfile.c +595 -0
  28. data/src/rbglib_completion.c +192 -0
  29. data/src/rbglib_convert.c +195 -0
  30. data/src/rbglib_error.c +95 -0
  31. data/src/rbglib_fileutils.c +83 -0
  32. data/src/rbglib_i18n.c +44 -0
  33. data/src/rbglib_int64.c +157 -0
  34. data/src/rbglib_iochannel.c +883 -0
  35. data/src/rbglib_keyfile.c +846 -0
  36. data/src/rbglib_maincontext.c +917 -0
  37. data/src/rbglib_mainloop.c +87 -0
  38. data/src/rbglib_messages.c +150 -0
  39. data/src/rbglib_pollfd.c +111 -0
  40. data/src/rbglib_shell.c +68 -0
  41. data/src/rbglib_source.c +190 -0
  42. data/src/rbglib_spawn.c +345 -0
  43. data/src/rbglib_threads.c +51 -0
  44. data/src/rbglib_timer.c +127 -0
  45. data/src/rbglib_unicode.c +611 -0
  46. data/src/rbglib_utils.c +386 -0
  47. data/src/rbglib_win32.c +136 -0
  48. data/src/rbgobj_boxed.c +251 -0
  49. data/src/rbgobj_closure.c +337 -0
  50. data/src/rbgobj_convert.c +167 -0
  51. data/src/rbgobj_enums.c +961 -0
  52. data/src/rbgobj_fundamental.c +30 -0
  53. data/src/rbgobj_object.c +892 -0
  54. data/src/rbgobj_param.c +390 -0
  55. data/src/rbgobj_paramspecs.c +305 -0
  56. data/src/rbgobj_signal.c +963 -0
  57. data/src/rbgobj_strv.c +61 -0
  58. data/src/rbgobj_type.c +851 -0
  59. data/src/rbgobj_typeinstance.c +121 -0
  60. data/src/rbgobj_typeinterface.c +148 -0
  61. data/src/rbgobj_typemodule.c +66 -0
  62. data/src/rbgobj_typeplugin.c +49 -0
  63. data/src/rbgobj_value.c +313 -0
  64. data/src/rbgobj_valuearray.c +59 -0
  65. data/src/rbgobj_valuetypes.c +298 -0
  66. data/src/rbgobject.c +406 -0
  67. data/src/rbgobject.h +265 -0
  68. data/src/rbgprivate.h +88 -0
  69. data/src/rbgutil.c +222 -0
  70. data/src/rbgutil.h +82 -0
  71. data/src/rbgutil_callback.c +231 -0
  72. data/test/glib-test-init.rb +6 -0
  73. data/test/glib-test-utils.rb +12 -0
  74. data/test/run-test.rb +25 -0
  75. data/test/test_enum.rb +99 -0
  76. data/test/test_file_utils.rb +15 -0
  77. data/test/test_glib2.rb +120 -0
  78. data/test/test_iochannel.rb +275 -0
  79. data/test/test_key_file.rb +38 -0
  80. data/test/test_mkenums.rb +25 -0
  81. data/test/test_signal.rb +20 -0
  82. data/test/test_timeout.rb +28 -0
  83. data/test/test_unicode.rb +369 -0
  84. data/test/test_utils.rb +37 -0
  85. data/test/test_win32.rb +13 -0
  86. metadata +165 -0
@@ -0,0 +1,345 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /**********************************************************************
3
+
4
+ rbglib_spawn.c -
5
+
6
+ $Author: sakai $
7
+ $Date: 2007/07/08 02:40:12 $
8
+
9
+ Copyright (C) 2004 Masao Mutoh
10
+ Copyright (C) 2004 Kazuhiro NISHIYAMA
11
+
12
+ **********************************************************************/
13
+ #include "rbgprivate.h"
14
+ #include "rbglib.h"
15
+
16
+ static ID id_call;
17
+ static ID id_new;
18
+
19
+ static void
20
+ child_setup(func)
21
+ gpointer func;
22
+ {
23
+ if (! NIL_P(func)){
24
+ rb_funcall((VALUE)func, id_call, 0);
25
+ }
26
+ }
27
+
28
+ static VALUE
29
+ rbglib_m_spawn_async_with_pipes(self, working_directory, argv, envp, flags)
30
+ VALUE self, working_directory, argv, envp, flags;
31
+ {
32
+ GError *err = NULL;
33
+ gboolean ret;
34
+ GPid child_pid;
35
+ VALUE func = Qnil;
36
+ gint gargc, genc, i;
37
+ gchar** gargv = (gchar**)NULL;
38
+ gchar** genvp = (gchar**)NULL;
39
+ gint standard_input, standard_output, standard_error;
40
+
41
+ if (rb_block_given_p()) {
42
+ func = rb_block_proc();
43
+ G_RELATIVE(self, func);
44
+ }
45
+
46
+ if (! NIL_P(argv)){
47
+ Check_Type(argv, T_ARRAY);
48
+ gargc = RARRAY_LEN(argv);
49
+ gargv = ALLOCA_N(gchar*, gargc + 1);
50
+ for (i = 0; i < gargc; i++) {
51
+ if (TYPE(RARRAY_PTR(argv)[i]) == T_STRING) {
52
+ gargv[i] = RVAL2CSTR(RARRAY_PTR(argv)[i]);
53
+ }
54
+ else {
55
+ gargv[i] = "";
56
+ }
57
+ }
58
+ gargv[gargc] = (gchar*)NULL;
59
+ }
60
+
61
+ if (! NIL_P(envp)){
62
+ Check_Type(envp, T_ARRAY);
63
+ genc = RARRAY_LEN(envp);
64
+ genvp = ALLOCA_N(gchar*, genc + 1);
65
+ for (i = 0; i < genc; i++) {
66
+ if (TYPE(RARRAY_PTR(envp)[i]) == T_STRING) {
67
+ genvp[i] = RVAL2CSTR(RARRAY_PTR(envp)[i]);
68
+ }
69
+ else {
70
+ genvp[i] = "";
71
+ }
72
+ }
73
+ genvp[genc] = (gchar*)NULL;
74
+ }
75
+
76
+ ret = g_spawn_async_with_pipes(NIL_P(working_directory) ? NULL : RVAL2CSTR(working_directory),
77
+ gargv, genvp, NUM2INT(flags),
78
+ (GSpawnChildSetupFunc)child_setup,
79
+ (gpointer)func,
80
+ &child_pid,
81
+ &standard_input, &standard_output,
82
+ &standard_error, &err);
83
+
84
+ if (! ret) RAISE_GERROR(err);
85
+
86
+ return rb_ary_new3(4, INT2NUM((gint)child_pid),
87
+ rb_funcall(rb_cIO, id_new, 1, INT2NUM(standard_input)),
88
+ rb_funcall(rb_cIO, id_new, 1, INT2NUM(standard_output)),
89
+ rb_funcall(rb_cIO, id_new, 1, INT2NUM(standard_error)));
90
+ }
91
+
92
+ static VALUE
93
+ rbglib_m_spawn_async(self, working_directory, argv, envp, flags)
94
+ VALUE self, working_directory, argv, envp, flags;
95
+ {
96
+ GError *err = NULL;
97
+ gboolean ret;
98
+ GPid child_pid;
99
+ VALUE func = Qnil;
100
+ gint gargc, genc, i;
101
+ gchar** gargv = (gchar**)NULL;
102
+ gchar** genvp = (gchar**)NULL;
103
+
104
+ if (rb_block_given_p()) {
105
+ func = rb_block_proc();
106
+ G_RELATIVE(self, func);
107
+ }
108
+
109
+ if (! NIL_P(argv)){
110
+ Check_Type(argv, T_ARRAY);
111
+ gargc = RARRAY_LEN(argv);
112
+ gargv = ALLOCA_N(gchar*, gargc + 1);
113
+ for (i = 0; i < gargc; i++) {
114
+ if (TYPE(RARRAY_PTR(argv)[i]) == T_STRING) {
115
+ gargv[i] = RVAL2CSTR(RARRAY_PTR(argv)[i]);
116
+ }
117
+ else {
118
+ gargv[i] = "";
119
+ }
120
+ }
121
+ gargv[gargc] = (gchar*)NULL;
122
+ }
123
+
124
+ if (! NIL_P(envp)){
125
+ Check_Type(envp, T_ARRAY);
126
+ genc = RARRAY_LEN(envp);
127
+ genvp = ALLOCA_N(gchar*, genc + 1);
128
+ for (i = 0; i < genc; i++) {
129
+ if (TYPE(RARRAY_PTR(envp)[i]) == T_STRING) {
130
+ genvp[i] = RVAL2CSTR(RARRAY_PTR(envp)[i]);
131
+ }
132
+ else {
133
+ genvp[i] = "";
134
+ }
135
+ }
136
+ genvp[genc] = (gchar*)NULL;
137
+ }
138
+
139
+ ret = g_spawn_async(NIL_P(working_directory) ? NULL : RVAL2CSTR(working_directory),
140
+ gargv, genvp, NUM2INT(flags),
141
+ (GSpawnChildSetupFunc)child_setup, (gpointer)func,
142
+ &child_pid, &err);
143
+
144
+ if (! ret){
145
+ RAISE_GERROR(err);
146
+ }
147
+
148
+ return INT2NUM((int)child_pid);
149
+ }
150
+
151
+ static VALUE
152
+ rbglib_m_spawn_sync(self, working_directory, argv, envp, flags)
153
+ VALUE self, working_directory, argv, envp, flags;
154
+ {
155
+ GError *err = NULL;
156
+ gboolean ret;
157
+ VALUE func = Qnil;
158
+ gint gargc, genc, i;
159
+ gchar** gargv = (gchar**)NULL;
160
+ gchar** genvp = (gchar**)NULL;
161
+ gchar *standard_output = NULL, *standard_error = NULL;
162
+ gint exit_status;
163
+ VALUE std_out, std_err;
164
+
165
+ if (rb_block_given_p()) {
166
+ func = rb_block_proc();
167
+ G_RELATIVE(self, func);
168
+ }
169
+
170
+ if (! NIL_P(argv)){
171
+ Check_Type(argv, T_ARRAY);
172
+ gargc = RARRAY_LEN(argv);
173
+ gargv = ALLOCA_N(gchar*, gargc + 1);
174
+ for (i = 0; i < gargc; i++) {
175
+ if (TYPE(RARRAY_PTR(argv)[i]) == T_STRING) {
176
+ gargv[i] = RVAL2CSTR(RARRAY_PTR(argv)[i]);
177
+ }
178
+ else {
179
+ gargv[i] = "";
180
+ }
181
+ }
182
+ gargv[gargc] = (gchar*)NULL;
183
+ }
184
+
185
+ if (! NIL_P(envp)){
186
+ Check_Type(envp, T_ARRAY);
187
+ genc = RARRAY_LEN(envp);
188
+ genvp = ALLOCA_N(gchar*, genc + 1);
189
+ for (i = 0; i < genc; i++) {
190
+ if (TYPE(RARRAY_PTR(envp)[i]) == T_STRING) {
191
+ genvp[i] = RVAL2CSTR(RARRAY_PTR(envp)[i]);
192
+ }
193
+ else {
194
+ genvp[i] = "";
195
+ }
196
+ }
197
+ genvp[genc] = (gchar*)NULL;
198
+ }
199
+
200
+ ret = g_spawn_sync(NIL_P(working_directory) ? NULL : RVAL2CSTR(working_directory),
201
+ gargv, genvp, NUM2INT(flags),
202
+ (GSpawnChildSetupFunc)child_setup, (gpointer)func,
203
+ &standard_output, &standard_error,
204
+ &exit_status, &err);
205
+
206
+
207
+ if (! ret){
208
+ RAISE_GERROR(err);
209
+ }
210
+
211
+ if (standard_output) {
212
+ std_out = CSTR2RVAL(standard_output);
213
+ g_free(standard_output);
214
+ } else {
215
+ std_out = Qnil;
216
+ standard_output = NULL;
217
+ }
218
+ if (standard_error) {
219
+ std_err = CSTR2RVAL(standard_error);
220
+ g_free(standard_error);
221
+ standard_error = NULL;
222
+ } else {
223
+ std_err = Qnil;
224
+ }
225
+
226
+ if (! ret)
227
+ RAISE_GERROR(err);
228
+
229
+ return rb_ary_new3(3, std_out, std_err, INT2FIX(exit_status));
230
+
231
+ }
232
+
233
+ static VALUE
234
+ rbglib_m_spawn_command_line_sync(self, str)
235
+ VALUE self, str;
236
+ {
237
+ GError *err = NULL;
238
+ const gchar *command_line;
239
+ gchar *standard_output = NULL, *standard_error = NULL;
240
+ gint exit_status;
241
+ VALUE std_out, std_err;
242
+ gboolean ret;
243
+
244
+ command_line = StringValuePtr(str);
245
+ ret = g_spawn_command_line_sync(command_line,
246
+ &standard_output,
247
+ &standard_error,
248
+ &exit_status,
249
+ &err);
250
+ if (standard_output) {
251
+ std_out = CSTR2RVAL(standard_output);
252
+ g_free(standard_output);
253
+ } else {
254
+ std_out = Qnil;
255
+ standard_output = NULL;
256
+ }
257
+ if (standard_error) {
258
+ std_err = CSTR2RVAL(standard_error);
259
+ g_free(standard_error);
260
+ standard_error = NULL;
261
+ } else {
262
+ std_err = Qnil;
263
+ }
264
+
265
+ if (! ret)
266
+ RAISE_GERROR(err);
267
+
268
+ return rb_ary_new3(3, std_out, std_err, INT2FIX(exit_status));
269
+ }
270
+
271
+ static VALUE
272
+ rbglib_m_spawn_command_line_async(self, str)
273
+ VALUE self, str;
274
+ {
275
+ GError *err = NULL;
276
+ const gchar *command_line;
277
+ VALUE ret;
278
+
279
+ command_line = StringValuePtr(str);
280
+ ret = CBOOL2RVAL(g_spawn_command_line_async(command_line, &err));
281
+ if (err != NULL)
282
+ RAISE_GERROR(err);
283
+
284
+ return ret;
285
+ }
286
+
287
+ #ifdef HAVE_G_SPAWN_CLOSE_PID
288
+ static VALUE
289
+ rbglib_m_spawn_close_pid(self, pid)
290
+ VALUE self, pid;
291
+ {
292
+ g_spawn_close_pid(NUM2INT(pid));
293
+ return Qnil;
294
+ }
295
+ #endif
296
+
297
+ void
298
+ Init_glib_spawn()
299
+ {
300
+ VALUE mGSpawn = rb_define_module_under(mGLib, "Spawn");
301
+ VALUE cSpawnError = G_DEF_ERROR2(G_SPAWN_ERROR, "SpawnError", mGLib, rb_eIOError);
302
+
303
+ id_call = rb_intern("call");
304
+ id_new = rb_intern("new");
305
+
306
+ /* glib/gspawn.h */
307
+ rb_define_module_function(mGSpawn, "async_with_pipes", rbglib_m_spawn_async_with_pipes, 4);
308
+ rb_define_module_function(mGSpawn, "async", rbglib_m_spawn_async, 4);
309
+ rb_define_module_function(mGSpawn, "sync", rbglib_m_spawn_sync, 4);
310
+ rb_define_module_function(mGSpawn, "command_line_sync", rbglib_m_spawn_command_line_sync, 1);
311
+ rb_define_module_function(mGSpawn, "command_line_async", rbglib_m_spawn_command_line_async, 1);
312
+ #ifdef HAVE_G_SPAWN_CLOSE_PID
313
+ rb_define_module_function(mGSpawn, "close_pid", rbglib_m_spawn_close_pid, 1);
314
+ #endif
315
+
316
+ rb_define_const(mGSpawn, "LEAVE_DESCRIPTORS_OPEN", INT2NUM(G_SPAWN_LEAVE_DESCRIPTORS_OPEN));
317
+ rb_define_const(mGSpawn, "DO_NOT_REAP_CHILD", INT2NUM(G_SPAWN_DO_NOT_REAP_CHILD));
318
+ rb_define_const(mGSpawn, "SEARCH_PATH", INT2NUM(G_SPAWN_SEARCH_PATH));
319
+ rb_define_const(mGSpawn, "STDOUT_TO_DEV_NULL", INT2NUM(G_SPAWN_STDOUT_TO_DEV_NULL));
320
+ rb_define_const(mGSpawn, "STDERR_TO_DEV_NULL", INT2NUM(G_SPAWN_STDERR_TO_DEV_NULL));
321
+ rb_define_const(mGSpawn, "CHILD_INHERITS_STDIN", INT2NUM(G_SPAWN_CHILD_INHERITS_STDIN));
322
+ rb_define_const(mGSpawn, "FILE_AND_ARGV_ZERO", INT2NUM(G_SPAWN_FILE_AND_ARGV_ZERO));
323
+
324
+ rb_define_const(cSpawnError, "FORK", INT2NUM(G_SPAWN_ERROR_FORK));
325
+ rb_define_const(cSpawnError, "READ", INT2NUM(G_SPAWN_ERROR_READ));
326
+ rb_define_const(cSpawnError, "CHDIR", INT2NUM(G_SPAWN_ERROR_CHDIR));
327
+ rb_define_const(cSpawnError, "EACCES", INT2NUM(G_SPAWN_ERROR_ACCES));
328
+ rb_define_const(cSpawnError, "EPERM", INT2NUM(G_SPAWN_ERROR_PERM));
329
+ rb_define_const(cSpawnError, "E2BIG", INT2NUM(G_SPAWN_ERROR_2BIG));
330
+ rb_define_const(cSpawnError, "ENOEXEC", INT2NUM(G_SPAWN_ERROR_NOEXEC));
331
+ rb_define_const(cSpawnError, "ENAMETOOLONG", INT2NUM(G_SPAWN_ERROR_NAMETOOLONG));
332
+ rb_define_const(cSpawnError, "ENOENT", INT2NUM(G_SPAWN_ERROR_NOENT));
333
+ rb_define_const(cSpawnError, "ENOMEM", INT2NUM(G_SPAWN_ERROR_NOMEM));
334
+ rb_define_const(cSpawnError, "ENOTDIR", INT2NUM(G_SPAWN_ERROR_NOTDIR));
335
+ rb_define_const(cSpawnError, "ELOOP", INT2NUM(G_SPAWN_ERROR_LOOP));
336
+ rb_define_const(cSpawnError, "ETXTBUSY", INT2NUM(G_SPAWN_ERROR_TXTBUSY));
337
+ rb_define_const(cSpawnError, "EIO", INT2NUM(G_SPAWN_ERROR_IO));
338
+ rb_define_const(cSpawnError, "ENFILE", INT2NUM(G_SPAWN_ERROR_NFILE));
339
+ rb_define_const(cSpawnError, "EMFILE", INT2NUM(G_SPAWN_ERROR_MFILE));
340
+ rb_define_const(cSpawnError, "EINVAL", INT2NUM(G_SPAWN_ERROR_INVAL));
341
+ rb_define_const(cSpawnError, "EISDIR", INT2NUM(G_SPAWN_ERROR_ISDIR));
342
+ rb_define_const(cSpawnError, "ELIBBAD", INT2NUM(G_SPAWN_ERROR_LIBBAD));
343
+ rb_define_const(cSpawnError, "FAILED", INT2NUM(G_SPAWN_ERROR_FAILED));
344
+
345
+ }
@@ -0,0 +1,51 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /************************************************
3
+
4
+ rbglib_threads.c -
5
+
6
+ $Author: mutoh $
7
+ $Date: 2005/03/06 14:10:17 $
8
+
9
+ Copyright (C) 2005 Masao Mutoh
10
+ ************************************************/
11
+
12
+ #include "rbgprivate.h"
13
+
14
+ static VALUE gthreads;
15
+
16
+ static VALUE
17
+ gt_init(self)
18
+ VALUE self;
19
+ {
20
+ #ifdef HAVE_G_THREAD_INIT
21
+ #ifdef G_THREADS_ENABLED
22
+ g_thread_init(NULL);
23
+ #endif
24
+ #endif
25
+ return self;
26
+ }
27
+
28
+ static VALUE
29
+ gt_supported(self)
30
+ VALUE self;
31
+ {
32
+ #ifdef HAVE_G_THREAD_INIT
33
+ #ifdef G_THREADS_ENABLED
34
+ return CBOOL2RVAL(g_thread_supported());
35
+ #else
36
+ return Qfalse;
37
+ #endif
38
+ #else
39
+ return Qfalse;
40
+ #endif
41
+
42
+ }
43
+
44
+ void
45
+ Init_glib_threads()
46
+ {
47
+ gthreads = rb_define_class_under(mGLib, "Thread", rb_cObject);
48
+
49
+ rb_define_singleton_method(gthreads, "init", gt_init, 0);
50
+ rb_define_singleton_method(gthreads, "supported?", gt_supported, 0);
51
+ }
@@ -0,0 +1,127 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /************************************************
3
+
4
+ rbglib_timer.c -
5
+
6
+ $Author: mutoh $
7
+ $Date: 2005/11/23 14:27:58 $
8
+
9
+ Copyright (C) 2005 Masao Mutoh
10
+ ************************************************/
11
+
12
+ #include "rbgprivate.h"
13
+
14
+ #ifdef G_OS_WIN32
15
+ #include <windows.h>
16
+ #endif
17
+
18
+ /*****************************************/
19
+
20
+ /* This is stolen from gtimer.c of glib-2.6.2. */
21
+ struct _GTimer
22
+ {
23
+ #ifdef G_OS_WIN32
24
+ DWORD start;
25
+ DWORD end;
26
+ #else /* !G_OS_WIN32 */
27
+ struct timeval start;
28
+ struct timeval end;
29
+ #endif /* !G_OS_WIN32 */
30
+
31
+ guint active : 1;
32
+ };
33
+
34
+ static GTimer*
35
+ timer_copy(timer)
36
+ GTimer* timer;
37
+ {
38
+ GTimer* new_timer;
39
+ g_return_val_if_fail (timer != NULL, NULL);
40
+
41
+ new_timer = g_new(struct _GTimer, 1);
42
+ *new_timer = *timer;
43
+ return new_timer;
44
+ }
45
+
46
+ GType
47
+ g_timer_get_type(void)
48
+ {
49
+ static GType our_type = 0;
50
+ if (our_type == 0)
51
+ our_type = g_boxed_type_register_static ("GTimer",
52
+ (GBoxedCopyFunc)timer_copy,
53
+ (GBoxedFreeFunc)g_timer_destroy);
54
+ return our_type;
55
+ }
56
+ /*****************************************/
57
+
58
+ #define G_TYPE_TIMER (g_timer_get_type())
59
+
60
+ #define _SELF(s) ((GTimer*)RVAL2BOXED(s, G_TYPE_TIMER))
61
+
62
+ static VALUE
63
+ timer_initialize(self)
64
+ VALUE self;
65
+ {
66
+ G_INITIALIZE(self, g_timer_new());
67
+ return Qnil;
68
+ }
69
+
70
+ static VALUE
71
+ timer_start(self)
72
+ VALUE self;
73
+ {
74
+ g_timer_start(_SELF(self));
75
+ return self;
76
+ }
77
+
78
+ static VALUE
79
+ timer_stop(self)
80
+ VALUE self;
81
+ {
82
+ g_timer_stop(_SELF(self));
83
+ return self;
84
+ }
85
+
86
+ #if GLIB_CHECK_VERSION(2,4,0)
87
+ static VALUE
88
+ timer_continue(self)
89
+ VALUE self;
90
+ {
91
+ g_timer_continue(_SELF(self));
92
+ return self;
93
+ }
94
+ #endif
95
+
96
+ static VALUE
97
+ timer_elapsed(self)
98
+ VALUE self;
99
+ {
100
+ gulong microseconds;
101
+ gdouble ret = g_timer_elapsed(_SELF(self), &microseconds);
102
+
103
+ return rb_assoc_new(rb_float_new(ret), ULONG2NUM(microseconds));
104
+ }
105
+
106
+ static VALUE
107
+ timer_reset(self)
108
+ VALUE self;
109
+ {
110
+ g_timer_reset(_SELF(self));
111
+ return self;
112
+ }
113
+
114
+ void
115
+ Init_glib_timer()
116
+ {
117
+ VALUE timer = G_DEF_CLASS(G_TYPE_TIMER, "Timer", mGLib);
118
+
119
+ rb_define_method(timer, "initialize", timer_initialize, 0);
120
+ rb_define_method(timer, "start", timer_start, 0);
121
+ rb_define_method(timer, "stop", timer_stop, 0);
122
+ #if GLIB_CHECK_VERSION(2,4,0)
123
+ rb_define_method(timer, "continue", timer_continue, 0);
124
+ #endif
125
+ rb_define_method(timer, "elapsed", timer_elapsed, 0);
126
+ rb_define_method(timer, "reset", timer_reset, 0);
127
+ }