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
@@ -0,0 +1,12 @@
|
|
1
|
+
module GObject
|
2
|
+
load_class :Closure
|
3
|
+
|
4
|
+
class Closure
|
5
|
+
def set_marshal marshal
|
6
|
+
_v1 = GirFFI::CallbackHelper.wrap_in_callback_args_mapper(
|
7
|
+
"GObject", "ClosureMarshal", marshal)
|
8
|
+
::GObject::Lib::CALLBACKS << _v1
|
9
|
+
::GObject::Lib.g_closure_set_marshal self, _v1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
module GObject
|
2
|
+
module Helper
|
3
|
+
TAG_TYPE_TO_GTYPE_NAME_MAP = {
|
4
|
+
:utf8 => "gchararray",
|
5
|
+
:gboolean => "gboolean",
|
6
|
+
:void => "void"
|
7
|
+
}
|
8
|
+
|
9
|
+
def self.signal_callback_args sig, klass, &block
|
10
|
+
return Proc.new do |*args|
|
11
|
+
mapped = cast_back_signal_arguments sig, klass, *args
|
12
|
+
block.call(*mapped)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.signal_arguments_to_gvalue_array signal, instance, *rest
|
17
|
+
sig = instance.class._find_signal signal
|
18
|
+
|
19
|
+
arr = ::GObject::ValueArray.new sig.n_args+1
|
20
|
+
|
21
|
+
arr.append signal_reciever_to_gvalue instance
|
22
|
+
|
23
|
+
sig.args.zip(rest).each do |info, arg|
|
24
|
+
arr.append signal_argument_to_gvalue info, arg
|
25
|
+
end
|
26
|
+
|
27
|
+
arr
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.signal_reciever_to_gvalue instance
|
31
|
+
val = ::GObject::Value.new
|
32
|
+
val.init ::GObject.type_from_instance instance
|
33
|
+
val.set_instance instance
|
34
|
+
return val
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.signal_argument_to_gvalue info, arg
|
38
|
+
arg_type = info.argument_type
|
39
|
+
|
40
|
+
val = gvalue_for_type_info arg_type
|
41
|
+
|
42
|
+
if arg_type.tag == :interface
|
43
|
+
interface = arg_type.interface
|
44
|
+
case interface.info_type
|
45
|
+
when :struct
|
46
|
+
val.set_boxed arg
|
47
|
+
when :object
|
48
|
+
val.set_instance arg
|
49
|
+
when :enum
|
50
|
+
val.set_enum arg
|
51
|
+
else
|
52
|
+
raise NotImplementedError, interface.info_type
|
53
|
+
end
|
54
|
+
else
|
55
|
+
val.set_ruby_value arg
|
56
|
+
end
|
57
|
+
|
58
|
+
return val
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.gvalue_for_type_info info
|
62
|
+
tag = info.tag
|
63
|
+
gtype = case tag
|
64
|
+
when :interface
|
65
|
+
info.interface.g_type
|
66
|
+
when :void
|
67
|
+
return nil
|
68
|
+
else
|
69
|
+
::GObject.type_from_name(TAG_TYPE_TO_GTYPE_NAME_MAP[tag])
|
70
|
+
end
|
71
|
+
::GObject::Value.new.tap {|val| val.init gtype}
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.gvalue_for_signal_return_value signal, object
|
75
|
+
sig = object.class._find_signal signal
|
76
|
+
rettypeinfo = sig.return_type
|
77
|
+
|
78
|
+
gvalue_for_type_info rettypeinfo
|
79
|
+
end
|
80
|
+
|
81
|
+
# TODO: Generate cast back methods using existing Argument builders.
|
82
|
+
def self.cast_back_signal_arguments signalinfo, klass, *args
|
83
|
+
result = []
|
84
|
+
|
85
|
+
# Instance
|
86
|
+
instptr = args.shift
|
87
|
+
instance = klass.wrap instptr
|
88
|
+
result << instance
|
89
|
+
|
90
|
+
# Extra arguments
|
91
|
+
signalinfo.args.each do |info|
|
92
|
+
result << cast_signal_argument(info, args.shift)
|
93
|
+
end
|
94
|
+
|
95
|
+
# User Data
|
96
|
+
arg = args.shift
|
97
|
+
arg = GirFFI::ArgHelper::OBJECT_STORE[arg.address]
|
98
|
+
result << arg
|
99
|
+
|
100
|
+
return result
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.cast_signal_argument info, arg
|
104
|
+
arg_t = info.argument_type
|
105
|
+
if arg_t.tag == :interface
|
106
|
+
iface = arg_t.interface
|
107
|
+
kls = GirFFI::Builder.build_class iface
|
108
|
+
case iface.info_type
|
109
|
+
when :enum, :flags
|
110
|
+
kls[arg]
|
111
|
+
else
|
112
|
+
kls.wrap(arg)
|
113
|
+
end
|
114
|
+
else
|
115
|
+
arg
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'ffi-gobject/closure'
|
2
|
+
|
3
|
+
module GObject
|
4
|
+
# This class encapsulates Ruby
|
5
|
+
# blocks as GObject Closures.
|
6
|
+
class RubyClosure < Closure
|
7
|
+
BLOCK_STORE = {}
|
8
|
+
|
9
|
+
class Struct < FFI::Struct
|
10
|
+
layout :parent, Closure::Struct, 0,
|
11
|
+
:blockhash, :int64
|
12
|
+
end
|
13
|
+
|
14
|
+
def block
|
15
|
+
self.class::BLOCK_STORE[self[:blockhash]]
|
16
|
+
end
|
17
|
+
|
18
|
+
def invoke_block *args
|
19
|
+
block.call(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.new &block
|
23
|
+
raise ArgumentError unless block_given?
|
24
|
+
wrap(new_simple(self::Struct.size, nil).to_ptr).tap do |it|
|
25
|
+
h = block.object_id
|
26
|
+
self::BLOCK_STORE[h] = block
|
27
|
+
it[:blockhash] = h
|
28
|
+
it.set_marshal Proc.new {|*args| marshaller(*args)}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.marshaller(closure, return_value, n_param_values,
|
33
|
+
param_values, invocation_hint, marshal_data)
|
34
|
+
rclosure = self.wrap(closure.to_ptr)
|
35
|
+
|
36
|
+
args = []
|
37
|
+
n_param_values.times {|i|
|
38
|
+
gv = ::GObject::Value.wrap(param_values.to_ptr +
|
39
|
+
i * ::GObject::Value::Struct.size)
|
40
|
+
args << gv.ruby_value
|
41
|
+
}
|
42
|
+
|
43
|
+
r = rclosure.invoke_block(*args)
|
44
|
+
return_value.set_ruby_value r unless return_value.nil?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module GObject
|
2
|
+
load_class :Value
|
3
|
+
|
4
|
+
class Value
|
5
|
+
def set_ruby_value val
|
6
|
+
if current_gtype == 0
|
7
|
+
init_for_ruby_value val
|
8
|
+
end
|
9
|
+
|
10
|
+
case current_gtype_name
|
11
|
+
when "gboolean"
|
12
|
+
set_boolean val
|
13
|
+
when "gint"
|
14
|
+
set_int val
|
15
|
+
when "gchararray"
|
16
|
+
set_string val
|
17
|
+
else
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
self
|
21
|
+
end
|
22
|
+
|
23
|
+
def init_for_ruby_value val
|
24
|
+
case val
|
25
|
+
when true, false
|
26
|
+
init ::GObject.type_from_name("gboolean")
|
27
|
+
when Integer
|
28
|
+
init ::GObject.type_from_name("gint")
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def current_gtype
|
34
|
+
self[:g_type]
|
35
|
+
end
|
36
|
+
|
37
|
+
def current_gtype_name
|
38
|
+
::GObject.type_name current_gtype
|
39
|
+
end
|
40
|
+
|
41
|
+
def ruby_value
|
42
|
+
case current_gtype_name.to_sym
|
43
|
+
when :gboolean
|
44
|
+
get_boolean
|
45
|
+
when :gint
|
46
|
+
get_int
|
47
|
+
when :gchararray
|
48
|
+
get_string
|
49
|
+
when :GDate
|
50
|
+
::GLib::Date.wrap(get_boxed)
|
51
|
+
when :GStrv
|
52
|
+
# FIXME: Extract this method to even lower level module.
|
53
|
+
GirFFI::ArgHelper.strv_to_utf8_array get_boxed
|
54
|
+
else
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class << self
|
60
|
+
def wrap_ruby_value val
|
61
|
+
self.new.set_ruby_value val
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require '
|
2
|
-
require '
|
3
|
-
require '
|
1
|
+
require 'ffi-gobject_introspection/i_base_info'
|
2
|
+
require 'ffi-gobject_introspection/i_type_info'
|
3
|
+
require 'ffi-gobject_introspection/i_arg_info'
|
4
4
|
|
5
|
-
module
|
5
|
+
module GObjectIntrospection
|
6
6
|
# Wraps a GICallableInfo struct; represents a callable, either
|
7
7
|
# IFunctionInfo, ICallbackInfo or IVFuncInfo.
|
8
8
|
class ICallableInfo < IBaseInfo
|
@@ -1,10 +1,9 @@
|
|
1
|
-
module
|
1
|
+
module GObjectIntrospection
|
2
2
|
# Wraps a GIConstantInfo struct; represents an constant.
|
3
|
-
# Not implemented yet.
|
4
3
|
class IConstantInfo < IBaseInfo
|
5
4
|
def value
|
6
5
|
val = Lib::GIArgument.new
|
7
|
-
|
6
|
+
Lib.g_constant_info_get_value @gobj, val
|
8
7
|
return val
|
9
8
|
end
|
10
9
|
|
@@ -1,26 +1,28 @@
|
|
1
1
|
require 'singleton'
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
8
|
-
require '
|
9
|
-
require '
|
10
|
-
require '
|
11
|
-
require '
|
12
|
-
require '
|
13
|
-
require '
|
14
|
-
require '
|
15
|
-
require '
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require '
|
19
|
-
require '
|
20
|
-
require '
|
21
|
-
require '
|
22
|
-
|
23
|
-
module
|
2
|
+
require 'ffi-gobject_introspection/lib'
|
3
|
+
require 'ffi-gobject_introspection/gobject_lib'
|
4
|
+
require 'ffi-gobject_introspection/g_error'
|
5
|
+
require 'ffi-gobject_introspection/i_base_info'
|
6
|
+
require 'ffi-gobject_introspection/i_callable_info'
|
7
|
+
require 'ffi-gobject_introspection/i_callback_info'
|
8
|
+
require 'ffi-gobject_introspection/i_function_info'
|
9
|
+
require 'ffi-gobject_introspection/i_constant_info'
|
10
|
+
require 'ffi-gobject_introspection/i_field_info'
|
11
|
+
require 'ffi-gobject_introspection/i_registered_type_info'
|
12
|
+
require 'ffi-gobject_introspection/i_interface_info'
|
13
|
+
require 'ffi-gobject_introspection/i_property_info'
|
14
|
+
require 'ffi-gobject_introspection/i_vfunc_info'
|
15
|
+
require 'ffi-gobject_introspection/i_signal_info'
|
16
|
+
require 'ffi-gobject_introspection/i_object_info'
|
17
|
+
require 'ffi-gobject_introspection/i_struct_info'
|
18
|
+
require 'ffi-gobject_introspection/i_value_info'
|
19
|
+
require 'ffi-gobject_introspection/i_union_info'
|
20
|
+
require 'ffi-gobject_introspection/i_enum_info'
|
21
|
+
require 'ffi-gobject_introspection/i_flags_info'
|
22
|
+
|
23
|
+
module GObjectIntrospection
|
24
|
+
GObjectLib::g_type_init
|
25
|
+
|
24
26
|
# The Gobject Introspection Repository. This class is the point of
|
25
27
|
# access to the introspection typelibs.
|
26
28
|
# This class wraps the GIRepository struct.
|
@@ -50,6 +52,8 @@ module GirFFI
|
|
50
52
|
:unresolved => IBaseInfo
|
51
53
|
}
|
52
54
|
|
55
|
+
POINTER_SIZE = FFI.type_size(:pointer)
|
56
|
+
|
53
57
|
def initialize
|
54
58
|
@gobj = Lib::g_irepository_get_default
|
55
59
|
end
|
@@ -105,7 +109,7 @@ module GirFFI
|
|
105
109
|
|
106
110
|
def dependencies namespace
|
107
111
|
strv = Lib.g_irepository_get_dependencies @gobj, namespace
|
108
|
-
|
112
|
+
strv_to_utf8_array strv
|
109
113
|
end
|
110
114
|
|
111
115
|
def shared_library namespace
|
@@ -126,5 +130,15 @@ module GirFFI
|
|
126
130
|
def wrap ptr
|
127
131
|
IRepository.wrap_ibaseinfo_pointer ptr
|
128
132
|
end
|
133
|
+
|
134
|
+
def strv_to_utf8_array strv
|
135
|
+
return [] if strv.null?
|
136
|
+
arr, offset = [], 0
|
137
|
+
until (ptr = strv.get_pointer offset).null? do
|
138
|
+
arr << ptr.read_string
|
139
|
+
offset += POINTER_SIZE
|
140
|
+
end
|
141
|
+
return arr
|
142
|
+
end
|
129
143
|
end
|
130
144
|
end
|