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
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module GObjectIntrospection
|
2
2
|
# Wraps a GITypeInfo struct.
|
3
3
|
# Represents type information, direction, transfer etc.
|
4
4
|
class ITypeInfo < IBaseInfo
|
@@ -33,7 +33,7 @@ module GirFFI
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def name
|
36
|
-
raise "Should not call this for
|
36
|
+
raise "Should not call this for ITypeInfo"
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
data/lib/ffi-gtk/base.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Gtk
|
2
|
+
_setup_method "init"
|
3
|
+
|
4
|
+
def self.init_with_auto_argv
|
5
|
+
my_args = init_without_auto_argv [$0, *ARGV]
|
6
|
+
my_args.shift
|
7
|
+
ARGV.replace my_args
|
8
|
+
end
|
9
|
+
class << self
|
10
|
+
alias init_without_auto_argv init
|
11
|
+
alias init init_with_auto_argv
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Gtk.class_eval do
|
16
|
+
end
|
17
|
+
|
data/lib/ffi-gtk2.rb
ADDED
data/lib/ffi-gtk3.rb
ADDED
data/lib/gir_ffi.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
require 'gir_ffi/class_base'
|
4
|
+
require 'gir_ffi/type_map'
|
5
|
+
|
6
|
+
require 'ffi-gobject_introspection'
|
7
|
+
|
8
|
+
require 'gir_ffi/arg_helper'
|
3
9
|
require 'gir_ffi/builder'
|
4
10
|
|
5
11
|
module GirFFI
|
6
|
-
GObject.type_init
|
7
|
-
|
8
12
|
def self.setup module_name, version=nil
|
9
13
|
module_name = module_name.to_s
|
10
14
|
GirFFI::Builder.build_module module_name, version
|
11
15
|
end
|
12
16
|
end
|
17
|
+
|
18
|
+
require 'ffi-glib'
|
19
|
+
require 'ffi-gobject'
|
data/lib/gir_ffi/arg_helper.rb
CHANGED
@@ -53,14 +53,14 @@ module GirFFI
|
|
53
53
|
if type == :utf8
|
54
54
|
ptr_to_utf8_array ptr, size
|
55
55
|
else
|
56
|
-
ffi_type =
|
56
|
+
ffi_type = TypeMap.map_basic_type type
|
57
57
|
ptr.send "get_array_of_#{ffi_type}", 0, size
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def self.setup_ptr_to_type_array_handler_for *types
|
62
62
|
types.flatten.each do |type|
|
63
|
-
ffi_type =
|
63
|
+
ffi_type = TypeMap.map_basic_type type
|
64
64
|
defn =
|
65
65
|
"def self.ptr_to_#{type}_array ptr, size
|
66
66
|
ptr.get_array_of_#{ffi_type}(0, size)
|
@@ -74,7 +74,7 @@ module GirFFI
|
|
74
74
|
def self.ptr_to_utf8_array ptr, size
|
75
75
|
ptrs = ptr.read_array_of_pointer(size)
|
76
76
|
|
77
|
-
ptrs.map { |
|
77
|
+
ptrs.map { |pt| ptr_to_utf8 pt }
|
78
78
|
end
|
79
79
|
|
80
80
|
def self.ptr_to_interface_array klass, ptr, size
|
@@ -160,7 +160,8 @@ module GirFFI
|
|
160
160
|
|
161
161
|
def self.check_error errpp
|
162
162
|
errp = errpp.read_pointer
|
163
|
-
|
163
|
+
# FIXME: Do not depend on GError from GObjectIntrospection namespace.
|
164
|
+
raise GObjectIntrospection::GError.new(errp)[:message] unless errp.null?
|
164
165
|
end
|
165
166
|
|
166
167
|
def self.check_fixed_array_size size, arr, name
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -10,34 +10,12 @@ module GirFFI
|
|
10
10
|
module Builder
|
11
11
|
extend BuilderHelper
|
12
12
|
|
13
|
-
sz = FFI.type_size(:size_t) * 8
|
14
|
-
gtype_type = "uint#{sz}".to_sym
|
15
|
-
|
16
|
-
TAG_TYPE_MAP = {
|
17
|
-
:GType => :size_t,
|
18
|
-
:gtype => gtype_type,
|
19
|
-
:gboolean => :bool,
|
20
|
-
:gunichar => :uint32,
|
21
|
-
:gint8 => :int8,
|
22
|
-
:guint8 => :uint8,
|
23
|
-
:gint16 => :int16,
|
24
|
-
:guint16 => :uint16,
|
25
|
-
:gint => :int,
|
26
|
-
:gint32 => :int32,
|
27
|
-
:guint32 => :uint32,
|
28
|
-
:gint64 => :int64,
|
29
|
-
:guint64 => :uint64,
|
30
|
-
:gfloat => :float,
|
31
|
-
:gdouble => :double,
|
32
|
-
:void => :void
|
33
|
-
}
|
34
|
-
|
35
13
|
def self.build_class info
|
36
14
|
Builder::Type.build(info)
|
37
15
|
end
|
38
16
|
|
39
17
|
def self.build_by_gtype gtype
|
40
|
-
info = IRepository.default.find_by_gtype gtype
|
18
|
+
info = GObjectIntrospection::IRepository.default.find_by_gtype gtype
|
41
19
|
if info.nil?
|
42
20
|
Builder::Type::Unintrospectable.new(gtype).build_class
|
43
21
|
else
|
@@ -100,7 +78,7 @@ module GirFFI
|
|
100
78
|
:pointer
|
101
79
|
end
|
102
80
|
else
|
103
|
-
return
|
81
|
+
return TypeMap.map_basic_type tag
|
104
82
|
end
|
105
83
|
end
|
106
84
|
|
@@ -111,7 +89,7 @@ module GirFFI
|
|
111
89
|
if tag == :interface
|
112
90
|
return build_class info.interface
|
113
91
|
else
|
114
|
-
return
|
92
|
+
return TypeMap.map_basic_type tag
|
115
93
|
end
|
116
94
|
end
|
117
95
|
|
@@ -74,11 +74,6 @@ module GirFFI
|
|
74
74
|
def setup_module
|
75
75
|
@module.extend ModuleBase
|
76
76
|
@module.const_set :GIR_FFI_BUILDER, self
|
77
|
-
begin
|
78
|
-
require "gir_ffi/overrides/#{@namespace.downcase}"
|
79
|
-
@module.class_eval "include GirFFI::Overrides::#{@namespace}"
|
80
|
-
rescue LoadError
|
81
|
-
end
|
82
77
|
end
|
83
78
|
|
84
79
|
def already_set_up
|
@@ -112,7 +107,7 @@ module GirFFI
|
|
112
107
|
|
113
108
|
def gir
|
114
109
|
unless defined? @gir
|
115
|
-
@gir = IRepository.default
|
110
|
+
@gir = GObjectIntrospection::IRepository.default
|
116
111
|
@gir.require @namespace, @version
|
117
112
|
end
|
118
113
|
@gir
|
@@ -3,7 +3,7 @@ module GirFFI
|
|
3
3
|
def self.wrap_in_callback_args_mapper namespace, name, prc
|
4
4
|
return prc if FFI::Function === prc
|
5
5
|
return nil if prc.nil?
|
6
|
-
info = IRepository.default.find_by_name namespace, name
|
6
|
+
info = GObjectIntrospection::IRepository.default.find_by_name namespace, name
|
7
7
|
return Proc.new do |*args|
|
8
8
|
prc.call(*map_callback_args(args, info))
|
9
9
|
end
|
@@ -11,25 +11,32 @@ module GirFFI
|
|
11
11
|
|
12
12
|
def self.map_callback_args args, info
|
13
13
|
args.zip(info.args).map { |arg, inf|
|
14
|
-
map_single_callback_arg arg, inf }
|
14
|
+
map_single_callback_arg arg, inf.argument_type }
|
15
15
|
end
|
16
16
|
|
17
17
|
# TODO: Use GirFFI::ReturnValue classes for mapping.
|
18
|
-
def self.map_single_callback_arg arg,
|
19
|
-
case
|
18
|
+
def self.map_single_callback_arg arg, type
|
19
|
+
case type.tag
|
20
20
|
when :interface
|
21
|
-
map_interface_callback_arg arg,
|
21
|
+
map_interface_callback_arg arg, type
|
22
22
|
when :utf8
|
23
23
|
ArgHelper.ptr_to_utf8 arg
|
24
24
|
when :void
|
25
25
|
map_void_callback_arg arg
|
26
|
+
when :array
|
27
|
+
subtype = type.param_type(0)
|
28
|
+
if subtype.tag == :interface and arg.is_a?(FFI::Pointer)
|
29
|
+
map_interface_callback_arg arg, subtype
|
30
|
+
else
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
26
33
|
else
|
27
34
|
arg
|
28
35
|
end
|
29
36
|
end
|
30
37
|
|
31
|
-
def self.map_interface_callback_arg arg,
|
32
|
-
iface =
|
38
|
+
def self.map_interface_callback_arg arg, type
|
39
|
+
iface = type.interface
|
33
40
|
case iface.info_type
|
34
41
|
when :object
|
35
42
|
ArgHelper.object_pointer_to_object arg
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -8,7 +8,7 @@ module GirFFI
|
|
8
8
|
return from_utf8_array ary if type == :utf8
|
9
9
|
return from_interface_pointer_array ary if type == :interface_pointer
|
10
10
|
|
11
|
-
ffi_type =
|
11
|
+
ffi_type = TypeMap.map_basic_type type
|
12
12
|
block = ArgHelper.allocate_array_of_type ffi_type, ary.length
|
13
13
|
block.send "put_array_of_#{ffi_type}", 0, ary
|
14
14
|
|
data/lib/gir_ffi/module_base.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
module GirFFI
|
2
|
+
module TypeMap
|
3
|
+
sz = FFI.type_size(:size_t) * 8
|
4
|
+
gtype_type = "uint#{sz}".to_sym
|
5
|
+
|
6
|
+
TAG_TYPE_MAP = {
|
7
|
+
:GType => :size_t,
|
8
|
+
:gtype => gtype_type,
|
9
|
+
:gboolean => :bool,
|
10
|
+
:gunichar => :uint32,
|
11
|
+
:gint8 => :int8,
|
12
|
+
:guint8 => :uint8,
|
13
|
+
:gint16 => :int16,
|
14
|
+
:guint16 => :uint16,
|
15
|
+
:gint => :int,
|
16
|
+
:gint32 => :int32,
|
17
|
+
:guint32 => :uint32,
|
18
|
+
:gint64 => :int64,
|
19
|
+
:guint64 => :uint64,
|
20
|
+
:gfloat => :float,
|
21
|
+
:gdouble => :double,
|
22
|
+
:void => :void
|
23
|
+
}
|
24
|
+
|
25
|
+
def self.map_basic_type type
|
26
|
+
TAG_TYPE_MAP[type] || type
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/gir_ffi/version.rb
CHANGED
data/tasks/test.rake
CHANGED
@@ -20,6 +20,24 @@ namespace :test do
|
|
20
20
|
t.ruby_opts += ["-w"]
|
21
21
|
end
|
22
22
|
|
23
|
+
Rake::TestTask.new(:gobjectintrospection) do |t|
|
24
|
+
t.libs = ['lib']
|
25
|
+
t.test_files = FileList['test/ffi-gobject_introspection/*_test.rb']
|
26
|
+
t.ruby_opts += ["-w"]
|
27
|
+
end
|
28
|
+
|
29
|
+
Rake::TestTask.new(:glib) do |t|
|
30
|
+
t.libs = ['lib']
|
31
|
+
t.test_files = FileList['test/ffi-glib/*_test.rb']
|
32
|
+
t.ruby_opts += ["-w"]
|
33
|
+
end
|
34
|
+
|
35
|
+
Rake::TestTask.new(:gobject) do |t|
|
36
|
+
t.libs = ['lib']
|
37
|
+
t.test_files = FileList['test/ffi-gobject/*_test.rb']
|
38
|
+
t.ruby_opts += ["-w"]
|
39
|
+
end
|
40
|
+
|
23
41
|
desc 'Build Regress test library and typelib'
|
24
42
|
task :lib => "test/lib/Makefile" do
|
25
43
|
sh %{cd test/lib && make}
|
@@ -44,4 +62,5 @@ file "test/lib/configure" do
|
|
44
62
|
end
|
45
63
|
|
46
64
|
desc 'Run unit an integration tests'
|
47
|
-
task :test => ['test:
|
65
|
+
task :test => ['test:gobjectintrospection',
|
66
|
+
'test:unit', 'test:run', 'test:glib', 'test:gobject', 'test:integration']
|
data/test/arg_helper_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path('
|
1
|
+
require File.expand_path('gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
class ArgHelperTest < MiniTest::Spec
|
4
4
|
context "The outptr_to_utf8_array method" do
|
@@ -63,20 +63,17 @@ class ArgHelperTest < MiniTest::Spec
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
GirFFI.
|
69
|
-
|
70
|
-
@o2 = GirFFI::ArgHelper.object_pointer_to_object @o.to_ptr
|
71
|
-
end
|
66
|
+
describe "::object_pointer_to_object" do
|
67
|
+
it "finds the wrapping class by gtype and wraps the pointer in it" do
|
68
|
+
klsptr = GirFFI::InOutPointer.from :gtype, 0xdeadbeef
|
69
|
+
objptr = GirFFI::InOutPointer.from :pointer, klsptr
|
72
70
|
|
73
|
-
|
74
|
-
|
75
|
-
|
71
|
+
object_class = Class.new
|
72
|
+
mock(GirFFI::Builder).build_by_gtype(0xdeadbeef) { object_class }
|
73
|
+
mock(object_class).wrap(objptr) { "good-result" }
|
76
74
|
|
77
|
-
|
78
|
-
assert_equal
|
75
|
+
r = GirFFI::ArgHelper.object_pointer_to_object objptr
|
76
|
+
assert_equal "good-result", r
|
79
77
|
end
|
80
78
|
end
|
81
|
-
|
82
79
|
end
|