gir_ffi 0.6.6 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -0
- data/TODO.rdoc +23 -5
- data/lib/ffi-glib/array.rb +14 -15
- data/lib/ffi-glib/container_class_methods.rb +0 -1
- data/lib/ffi-glib/hash_table.rb +3 -4
- data/lib/ffi-glib/ptr_array.rb +12 -4
- data/lib/ffi-glib/sized_array.rb +27 -7
- data/lib/ffi-gobject.rb +14 -15
- data/lib/ffi-gobject/closure.rb +1 -1
- data/lib/ffi-gobject/object.rb +40 -15
- data/lib/ffi-gobject/ruby_closure.rb +0 -1
- data/lib/ffi-gobject/value.rb +45 -21
- data/lib/ffi-gobject_introspection/i_arg_info.rb +4 -0
- data/lib/ffi-gobject_introspection/i_base_info.rb +42 -2
- data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -0
- data/lib/ffi-gobject_introspection/i_enum_info.rb +1 -4
- data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -0
- data/lib/ffi-gobject_introspection/i_object_info.rb +2 -0
- data/lib/ffi-gobject_introspection/i_repository.rb +2 -3
- data/lib/ffi-gobject_introspection/i_struct_info.rb +3 -8
- data/lib/ffi-gobject_introspection/lib.rb +3 -0
- data/lib/gir_ffi-base.rb +3 -1
- data/lib/gir_ffi-base/gir_ffi/struct.rb +27 -0
- data/lib/gir_ffi-base/glib/boolean.rb +13 -1
- data/lib/gir_ffi-base/gobject.rb +7 -0
- data/lib/gir_ffi-base/gobject/lib.rb +0 -2
- data/lib/gir_ffi.rb +1 -3
- data/lib/gir_ffi/arg_helper.rb +4 -85
- data/lib/gir_ffi/builder.rb +5 -5
- data/lib/gir_ffi/builder_helper.rb +7 -0
- data/lib/gir_ffi/builders/argument_builder.rb +132 -0
- data/lib/gir_ffi/{base_argument_builder.rb → builders/base_argument_builder.rb} +32 -41
- data/lib/gir_ffi/builders/base_type_builder.rb +47 -0
- data/lib/gir_ffi/builders/callback_builder.rb +38 -0
- data/lib/gir_ffi/builders/constant_builder.rb +18 -0
- data/lib/gir_ffi/builders/enum_builder.rb +62 -0
- data/lib/gir_ffi/builders/error_argument_builder.rb +18 -0
- data/lib/gir_ffi/builders/field_builder.rb +94 -0
- data/lib/gir_ffi/builders/function_builder.rb +123 -0
- data/lib/gir_ffi/builders/interface_builder.rb +29 -0
- data/lib/gir_ffi/builders/mapping_method_builder.rb +88 -0
- data/lib/gir_ffi/builders/module_builder.rb +124 -0
- data/lib/gir_ffi/{null_argument_builder.rb → builders/null_argument_builder.rb} +0 -0
- data/lib/gir_ffi/builders/null_builder.rb +11 -0
- data/lib/gir_ffi/builders/object_builder.rb +123 -0
- data/lib/gir_ffi/{builder/property.rb → builders/property_builder.rb} +0 -0
- data/lib/gir_ffi/builders/registered_type_builder.rb +50 -0
- data/lib/gir_ffi/builders/return_value_builder.rb +68 -0
- data/lib/gir_ffi/builders/signal_builder.rb +91 -0
- data/lib/gir_ffi/builders/struct_builder.rb +35 -0
- data/lib/gir_ffi/builders/type_builder.rb +40 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +35 -0
- data/lib/gir_ffi/builders/union_builder.rb +34 -0
- data/lib/gir_ffi/builders/user_defined_builder.rb +103 -0
- data/lib/gir_ffi/builders/with_layout.rb +55 -0
- data/lib/gir_ffi/builders/with_methods.rb +44 -0
- data/lib/gir_ffi/callback_base.rb +31 -0
- data/lib/gir_ffi/class_base.rb +16 -10
- data/lib/gir_ffi/enum_base.rb +8 -4
- data/lib/gir_ffi/ffi_ext/pointer.rb +19 -2
- data/lib/gir_ffi/in_out_pointer.rb +38 -39
- data/lib/gir_ffi/in_pointer.rb +33 -18
- data/lib/gir_ffi/info_ext.rb +0 -4
- data/lib/gir_ffi/info_ext/i_arg_info.rb +0 -18
- data/lib/gir_ffi/info_ext/i_callable_info.rb +2 -1
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +6 -8
- data/lib/gir_ffi/info_ext/i_signal_info.rb +6 -21
- data/lib/gir_ffi/info_ext/i_type_info.rb +54 -29
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +8 -1
- data/lib/gir_ffi/interface_base.rb +1 -1
- data/lib/gir_ffi/module_base.rb +5 -1
- data/lib/gir_ffi/object_base.rb +5 -1
- data/lib/gir_ffi/setter_argument_info.rb +4 -0
- data/lib/gir_ffi/signal_base.rb +21 -0
- data/lib/gir_ffi/struct_base.rb +24 -0
- data/lib/gir_ffi/type_base.rb +11 -0
- data/lib/gir_ffi/type_map.rb +4 -2
- data/lib/gir_ffi/union_base.rb +24 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/tasks/test.rake +73 -7
- data/test/base_test_helper.rb +3 -19
- data/test/ffi-glib/array_test.rb +6 -0
- data/test/ffi-glib/ptr_array_test.rb +13 -0
- data/test/ffi-glib/ruby_closure_test.rb +7 -7
- data/test/ffi-glib/sized_array_test.rb +2 -2
- data/test/ffi-gobject/gobject_test.rb +3 -12
- data/test/ffi-gobject/object_test.rb +33 -2
- data/test/ffi-gobject/value_test.rb +114 -1
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +2 -2
- data/test/ffi-gobject_introspection/i_object_info_test.rb +3 -3
- data/test/ffi-gobject_introspection/i_repository_test.rb +26 -21
- data/test/ffi-gobject_test.rb +14 -14
- data/test/gir_ffi-base/glib/boolean_test.rb +6 -0
- data/test/gir_ffi/arg_helper_test.rb +2 -122
- data/test/gir_ffi/builder_test.rb +67 -204
- data/test/gir_ffi/{argument_builder_test.rb → builders/argument_builder_test.rb} +230 -108
- data/test/gir_ffi/builders/base_argument_builder_test.rb +5 -0
- data/test/gir_ffi/builders/callback_builder_test.rb +50 -0
- data/test/gir_ffi/builders/constant_builder_test.rb +4 -0
- data/test/gir_ffi/{builder/type/enum_test.rb → builders/enum_builder_test.rb} +2 -3
- data/test/gir_ffi/builders/field_builder_test.rb +94 -0
- data/test/gir_ffi/{function_builder_test.rb → builders/function_builder_test.rb} +43 -24
- data/test/gir_ffi/{builder/type/interface_test.rb → builders/interface_builder_test.rb} +2 -2
- data/test/gir_ffi/{builder/module_test.rb → builders/module_builder_test.rb} +12 -13
- data/test/gir_ffi/{builder/type/object_test.rb → builders/object_builder_test.rb} +9 -9
- data/test/gir_ffi/{return_value_builder_test.rb → builders/return_value_builder_test.rb} +94 -58
- data/test/gir_ffi/builders/signal_builder_test.rb +62 -0
- data/test/gir_ffi/{builder/type/struct_test.rb → builders/struct_builder_test.rb} +36 -19
- data/test/gir_ffi/{builder/type/unintrospectable_test.rb → builders/unintrospectable_builder_test.rb} +3 -3
- data/test/gir_ffi/builders/union_builder_test.rb +29 -0
- data/test/gir_ffi/{builder/type/user_defined_test.rb → builders/user_defined_builder_test.rb} +2 -2
- data/test/gir_ffi/callback_base_test.rb +11 -0
- data/test/gir_ffi/class_base_test.rb +22 -22
- data/test/gir_ffi/ffi_ext/pointer_test.rb +18 -0
- data/test/gir_ffi/in_out_pointer_test.rb +0 -7
- data/test/gir_ffi/in_pointer_test.rb +27 -3
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +16 -44
- data/test/gir_ffi/info_ext/i_type_info_test.rb +315 -74
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +6 -0
- data/test/gir_ffi/interface_base_test.rb +3 -5
- data/test/gir_ffi/object_base_test.rb +10 -6
- data/test/gir_ffi/type_map_test.rb +2 -2
- data/test/gir_ffi/unintrospectable_type_info_test.rb +2 -2
- data/test/gir_ffi_test_helper.rb +12 -4
- data/test/integration/generated_gimarshallingtests_test.rb +436 -76
- data/test/integration/generated_gio_test.rb +5 -11
- data/test/integration/generated_gobject_test.rb +8 -0
- data/test/integration/generated_regress_test.rb +755 -309
- data/test/integration/generated_secret_test.rb +2 -1
- metadata +73 -72
- data/lib/ffi-gobject/ruby_style.rb +0 -23
- data/lib/gir_ffi/argument_builder.rb +0 -154
- data/lib/gir_ffi/builder/field.rb +0 -60
- data/lib/gir_ffi/builder/module.rb +0 -127
- data/lib/gir_ffi/builder/type.rb +0 -39
- data/lib/gir_ffi/builder/type/base.rb +0 -48
- data/lib/gir_ffi/builder/type/callback.rb +0 -30
- data/lib/gir_ffi/builder/type/constant.rb +0 -22
- data/lib/gir_ffi/builder/type/enum.rb +0 -66
- data/lib/gir_ffi/builder/type/interface.rb +0 -33
- data/lib/gir_ffi/builder/type/object.rb +0 -134
- data/lib/gir_ffi/builder/type/registered_type.rb +0 -62
- data/lib/gir_ffi/builder/type/struct.rb +0 -34
- data/lib/gir_ffi/builder/type/unintrospectable.rb +0 -39
- data/lib/gir_ffi/builder/type/union.rb +0 -34
- data/lib/gir_ffi/builder/type/user_defined.rb +0 -107
- data/lib/gir_ffi/builder/type/with_layout.rb +0 -62
- data/lib/gir_ffi/builder/type/with_methods.rb +0 -64
- data/lib/gir_ffi/callback.rb +0 -72
- data/lib/gir_ffi/callback_helper.rb +0 -11
- data/lib/gir_ffi/error_argument_builder.rb +0 -17
- data/lib/gir_ffi/function_builder.rb +0 -112
- data/lib/gir_ffi/info_ext/i_enum_info.rb +0 -11
- data/lib/gir_ffi/info_ext/i_object_info.rb +0 -11
- data/lib/gir_ffi/info_ext/i_struct_info.rb +0 -11
- data/lib/gir_ffi/info_ext/i_union_info.rb +0 -12
- data/lib/gir_ffi/return_value_builder.rb +0 -81
- data/test/ffi-gobject/ruby_style_test.rb +0 -38
- data/test/gir_ffi/base_argument_builder_test.rb +0 -13
- data/test/gir_ffi/builder/type/callback_test.rb +0 -6
- data/test/gir_ffi/builder/type/constant_test.rb +0 -4
- data/test/gir_ffi/builder/type/union_test.rb +0 -12
- data/test/gir_ffi/callback_helper_test.rb +0 -10
- data/test/gir_ffi/callback_test.rb +0 -49
- data/test/gir_ffi/info_ext/i_arg_info_test.rb +0 -39
- data/test/gir_ffi/info_ext/i_object_info_test.rb +0 -14
data/History.txt
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
== 0.6.7 / 2013-09-28
|
2
|
+
|
3
|
+
* Uniform handling of callback, signal and method arguments
|
4
|
+
* Automatically convert array elements to GValue
|
5
|
+
* Support inline array fields
|
6
|
+
* Support struct fields
|
7
|
+
* Improved field setters and getters
|
8
|
+
* Support many more types of properties
|
9
|
+
* Support skipped arguments and return values
|
10
|
+
* Fix refcount for the result of IBaseInfo#container
|
11
|
+
* Check bounds in GLib::PtrArray#index and GLib::Array#index
|
12
|
+
* Deprecate several methods
|
13
|
+
* Lots of refactoring
|
14
|
+
|
1
15
|
== 0.6.6 / 2013-08-05
|
2
16
|
|
3
17
|
* Handle GArrays of booleans and structs
|
data/TODO.rdoc
CHANGED
@@ -8,17 +8,35 @@ reference count of any objects it gets from GObject. This task therefore involve
|
|
8
8
|
- Free non-GObject pointers as needed (at garbage-collection time)
|
9
9
|
- Lower reference count of GObjects (at garbage-collection time)
|
10
10
|
|
11
|
+
== Refactorings
|
12
|
+
|
13
|
+
These in the order they occured to me, and may therefore be fixed in any order.
|
14
|
+
|
15
|
+
- Create Type objects for all FFI types, including the ones currently
|
16
|
+
represented by a single symbol, so we can always do stuff like
|
17
|
+
|
18
|
+
GirFFI::Types::UInt8.get_value_from_pointer(ptr)
|
19
|
+
|
20
|
+
rather than having awkward dynamic method dispatch inside GirFFI::InOutPointer.
|
21
|
+
|
22
|
+
- Move code in GirFFI::Struct to StructBase, then somehow unify UnionBase and
|
23
|
+
StructBase.
|
24
|
+
|
25
|
+
- Move to a single Pointer class, rather than InPointer, InOutPointer and
|
26
|
+
Pointer monkeypatching.
|
27
|
+
|
28
|
+
- Move special types like SizedArray to sane namespaces. Types (like
|
29
|
+
GLib::List) that have actual GLib implementations go to the GLib namespace.
|
30
|
+
Other types go to the GirFFI namespace.
|
31
|
+
|
32
|
+
- Use argumentbuilders to build signal argument marshalling functions.
|
33
|
+
|
11
34
|
== Persistent Ruby GObject identity
|
12
35
|
|
13
36
|
GirFFI should make sure that if it gets a pointer to a GObject for which a Ruby
|
14
37
|
object already exists, the existing object is returned. This involves the use
|
15
38
|
of WeakRef, no doubt.
|
16
39
|
|
17
|
-
== Remove code for passing generic pointers
|
18
|
-
|
19
|
-
Generic pointers have been declared 'not introspectable', so
|
20
|
-
handling them can be removed.
|
21
|
-
|
22
40
|
== Handle fundamental objects that are not GObject.
|
23
41
|
|
24
42
|
This is a big one. See commit 1e9822c7817062a9b853269b9418fd78782090b5 in
|
data/lib/ffi-glib/array.rb
CHANGED
@@ -22,27 +22,21 @@ module GLib
|
|
22
22
|
|
23
23
|
def append_vals ary
|
24
24
|
bytes = GirFFI::InPointer.from_array element_type, ary
|
25
|
-
|
26
|
-
Lib.g_array_append_vals(self, bytes, len)
|
25
|
+
Lib.g_array_append_vals(self, bytes, ary.length)
|
27
26
|
self
|
28
27
|
end
|
29
28
|
|
30
29
|
# Re-implementation of the g_array_index macro
|
31
30
|
def index idx
|
32
|
-
|
33
|
-
|
34
|
-
case element_type
|
35
|
-
when :utf8
|
36
|
-
GirFFI::ArgHelper.ptr_to_utf8 ptr.to_value
|
37
|
-
when Symbol
|
38
|
-
ptr.to_value
|
39
|
-
else
|
40
|
-
element_type.wrap ptr.to_value
|
31
|
+
if idx >= length or idx < 0
|
32
|
+
raise IndexError, "Index #{idx} outside of bounds 0..#{length - 1}"
|
41
33
|
end
|
34
|
+
ptr = GirFFI::InOutPointer.new element_type, data_ptr + idx * get_element_size
|
35
|
+
ptr.to_ruby_value
|
42
36
|
end
|
43
37
|
|
44
38
|
def each
|
45
|
-
length.times
|
39
|
+
length.times do |idx|
|
46
40
|
yield index(idx)
|
47
41
|
end
|
48
42
|
end
|
@@ -51,10 +45,16 @@ module GLib
|
|
51
45
|
@struct[:len]
|
52
46
|
end
|
53
47
|
|
54
|
-
def
|
48
|
+
def data_ptr
|
55
49
|
@struct[:data]
|
56
50
|
end
|
57
51
|
|
52
|
+
undef :data
|
53
|
+
|
54
|
+
# @deprecated From 0.7.0, data will return the actual data as a string,
|
55
|
+
# as generated by GirFFI.
|
56
|
+
alias data data_ptr
|
57
|
+
|
58
58
|
def get_element_size
|
59
59
|
Lib.g_array_get_element_size self
|
60
60
|
end
|
@@ -81,8 +81,7 @@ module GLib
|
|
81
81
|
|
82
82
|
def self.calculated_element_size type
|
83
83
|
ffi_type = GirFFI::TypeMap.type_specification_to_ffitype(type)
|
84
|
-
|
85
|
-
FFI.type_size(ffi_type) rescue ffi_type.size
|
84
|
+
FFI.type_size(ffi_type)
|
86
85
|
end
|
87
86
|
|
88
87
|
def calculated_element_size
|
data/lib/ffi-glib/hash_table.rb
CHANGED
@@ -8,9 +8,8 @@ module GLib
|
|
8
8
|
include Enumerable
|
9
9
|
extend ContainerClassMethods
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
attr_accessor :value_type
|
11
|
+
attr_reader :key_type
|
12
|
+
attr_reader :value_type
|
14
13
|
|
15
14
|
def each
|
16
15
|
prc = Proc.new {|keyptr, valptr, userdata|
|
@@ -41,7 +40,7 @@ module GLib
|
|
41
40
|
end
|
42
41
|
|
43
42
|
def reset_typespec typespec
|
44
|
-
|
43
|
+
@key_type, @value_type = *typespec
|
45
44
|
self
|
46
45
|
end
|
47
46
|
|
data/lib/ffi-glib/ptr_array.rb
CHANGED
@@ -8,6 +8,8 @@ module GLib
|
|
8
8
|
|
9
9
|
attr_accessor :element_type
|
10
10
|
|
11
|
+
POINTER_SIZE = FFI.type_size(:pointer)
|
12
|
+
|
11
13
|
class << self
|
12
14
|
remove_method :new
|
13
15
|
# Remove stub generated by builder.
|
@@ -46,17 +48,23 @@ module GLib
|
|
46
48
|
|
47
49
|
# Re-implementation of the g_ptr_array_index macro
|
48
50
|
def index idx
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
if idx >= length or idx < 0
|
52
|
+
raise IndexError, "Index #{idx} outside of bounds 0..#{length - 1}"
|
53
|
+
end
|
54
|
+
ptr = GirFFI::InOutPointer.new element_type, @struct[:pdata] + idx * POINTER_SIZE
|
55
|
+
ptr.to_ruby_value
|
52
56
|
end
|
53
57
|
|
54
58
|
def each
|
55
|
-
|
59
|
+
length.times do |idx|
|
56
60
|
yield index(idx)
|
57
61
|
end
|
58
62
|
end
|
59
63
|
|
64
|
+
def length
|
65
|
+
@struct[:len]
|
66
|
+
end
|
67
|
+
|
60
68
|
def ==(other)
|
61
69
|
self.to_a == other.to_a
|
62
70
|
end
|
data/lib/ffi-glib/sized_array.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# FIXME: SizedArray does not really belong in GLib, does it?
|
1
2
|
module GLib
|
2
3
|
# Class representing an array with a determined size
|
3
4
|
class SizedArray
|
@@ -14,14 +15,14 @@ module GLib
|
|
14
15
|
@pointer
|
15
16
|
end
|
16
17
|
|
18
|
+
def index idx
|
19
|
+
ptr = GirFFI::InOutPointer.new element_type, @pointer + idx * element_size
|
20
|
+
ptr.to_ruby_value
|
21
|
+
end
|
22
|
+
|
17
23
|
def each &block
|
18
|
-
|
19
|
-
|
20
|
-
arr = GirFFI::ArgHelper.ptr_to_typed_array(@element_type, @pointer, @size)
|
21
|
-
if block_given?
|
22
|
-
arr.each(&block)
|
23
|
-
else
|
24
|
-
arr.each
|
24
|
+
size.times do |idx|
|
25
|
+
yield index(idx)
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -29,6 +30,25 @@ module GLib
|
|
29
30
|
self.to_a == other.to_a
|
30
31
|
end
|
31
32
|
|
33
|
+
def size_in_bytes
|
34
|
+
size * element_size
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.copy_value_to_pointer value, pointer
|
38
|
+
size = value.size_in_bytes
|
39
|
+
pointer.put_bytes(0, value.to_ptr.read_bytes(size), 0, size)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def element_ffi_type
|
45
|
+
@element_ffi_type ||= GirFFI::TypeMap.type_specification_to_ffitype element_type
|
46
|
+
end
|
47
|
+
|
48
|
+
def element_size
|
49
|
+
@element_size ||= FFI.type_size element_ffi_type
|
50
|
+
end
|
51
|
+
|
32
52
|
def self.wrap element_type, size, pointer
|
33
53
|
new element_type, size, pointer unless pointer.null?
|
34
54
|
end
|
data/lib/ffi-gobject.rb
CHANGED
@@ -10,13 +10,9 @@ require 'ffi-gobject/initially_unowned'
|
|
10
10
|
require 'ffi-gobject/closure'
|
11
11
|
require 'ffi-gobject/object'
|
12
12
|
require 'ffi-gobject/ruby_closure'
|
13
|
-
require 'gir_ffi/
|
13
|
+
require 'gir_ffi/builders/user_defined_builder'
|
14
14
|
|
15
15
|
module GObject
|
16
|
-
def self.type_init
|
17
|
-
Lib::g_type_init
|
18
|
-
end
|
19
|
-
|
20
16
|
def self.object_ref obj
|
21
17
|
Lib::g_object_ref obj.to_ptr
|
22
18
|
end
|
@@ -76,9 +72,9 @@ module GObject
|
|
76
72
|
signal, _ = detailed_signal.split('::')
|
77
73
|
sig_info = object.class.find_signal signal
|
78
74
|
callback = sig_info.signal_callback(&block)
|
79
|
-
GirFFI::
|
75
|
+
GirFFI::CallbackBase.store_callback callback
|
80
76
|
|
81
|
-
data_ptr = GirFFI::
|
77
|
+
data_ptr = GirFFI::InPointer.from_object data
|
82
78
|
|
83
79
|
Lib.g_signal_connect_data object, detailed_signal, callback, data_ptr, nil, 0
|
84
80
|
end
|
@@ -105,12 +101,13 @@ module GObject
|
|
105
101
|
attach_function :g_object_unref, [:pointer], :void
|
106
102
|
attach_function :g_object_is_floating, [:pointer], :bool
|
107
103
|
|
108
|
-
attach_function :
|
104
|
+
attach_function :g_array_get_type, [], :size_t
|
109
105
|
attach_function :g_hash_table_get_type, [], :size_t
|
106
|
+
attach_function :g_strv_get_type, [], :size_t
|
110
107
|
|
111
108
|
attach_function :g_signal_connect_data,
|
112
109
|
[:pointer, :string, Callback, :pointer, ClosureNotify, ConnectFlags],
|
113
|
-
|
110
|
+
:ulong
|
114
111
|
attach_function :g_closure_set_marshal,
|
115
112
|
[:pointer, ClosureMarshal], :void
|
116
113
|
|
@@ -119,17 +116,19 @@ module GObject
|
|
119
116
|
:pointer
|
120
117
|
end
|
121
118
|
|
122
|
-
|
119
|
+
TYPE_ARRAY = Lib.g_array_get_type
|
123
120
|
TYPE_HASH_TABLE = Lib.g_hash_table_get_type
|
121
|
+
TYPE_STRV = Lib.g_strv_get_type
|
124
122
|
|
125
123
|
TYPE_TAG_TO_GTYPE = {
|
126
|
-
:
|
124
|
+
:array => TYPE_ARRAY,
|
127
125
|
:gboolean => TYPE_BOOLEAN,
|
128
|
-
:gint32 => TYPE_INT,
|
129
|
-
:gfloat => TYPE_FLOAT,
|
130
126
|
:gdouble => TYPE_DOUBLE,
|
131
|
-
:
|
127
|
+
:gfloat => TYPE_FLOAT,
|
132
128
|
:ghash => TYPE_HASH_TABLE,
|
133
|
-
:
|
129
|
+
:gint32 => TYPE_INT,
|
130
|
+
:glist => TYPE_POINTER,
|
131
|
+
:utf8 => TYPE_STRING,
|
132
|
+
:void => TYPE_NONE
|
134
133
|
}
|
135
134
|
end
|
data/lib/ffi-gobject/closure.rb
CHANGED
@@ -4,7 +4,7 @@ module GObject
|
|
4
4
|
# Overrides for GClosure, GObject's base class for closure objects.
|
5
5
|
class Closure
|
6
6
|
def set_marshal marshal
|
7
|
-
callback =
|
7
|
+
callback = GObject::ClosureMarshal.from marshal
|
8
8
|
Lib.g_closure_set_marshal self, callback
|
9
9
|
end
|
10
10
|
end
|
data/lib/ffi-gobject/object.rb
CHANGED
@@ -1,35 +1,57 @@
|
|
1
|
-
require 'ffi-gobject/ruby_style'
|
2
|
-
|
3
1
|
module GObject
|
4
2
|
load_class :Object
|
5
3
|
|
6
4
|
# Overrides for GObject, GObject's generic base class.
|
7
5
|
class Object
|
8
6
|
|
9
|
-
include RubyStyle
|
10
|
-
|
11
7
|
setup_method "new"
|
8
|
+
|
9
|
+
# TODO: Generate accessor methods from GIR at class definition time
|
10
|
+
def method_missing(method, *args)
|
11
|
+
if respond_to?("get_#{method}")
|
12
|
+
return send("get_#{method}", *args)
|
13
|
+
end
|
14
|
+
if method.to_s =~ /(.*)=$/ && respond_to?("set_#{$1}")
|
15
|
+
return send("set_#{$1}", *args)
|
16
|
+
end
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def signal_connect(event, &block)
|
21
|
+
GObject.signal_connect(self, event, &block)
|
22
|
+
end
|
23
|
+
|
12
24
|
setup_instance_method "get_property"
|
13
25
|
setup_instance_method "set_property"
|
14
26
|
|
15
27
|
def get_property_with_override property_name
|
16
|
-
|
17
|
-
|
28
|
+
type_info = get_property_type property_name
|
29
|
+
pspec = type_class.find_property property_name
|
18
30
|
|
31
|
+
gvalue = GObject::Value.for_g_type pspec.value_type
|
19
32
|
get_property_without_override property_name, gvalue
|
20
33
|
|
21
|
-
|
34
|
+
case type_info.tag
|
35
|
+
when :ghash, :glist
|
36
|
+
adjust_value_to_type gvalue.get_value_plain, type_info
|
37
|
+
else
|
38
|
+
gvalue.get_value
|
39
|
+
end
|
22
40
|
end
|
23
41
|
|
24
42
|
def set_property_with_override property_name, value
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
gvalue.set_value adjust_value_to_type(value, type)
|
43
|
+
type_info = get_property_type property_name
|
44
|
+
pspec = type_class.find_property property_name
|
29
45
|
|
46
|
+
gvalue = GObject::Value.for_g_type pspec.value_type
|
47
|
+
gvalue.set_value adjust_value_to_type(value, type_info)
|
30
48
|
set_property_without_override property_name, gvalue
|
31
49
|
end
|
32
50
|
|
51
|
+
def type_class
|
52
|
+
GObject::ObjectClass.wrap(self.to_ptr.get_pointer 0)
|
53
|
+
end
|
54
|
+
|
33
55
|
alias get_property_without_override get_property
|
34
56
|
alias get_property get_property_with_override
|
35
57
|
|
@@ -43,12 +65,15 @@ module GObject
|
|
43
65
|
prop.property_type
|
44
66
|
end
|
45
67
|
|
46
|
-
|
47
|
-
|
68
|
+
# TODO: Move to ITypeInfo
|
69
|
+
def adjust_value_to_type val, type_info
|
70
|
+
case type_info.flattened_tag
|
48
71
|
when :ghash
|
49
|
-
GLib::HashTable.from
|
72
|
+
GLib::HashTable.from type_info.element_type, val
|
50
73
|
when :glist
|
51
|
-
GLib::List.from
|
74
|
+
GLib::List.from type_info.element_type, val
|
75
|
+
when :strv
|
76
|
+
GLib::Strv.from val
|
52
77
|
else
|
53
78
|
val
|
54
79
|
end
|
data/lib/ffi-gobject/value.rb
CHANGED
@@ -14,16 +14,24 @@ module GObject
|
|
14
14
|
|
15
15
|
TYPE_TO_SET_METHOD_MAP = {
|
16
16
|
TYPE_BOOLEAN => :set_boolean,
|
17
|
-
|
18
|
-
|
19
|
-
TYPE_STRING => :set_string,
|
20
|
-
TYPE_FLOAT => :set_float,
|
17
|
+
TYPE_BOXED => :set_boxed,
|
18
|
+
TYPE_CHAR => :set_char,
|
21
19
|
TYPE_DOUBLE => :set_double,
|
22
|
-
|
20
|
+
TYPE_ENUM => :set_enum,
|
21
|
+
TYPE_FLOAT => :set_float,
|
22
|
+
TYPE_GTYPE => :set_gtype,
|
23
|
+
TYPE_INT64 => :set_int64,
|
24
|
+
TYPE_INT => :set_int,
|
25
|
+
TYPE_LONG => :set_long,
|
23
26
|
TYPE_OBJECT => :set_instance_enhanced,
|
24
|
-
|
27
|
+
TYPE_PARAM => :set_param,
|
25
28
|
TYPE_POINTER => :set_pointer,
|
26
|
-
|
29
|
+
TYPE_STRING => :set_string,
|
30
|
+
TYPE_UCHAR => :set_uchar,
|
31
|
+
TYPE_UINT => :set_uint,
|
32
|
+
TYPE_UINT64 => :set_uint64,
|
33
|
+
TYPE_ULONG => :set_ulong,
|
34
|
+
TYPE_VARIANT => :set_variant,
|
27
35
|
}
|
28
36
|
|
29
37
|
def value= val
|
@@ -66,17 +74,34 @@ module GObject
|
|
66
74
|
|
67
75
|
TYPE_TO_GET_METHOD_MAP = {
|
68
76
|
TYPE_BOOLEAN => :get_boolean,
|
69
|
-
|
70
|
-
|
71
|
-
TYPE_STRING => :get_string,
|
72
|
-
TYPE_FLOAT => :get_float,
|
77
|
+
TYPE_BOXED => :get_boxed,
|
78
|
+
TYPE_CHAR => :get_char,
|
73
79
|
TYPE_DOUBLE => :get_double,
|
80
|
+
TYPE_FLOAT => :get_float,
|
81
|
+
TYPE_GTYPE => :get_gtype,
|
82
|
+
TYPE_INT64 => :get_int64,
|
83
|
+
TYPE_INT => :get_int,
|
84
|
+
TYPE_LONG => :get_long,
|
74
85
|
TYPE_OBJECT => :get_object,
|
75
|
-
|
76
|
-
|
86
|
+
TYPE_POINTER => :get_pointer,
|
87
|
+
TYPE_STRING => :get_string,
|
88
|
+
TYPE_UCHAR => :get_uchar,
|
89
|
+
TYPE_UINT => :get_uint,
|
90
|
+
TYPE_UINT64 => :get_uint64,
|
91
|
+
TYPE_ULONG => :get_ulong,
|
92
|
+
TYPE_VARIANT => :get_variant,
|
77
93
|
}
|
78
94
|
|
79
95
|
def get_value
|
96
|
+
value = get_value_plain
|
97
|
+
if current_fundamental_type == TYPE_BOXED
|
98
|
+
wrap_boxed value
|
99
|
+
else
|
100
|
+
value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def get_value_plain
|
80
105
|
send get_method
|
81
106
|
end
|
82
107
|
|
@@ -129,27 +154,26 @@ module GObject
|
|
129
154
|
end
|
130
155
|
end
|
131
156
|
|
132
|
-
def
|
133
|
-
|
134
|
-
gtype = current_gtype
|
135
|
-
|
136
|
-
case gtype
|
157
|
+
def wrap_boxed boxed
|
158
|
+
case current_gtype
|
137
159
|
when TYPE_STRV
|
138
160
|
GLib::Strv.wrap boxed
|
139
161
|
when TYPE_HASH_TABLE
|
140
162
|
GLib::HashTable.wrap [:gpointer, :gpointer], boxed
|
141
163
|
else
|
142
|
-
|
164
|
+
boxed.wrap_by_gtype current_gtype
|
143
165
|
end
|
144
166
|
end
|
145
167
|
|
146
168
|
def get_method
|
147
|
-
TYPE_TO_GET_METHOD_MAP[
|
169
|
+
TYPE_TO_GET_METHOD_MAP[current_gtype] or
|
170
|
+
TYPE_TO_GET_METHOD_MAP[current_fundamental_type] or
|
148
171
|
raise "Can't find method to get #{current_gtype_name}"
|
149
172
|
end
|
150
173
|
|
151
174
|
def set_method
|
152
|
-
TYPE_TO_SET_METHOD_MAP[
|
175
|
+
TYPE_TO_SET_METHOD_MAP[current_gtype] or
|
176
|
+
TYPE_TO_SET_METHOD_MAP[current_fundamental_type] or
|
153
177
|
raise "Can't find method to set #{current_gtype_name}"
|
154
178
|
end
|
155
179
|
end
|