gir_ffi 0.0.14 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. data/History.txt +6 -0
  2. data/README.rdoc +36 -12
  3. data/examples/01_empty_window.rb +1 -3
  4. data/examples/02_hello_world.rb +1 -3
  5. data/examples/03_upgraded_hello_world.rb +1 -3
  6. data/examples/04_webkit.rb +2 -2
  7. data/examples/05_notification.rb +1 -2
  8. data/examples/print_class.rb +6 -4
  9. data/lib/ffi-glib.rb +107 -0
  10. data/lib/ffi-glib/array.rb +14 -0
  11. data/lib/ffi-glib/byte_array.rb +10 -0
  12. data/lib/ffi-glib/hash_table.rb +55 -0
  13. data/lib/ffi-glib/list.rb +9 -0
  14. data/lib/ffi-glib/list_methods.rb +31 -0
  15. data/lib/ffi-glib/s_list.rb +9 -0
  16. data/lib/ffi-gobject.rb +94 -0
  17. data/lib/ffi-gobject/closure.rb +12 -0
  18. data/lib/ffi-gobject/helper.rb +119 -0
  19. data/lib/ffi-gobject/initially_unowned.rb +10 -0
  20. data/lib/ffi-gobject/ruby_closure.rb +47 -0
  21. data/lib/ffi-gobject/value.rb +65 -0
  22. data/lib/ffi-gobject_introspection.rb +3 -0
  23. data/lib/{gir_ffi → ffi-gobject_introspection}/g_error.rb +1 -1
  24. data/lib/ffi-gobject_introspection/gobject_lib.rb +7 -0
  25. data/lib/{gir_ffi → ffi-gobject_introspection}/i_arg_info.rb +2 -2
  26. data/lib/{gir_ffi → ffi-gobject_introspection}/i_base_info.rb +1 -1
  27. data/lib/{gir_ffi → ffi-gobject_introspection}/i_callable_info.rb +4 -4
  28. data/lib/{gir_ffi → ffi-gobject_introspection}/i_callback_info.rb +1 -1
  29. data/lib/{gir_ffi → ffi-gobject_introspection}/i_constant_info.rb +2 -3
  30. data/lib/{gir_ffi → ffi-gobject_introspection}/i_enum_info.rb +1 -1
  31. data/lib/{gir_ffi → ffi-gobject_introspection}/i_field_info.rb +1 -1
  32. data/lib/{gir_ffi → ffi-gobject_introspection}/i_flags_info.rb +1 -1
  33. data/lib/{gir_ffi → ffi-gobject_introspection}/i_function_info.rb +1 -1
  34. data/lib/{gir_ffi → ffi-gobject_introspection}/i_interface_info.rb +1 -1
  35. data/lib/{gir_ffi → ffi-gobject_introspection}/i_object_info.rb +1 -1
  36. data/lib/{gir_ffi → ffi-gobject_introspection}/i_property_info.rb +1 -1
  37. data/lib/{gir_ffi → ffi-gobject_introspection}/i_registered_type_info.rb +1 -1
  38. data/lib/{gir_ffi → ffi-gobject_introspection}/i_repository.rb +37 -23
  39. data/lib/{gir_ffi → ffi-gobject_introspection}/i_signal_info.rb +1 -1
  40. data/lib/{gir_ffi → ffi-gobject_introspection}/i_struct_info.rb +1 -1
  41. data/lib/{gir_ffi → ffi-gobject_introspection}/i_type_info.rb +2 -2
  42. data/lib/{gir_ffi → ffi-gobject_introspection}/i_union_info.rb +1 -1
  43. data/lib/{gir_ffi → ffi-gobject_introspection}/i_value_info.rb +1 -1
  44. data/lib/{gir_ffi → ffi-gobject_introspection}/i_vfunc_info.rb +1 -1
  45. data/lib/{gir_ffi → ffi-gobject_introspection}/lib.rb +1 -1
  46. data/lib/ffi-gtk/base.rb +17 -0
  47. data/lib/ffi-gtk2.rb +5 -0
  48. data/lib/ffi-gtk3.rb +5 -0
  49. data/lib/gir_ffi.rb +11 -4
  50. data/lib/gir_ffi/arg_helper.rb +5 -4
  51. data/lib/gir_ffi/builder.rb +3 -25
  52. data/lib/gir_ffi/builder/argument.rb +0 -2
  53. data/lib/gir_ffi/builder/argument/hash_table_base.rb +1 -1
  54. data/lib/gir_ffi/builder/argument/list_base.rb +1 -1
  55. data/lib/gir_ffi/builder/module.rb +1 -6
  56. data/lib/gir_ffi/builder/type/unintrospectable.rb +1 -1
  57. data/lib/gir_ffi/callback_helper.rb +14 -7
  58. data/lib/gir_ffi/in_out_pointer.rb +1 -1
  59. data/lib/gir_ffi/in_pointer.rb +1 -1
  60. data/lib/gir_ffi/module_base.rb +4 -0
  61. data/lib/gir_ffi/type_map.rb +29 -0
  62. data/lib/gir_ffi/version.rb +1 -1
  63. data/tasks/test.rake +20 -1
  64. data/test/arg_helper_test.rb +10 -13
  65. data/test/builder_test.rb +2 -2
  66. data/test/class_base_test.rb +1 -1
  67. data/test/{glib_overrides_test.rb → ffi-glib/glib_overrides_test.rb} +3 -5
  68. data/test/{g_object_overrides_test.rb → ffi-gobject/g_object_overrides_test.rb} +7 -37
  69. data/test/ffi-gobject/gobject_test.rb +22 -0
  70. data/test/ffi-gobject/value_test.rb +34 -0
  71. data/test/{unit → ffi-gobject_introspection}/i_base_info_test.rb +2 -2
  72. data/test/{unit → ffi-gobject_introspection}/i_constant_info_test.rb +1 -1
  73. data/test/ffi-gobject_introspection/i_object_info_test.rb +20 -0
  74. data/test/{unit → ffi-gobject_introspection}/i_repository_test.rb +11 -11
  75. data/test/function_definition_builder_test.rb +1 -1
  76. data/test/gir_ffi_test_helper.rb +114 -0
  77. data/test/girffi_test.rb +2 -2
  78. data/test/gtk_overrides_test.rb +15 -12
  79. data/test/integration/generated_gimarshallingtests_test.rb +10 -5
  80. data/test/integration/generated_gio_test.rb +1 -1
  81. data/test/integration/generated_gobject_test.rb +1 -1
  82. data/test/integration/generated_gtk_test.rb +3 -3
  83. data/test/integration/generated_regress_test.rb +11 -3
  84. data/test/interface_type_builder_test.rb +1 -1
  85. data/test/module_builder_test.rb +1 -1
  86. data/test/test_helper.rb +2 -111
  87. data/test/type_builder_test.rb +2 -2
  88. data/test/unintrospectable_type_builder_test.rb +1 -1
  89. data/test/unit/builder_test.rb +1 -1
  90. data/test/unit/callback_helper_test.rb +13 -10
  91. data/test/unit/constant_builder_test.rb +1 -1
  92. data/test/unit/in_out_pointer_test.rb +1 -1
  93. data/test/unit/in_pointer_test.rb +1 -1
  94. data/test/unit/object_type_builder_test.rb +1 -1
  95. metadata +62 -43
  96. data/lib/gir_ffi/g_object.rb +0 -38
  97. data/lib/gir_ffi/overrides/glib.rb +0 -225
  98. data/lib/gir_ffi/overrides/gobject.rb +0 -330
  99. data/lib/gir_ffi/overrides/gtk.rb +0 -29
  100. data/test/g_object_test.rb +0 -21
  101. data/test/i_object_info_test.rb +0 -20
@@ -1,38 +0,0 @@
1
- require 'ffi'
2
-
3
- module GirFFI
4
- # TODO: Rename to avoid constant lookup issues (and confusion).
5
- module GObject
6
- def self.type_init
7
- Lib::g_type_init
8
- end
9
-
10
- def self.object_ref obj
11
- Lib::g_object_ref obj.to_ptr
12
- end
13
-
14
- def self.object_ref_sink obj
15
- Lib::g_object_ref_sink obj.to_ptr
16
- end
17
-
18
- def self.object_unref obj
19
- Lib::g_object_unref obj.to_ptr
20
- end
21
-
22
- def self.object_is_floating obj
23
- Lib::g_object_is_floating obj.to_ptr
24
- end
25
-
26
- module Lib
27
- extend FFI::Library
28
- ffi_lib "gobject-2.0"
29
- attach_function :g_type_init, [], :void
30
- attach_function :g_object_ref, [:pointer], :void
31
- attach_function :g_object_ref_sink, [:pointer], :void
32
- attach_function :g_object_unref, [:pointer], :void
33
- attach_function :g_object_is_floating, [:pointer], :bool
34
- end
35
- end
36
- end
37
-
38
-
@@ -1,225 +0,0 @@
1
- module GirFFI
2
- module Overrides
3
- module GLib
4
- def self.included base
5
- base.extend ClassMethods
6
- extend_classes(base)
7
- attach_non_introspectable_functions(base)
8
- end
9
-
10
- def self.extend_classes base
11
- base::SList.class_eval {
12
- attr_accessor :element_type
13
- include ListInstanceMethods
14
- extend ListClassMethods
15
- include Enumerable
16
- }
17
- base::List.class_eval {
18
- attr_accessor :element_type
19
- include ListInstanceMethods
20
- extend ListClassMethods
21
- include Enumerable
22
- }
23
- base::HashTable.class_eval {
24
- attr_accessor :key_type
25
- attr_accessor :value_type
26
- include HashTableInstanceMethods
27
- extend HashTableClassMethods
28
- include Enumerable
29
- }
30
- base::ByteArray.class_eval {
31
- include ByteArrayInstanceMethods
32
- }
33
- base::Array.class_eval {
34
- attr_accessor :element_type
35
- include ArrayInstanceMethods
36
- }
37
- end
38
-
39
- def self.attach_non_introspectable_functions base
40
- base::Lib.attach_function :g_slist_prepend, [:pointer, :pointer],
41
- :pointer
42
-
43
- base::Lib.attach_function :g_list_append, [:pointer, :pointer],
44
- :pointer
45
-
46
- base::Lib.attach_function :g_hash_table_foreach,
47
- [:pointer, base::HFunc, :pointer], :void
48
- base::Lib.attach_function :g_hash_table_new,
49
- [base::HashFunc, base::EqualFunc], :pointer
50
- base::Lib.attach_function :g_hash_table_insert,
51
- [:pointer, :pointer, :pointer], :void
52
-
53
- base::Lib.attach_function :g_byte_array_new, [], :pointer
54
- base::Lib.attach_function :g_byte_array_append,
55
- [:pointer, :pointer, :uint], :pointer
56
-
57
- base::Lib.attach_function :g_array_new, [:int, :int, :uint], :pointer
58
- base::Lib.attach_function :g_array_append_vals,
59
- [:pointer, :pointer, :uint], :pointer
60
-
61
- base::Lib.attach_function :g_main_loop_new,
62
- [:pointer, :bool], :pointer
63
- end
64
-
65
- module ClassMethods
66
- # FIXME: Turn into real constructor
67
- def slist_new elmttype
68
- ::GLib::List._real_new(FFI::Pointer.new(0)).tap {|it|
69
- it.element_type = elmttype}
70
- end
71
-
72
- # FIXME: Turn into instance method; Use element type.
73
- def slist_prepend slist, data
74
- ::GLib::SList.wrap(slist.element_type, ::GLib::Lib.g_slist_prepend(slist, data))
75
- end
76
-
77
- # FIXME: Turn into real constructor
78
- def list_new elmttype
79
- ::GLib::List._real_new(FFI::Pointer.new(0)).tap {|it|
80
- it.element_type = elmttype}
81
- end
82
-
83
- # FIXME: Turn into instance method; Use element type.
84
- def list_append list, data
85
- ::GLib::List.wrap(list.element_type, ::GLib::Lib.g_list_append(list, data))
86
- end
87
-
88
- # FIXME: Turn into real constructor
89
- def hash_table_new keytype, valtype
90
- hash_fn, eq_fn = case keytype
91
- when :utf8
92
- lib = ::GLib::Lib.ffi_libraries.first
93
- [ FFI::Function.new(:uint, [:pointer], lib.find_function("g_str_hash")),
94
- FFI::Function.new(:int, [:pointer, :pointer], lib.find_function("g_str_equal"))]
95
- else
96
- [nil, nil]
97
- end
98
-
99
- ::GLib::HashTable.wrap(keytype, valtype, ::GLib::Lib.g_hash_table_new(hash_fn, eq_fn))
100
- end
101
-
102
- # FIXME: Turn into real constructor
103
- def byte_array_new
104
- ::GLib::ByteArray.wrap(::GLib::Lib.g_byte_array_new)
105
- end
106
-
107
- # FIXME: Turn into instance method
108
- def byte_array_append arr, data
109
- bytes = GirFFI::InPointer.from :utf8, data
110
- len = data.bytesize
111
- ::GLib::ByteArray.wrap(::GLib::Lib.g_byte_array_append arr.to_ptr, bytes, len)
112
- end
113
-
114
- # FIXME: Turn into real constructor
115
- def array_new type
116
- ffi_type = type == :utf8 ? :pointer : type
117
- arr = ::GLib::Array.wrap(
118
- ::GLib::Lib.g_array_new(0, 0, FFI.type_size(ffi_type)))
119
- arr.element_type = type
120
- arr
121
- end
122
-
123
- # FIXME: Turn into instance method
124
- def array_append_vals arr, data
125
- bytes = GirFFI::InPointer.from_array arr.element_type, data
126
- len = data.length
127
- res = ::GLib::Array.wrap(
128
- ::GLib::Lib.g_array_append_vals(arr.to_ptr, bytes, len))
129
- res.element_type = arr.element_type
130
- res
131
- end
132
-
133
- # FIXME: Turn into real constructor?
134
- def main_loop_new context, is_running
135
- ::GLib::MainLoop.wrap(::GLib::Lib.g_main_loop_new context, is_running)
136
- end
137
- end
138
-
139
- module ListInstanceMethods
140
- def each
141
- list = self
142
- rval = nil
143
- until list.nil?
144
- rval = yield GirFFI::ArgHelper.cast_from_pointer(element_type, list[:data])
145
- list = self.class.wrap(element_type, list[:next])
146
- end
147
- rval
148
- end
149
- end
150
-
151
- module ListClassMethods
152
- def wrap elmttype, ptr
153
- super(ptr).tap do |it|
154
- break if it.nil?
155
- it.element_type = elmttype
156
- end
157
- end
158
- end
159
-
160
- module HashTableClassMethods
161
- def wrap keytype, valtype, ptr
162
- super(ptr).tap do |it|
163
- break if it.nil?
164
- it.key_type = keytype
165
- it.value_type = valtype
166
- end
167
- end
168
- end
169
-
170
- module HashTableInstanceMethods
171
- def each
172
- prc = Proc.new {|keyptr, valptr, userdata|
173
- key = cast_from_pointer key_type, keyptr
174
- val = cast_from_pointer value_type, valptr
175
- yield key, val
176
- }
177
- ::GLib::Lib.g_hash_table_foreach self.to_ptr, prc, nil
178
- end
179
-
180
- def to_hash
181
- Hash[self.to_a]
182
- end
183
-
184
- def insert key, value
185
- keyptr = cast_to_pointer key_type, key
186
- valptr = cast_to_pointer value_type, value
187
- ::GLib::Lib.g_hash_table_insert self.to_ptr, keyptr, valptr
188
- end
189
-
190
- def cast_to_pointer type, it
191
- if type == :utf8
192
- GirFFI::InPointer.from :utf8, it
193
- else
194
- FFI::Pointer.new(it)
195
- end
196
- end
197
-
198
- def cast_from_pointer type, it
199
- case type
200
- when :utf8
201
- GirFFI::ArgHelper.ptr_to_utf8 it
202
- when :gint32
203
- GirFFI::ArgHelper.cast_pointer_to_int32 it
204
- else
205
- it.address
206
- end
207
- end
208
- end
209
-
210
- module ByteArrayInstanceMethods
211
- def to_string
212
- GirFFI::ArgHelper.ptr_to_utf8_length self[:data], self[:len]
213
- end
214
- end
215
-
216
- module ArrayInstanceMethods
217
- def to_a
218
- GirFFI::ArgHelper.ptr_to_typed_array(self.element_type,
219
- self[:data], self[:len])
220
- end
221
- end
222
- end
223
- end
224
- end
225
-
@@ -1,330 +0,0 @@
1
- module GirFFI
2
- module Overrides
3
- module GObject
4
-
5
- def self.included base
6
- base.extend ClassMethods
7
- extend_classes(base)
8
- attach_non_introspectable_functions(base)
9
- preload_methods(base)
10
- build_extra_classes(base)
11
- end
12
-
13
- def self.extend_classes base
14
- base::InitiallyUnowned.extend InitiallyUnownedClassMethods
15
- base::Value.class_eval {
16
- include ValueInstanceMethods
17
- extend ValueClassMethods
18
- }
19
- base::Closure.class_eval {
20
- include ClosureInstanceMethods
21
- }
22
- end
23
-
24
- def self.attach_non_introspectable_functions base
25
- base::Lib.attach_function :g_signal_connect_data,
26
- [:pointer, :string, base::Callback, :pointer, base::ClosureNotify,
27
- base::ConnectFlags],
28
- :ulong
29
- base::Lib.attach_function :g_closure_set_marshal,
30
- [:pointer, base::ClosureMarshal], :void
31
- end
32
-
33
- def self.preload_methods base
34
- base._setup_method :signal_emitv
35
- end
36
-
37
- def self.build_extra_classes base
38
- build_ruby_closure_class base
39
- end
40
-
41
- # Build the GObject::RubyClosure class. This class encapsulates Ruby
42
- # blocks as GObject Closures.
43
- def self.build_ruby_closure_class base
44
- klass = Class.new(base::Closure) do
45
- const_set :BLOCK_STORE, {}
46
-
47
- const_set :Struct, Class.new(FFI::Struct) {
48
- layout :parent, base::Closure::Struct, 0,
49
- :blockhash, :int64
50
- }
51
-
52
- def self.new &block
53
- raise ArgumentError unless block_given?
54
- wrap(new_simple(self::Struct.size, nil).to_ptr).tap do |it|
55
- h = block.object_id
56
- self::BLOCK_STORE[h] = block
57
- it[:blockhash] = h
58
- it.set_marshal Proc.new {|*args| marshaller(*args)}
59
- end
60
- end
61
-
62
- def self.marshaller(closure, return_value, n_param_values,
63
- param_values, invocation_hint, marshal_data)
64
- rclosure = self.wrap(closure.to_ptr)
65
-
66
- args = []
67
- n_param_values.times {|i|
68
- gv = ::GObject::Value.wrap(param_values.to_ptr +
69
- i * ::GObject::Value::Struct.size)
70
- args << gv.ruby_value
71
- }
72
-
73
- r = rclosure.invoke_block(*args)
74
- return_value.set_ruby_value r unless return_value.nil?
75
- end
76
-
77
- def block
78
- self.class::BLOCK_STORE[self[:blockhash]]
79
- end
80
-
81
- def invoke_block *args
82
- block.call(*args)
83
- end
84
- end
85
- base.const_set :RubyClosure, klass
86
- end
87
-
88
- module ClassMethods
89
- # FIXME: These four helper methods belong elsewhere.
90
- def type_from_instance_pointer inst_ptr
91
- base = ::GObject::TypeInstance.wrap inst_ptr
92
- kls = ::GObject::TypeClass.wrap(base[:g_class])
93
- kls[:g_type]
94
- end
95
-
96
- def type_from_instance instance
97
- type_from_instance_pointer instance.to_ptr
98
- end
99
-
100
- def signal_emit object, signal, *args
101
- type = type_from_instance object
102
- id = signal_lookup signal, type
103
-
104
- arr = Helper.signal_arguments_to_gvalue_array signal, object, *args
105
- rval = Helper.gvalue_for_signal_return_value signal, object
106
-
107
- ::GObject::Lib.g_signal_emitv arr[:values], id, 0, rval
108
-
109
- rval
110
- end
111
-
112
- def signal_connect object, signal, data=nil, &block
113
- sig = object.class._find_signal signal
114
- if sig.nil?
115
- raise "Signal #{signal} is invalid for #{object}"
116
- end
117
- if block.nil?
118
- raise ArgumentError, "Block needed"
119
- end
120
-
121
- rettype = GirFFI::Builder.itypeinfo_to_ffitype sig.return_type
122
-
123
- argtypes = GirFFI::Builder.ffi_argument_types_for_signal sig
124
-
125
- callback = FFI::Function.new rettype, argtypes,
126
- &(Helper.signal_callback_args(sig, object.class, &block))
127
- ::GObject::Lib::CALLBACKS << callback
128
-
129
- data_ptr = GirFFI::ArgHelper.object_to_inptr data
130
-
131
- ::GObject::Lib.g_signal_connect_data object, signal, callback, data_ptr, nil, 0
132
- end
133
- end
134
-
135
- module Helper
136
- TAG_TYPE_TO_GTYPE_NAME_MAP = {
137
- :utf8 => "gchararray",
138
- :gboolean => "gboolean",
139
- :void => "void"
140
- }
141
-
142
- def self.signal_callback_args sig, klass, &block
143
- return Proc.new do |*args|
144
- mapped = cast_back_signal_arguments sig, klass, *args
145
- block.call(*mapped)
146
- end
147
- end
148
-
149
- def self.signal_arguments_to_gvalue_array signal, instance, *rest
150
- sig = instance.class._find_signal signal
151
-
152
- arr = ::GObject::ValueArray.new sig.n_args+1
153
-
154
- arr.append signal_reciever_to_gvalue instance
155
-
156
- sig.args.zip(rest).each do |info, arg|
157
- arr.append signal_argument_to_gvalue info, arg
158
- end
159
-
160
- arr
161
- end
162
-
163
- def self.signal_reciever_to_gvalue instance
164
- val = ::GObject::Value.new
165
- val.init ::GObject.type_from_instance instance
166
- val.set_instance instance
167
- return val
168
- end
169
-
170
- def self.signal_argument_to_gvalue info, arg
171
- arg_type = info.argument_type
172
-
173
- val = gvalue_for_type_info arg_type
174
-
175
- if arg_type.tag == :interface
176
- interface = arg_type.interface
177
- case interface.info_type
178
- when :struct
179
- val.set_boxed arg
180
- when :object
181
- val.set_instance arg
182
- when :enum
183
- val.set_enum arg
184
- else
185
- raise NotImplementedError, interface.info_type
186
- end
187
- else
188
- val.set_ruby_value arg
189
- end
190
-
191
- return val
192
- end
193
-
194
- def self.gvalue_for_type_info info
195
- tag = info.tag
196
- gtype = case tag
197
- when :interface
198
- info.interface.g_type
199
- when :void
200
- return nil
201
- else
202
- ::GObject.type_from_name(TAG_TYPE_TO_GTYPE_NAME_MAP[tag])
203
- end
204
- ::GObject::Value.new.tap {|val| val.init gtype}
205
- end
206
-
207
- def self.gvalue_for_signal_return_value signal, object
208
- sig = object.class._find_signal signal
209
- rettypeinfo = sig.return_type
210
-
211
- gvalue_for_type_info rettypeinfo
212
- end
213
-
214
- # TODO: Generate cast back methods using existing Argument builders.
215
- def self.cast_back_signal_arguments signalinfo, klass, *args
216
- result = []
217
-
218
- # Instance
219
- instptr = args.shift
220
- instance = klass.wrap instptr
221
- result << instance
222
-
223
- # Extra arguments
224
- signalinfo.args.each do |info|
225
- result << cast_signal_argument(info, args.shift)
226
- end
227
-
228
- # User Data
229
- arg = args.shift
230
- arg = GirFFI::ArgHelper::OBJECT_STORE[arg.address]
231
- result << arg
232
-
233
- return result
234
- end
235
-
236
- def self.cast_signal_argument info, arg
237
- arg_t = info.argument_type
238
- if arg_t.tag == :interface
239
- iface = arg_t.interface
240
- kls = GirFFI::Builder.build_class iface
241
- case iface.info_type
242
- when :enum, :flags
243
- kls[arg]
244
- else
245
- kls.wrap(arg)
246
- end
247
- else
248
- arg
249
- end
250
- end
251
- end
252
-
253
- module InitiallyUnownedClassMethods
254
- def constructor_wrap ptr
255
- super.tap {|obj| GirFFI::GObject.object_ref_sink obj}
256
- end
257
- end
258
-
259
- module ValueClassMethods
260
- def wrap_ruby_value val
261
- self.new.set_ruby_value val
262
- end
263
- end
264
-
265
- module ValueInstanceMethods
266
- def set_ruby_value val
267
- if current_gtype == 0
268
- init_for_ruby_value val
269
- end
270
-
271
- case current_gtype_name
272
- when "gboolean"
273
- set_boolean val
274
- when "gint"
275
- set_int val
276
- when "gchararray"
277
- set_string val
278
- else
279
- nil
280
- end
281
- self
282
- end
283
-
284
- def init_for_ruby_value val
285
- case val
286
- when true, false
287
- init ::GObject.type_from_name("gboolean")
288
- when Integer
289
- init ::GObject.type_from_name("gint")
290
- end
291
- self
292
- end
293
-
294
- def current_gtype
295
- self[:g_type]
296
- end
297
-
298
- def current_gtype_name
299
- ::GObject.type_name current_gtype
300
- end
301
-
302
- def ruby_value
303
- case current_gtype_name.to_sym
304
- when :gboolean
305
- get_boolean
306
- when :gint
307
- get_int
308
- when :gchararray
309
- get_string
310
- when :GDate
311
- ::GLib::Date.wrap(get_boxed)
312
- when :GStrv
313
- ArgHelper.strv_to_utf8_array get_boxed
314
- else
315
- nil
316
- end
317
- end
318
- end
319
-
320
- module ClosureInstanceMethods
321
- def set_marshal marshal
322
- _v1 = GirFFI::CallbackHelper.wrap_in_callback_args_mapper(
323
- "GObject", "ClosureMarshal", marshal)
324
- ::GObject::Lib::CALLBACKS << _v1
325
- ::GObject::Lib.g_closure_set_marshal self, _v1
326
- end
327
- end
328
- end
329
- end
330
- end