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.
- data/History.txt +6 -0
- data/README.rdoc +36 -12
- data/examples/01_empty_window.rb +1 -3
- data/examples/02_hello_world.rb +1 -3
- data/examples/03_upgraded_hello_world.rb +1 -3
- data/examples/04_webkit.rb +2 -2
- data/examples/05_notification.rb +1 -2
- data/examples/print_class.rb +6 -4
- data/lib/ffi-glib.rb +107 -0
- data/lib/ffi-glib/array.rb +14 -0
- data/lib/ffi-glib/byte_array.rb +10 -0
- data/lib/ffi-glib/hash_table.rb +55 -0
- data/lib/ffi-glib/list.rb +9 -0
- data/lib/ffi-glib/list_methods.rb +31 -0
- data/lib/ffi-glib/s_list.rb +9 -0
- data/lib/ffi-gobject.rb +94 -0
- data/lib/ffi-gobject/closure.rb +12 -0
- data/lib/ffi-gobject/helper.rb +119 -0
- data/lib/ffi-gobject/initially_unowned.rb +10 -0
- data/lib/ffi-gobject/ruby_closure.rb +47 -0
- data/lib/ffi-gobject/value.rb +65 -0
- data/lib/ffi-gobject_introspection.rb +3 -0
- data/lib/{gir_ffi → ffi-gobject_introspection}/g_error.rb +1 -1
- data/lib/ffi-gobject_introspection/gobject_lib.rb +7 -0
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_arg_info.rb +2 -2
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_base_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_callable_info.rb +4 -4
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_callback_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_constant_info.rb +2 -3
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_enum_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_field_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_flags_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_function_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_interface_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_object_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_property_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_registered_type_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_repository.rb +37 -23
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_signal_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_struct_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_type_info.rb +2 -2
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_union_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_value_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_vfunc_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/lib.rb +1 -1
- data/lib/ffi-gtk/base.rb +17 -0
- data/lib/ffi-gtk2.rb +5 -0
- data/lib/ffi-gtk3.rb +5 -0
- data/lib/gir_ffi.rb +11 -4
- data/lib/gir_ffi/arg_helper.rb +5 -4
- data/lib/gir_ffi/builder.rb +3 -25
- data/lib/gir_ffi/builder/argument.rb +0 -2
- data/lib/gir_ffi/builder/argument/hash_table_base.rb +1 -1
- data/lib/gir_ffi/builder/argument/list_base.rb +1 -1
- data/lib/gir_ffi/builder/module.rb +1 -6
- data/lib/gir_ffi/builder/type/unintrospectable.rb +1 -1
- data/lib/gir_ffi/callback_helper.rb +14 -7
- data/lib/gir_ffi/in_out_pointer.rb +1 -1
- data/lib/gir_ffi/in_pointer.rb +1 -1
- data/lib/gir_ffi/module_base.rb +4 -0
- data/lib/gir_ffi/type_map.rb +29 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/tasks/test.rake +20 -1
- data/test/arg_helper_test.rb +10 -13
- data/test/builder_test.rb +2 -2
- data/test/class_base_test.rb +1 -1
- data/test/{glib_overrides_test.rb → ffi-glib/glib_overrides_test.rb} +3 -5
- data/test/{g_object_overrides_test.rb → ffi-gobject/g_object_overrides_test.rb} +7 -37
- data/test/ffi-gobject/gobject_test.rb +22 -0
- data/test/ffi-gobject/value_test.rb +34 -0
- data/test/{unit → ffi-gobject_introspection}/i_base_info_test.rb +2 -2
- data/test/{unit → ffi-gobject_introspection}/i_constant_info_test.rb +1 -1
- data/test/ffi-gobject_introspection/i_object_info_test.rb +20 -0
- data/test/{unit → ffi-gobject_introspection}/i_repository_test.rb +11 -11
- data/test/function_definition_builder_test.rb +1 -1
- data/test/gir_ffi_test_helper.rb +114 -0
- data/test/girffi_test.rb +2 -2
- data/test/gtk_overrides_test.rb +15 -12
- data/test/integration/generated_gimarshallingtests_test.rb +10 -5
- data/test/integration/generated_gio_test.rb +1 -1
- data/test/integration/generated_gobject_test.rb +1 -1
- data/test/integration/generated_gtk_test.rb +3 -3
- data/test/integration/generated_regress_test.rb +11 -3
- data/test/interface_type_builder_test.rb +1 -1
- data/test/module_builder_test.rb +1 -1
- data/test/test_helper.rb +2 -111
- data/test/type_builder_test.rb +2 -2
- data/test/unintrospectable_type_builder_test.rb +1 -1
- data/test/unit/builder_test.rb +1 -1
- data/test/unit/callback_helper_test.rb +13 -10
- data/test/unit/constant_builder_test.rb +1 -1
- data/test/unit/in_out_pointer_test.rb +1 -1
- data/test/unit/in_pointer_test.rb +1 -1
- data/test/unit/object_type_builder_test.rb +1 -1
- metadata +62 -43
- data/lib/gir_ffi/g_object.rb +0 -38
- data/lib/gir_ffi/overrides/glib.rb +0 -225
- data/lib/gir_ffi/overrides/gobject.rb +0 -330
- data/lib/gir_ffi/overrides/gtk.rb +0 -29
- data/test/g_object_test.rb +0 -21
- data/test/i_object_info_test.rb +0 -20
data/lib/gir_ffi/g_object.rb
DELETED
@@ -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
|