gir_ffi 0.0.14 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|