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.
Files changed (101) hide show
  1. data/History.txt +6 -0
  2. data/README.rdoc +36 -12
  3. data/examples/01_empty_window.rb +1 -3
  4. data/examples/02_hello_world.rb +1 -3
  5. data/examples/03_upgraded_hello_world.rb +1 -3
  6. data/examples/04_webkit.rb +2 -2
  7. data/examples/05_notification.rb +1 -2
  8. data/examples/print_class.rb +6 -4
  9. data/lib/ffi-glib.rb +107 -0
  10. data/lib/ffi-glib/array.rb +14 -0
  11. data/lib/ffi-glib/byte_array.rb +10 -0
  12. data/lib/ffi-glib/hash_table.rb +55 -0
  13. data/lib/ffi-glib/list.rb +9 -0
  14. data/lib/ffi-glib/list_methods.rb +31 -0
  15. data/lib/ffi-glib/s_list.rb +9 -0
  16. data/lib/ffi-gobject.rb +94 -0
  17. data/lib/ffi-gobject/closure.rb +12 -0
  18. data/lib/ffi-gobject/helper.rb +119 -0
  19. data/lib/ffi-gobject/initially_unowned.rb +10 -0
  20. data/lib/ffi-gobject/ruby_closure.rb +47 -0
  21. data/lib/ffi-gobject/value.rb +65 -0
  22. data/lib/ffi-gobject_introspection.rb +3 -0
  23. data/lib/{gir_ffi → ffi-gobject_introspection}/g_error.rb +1 -1
  24. data/lib/ffi-gobject_introspection/gobject_lib.rb +7 -0
  25. data/lib/{gir_ffi → ffi-gobject_introspection}/i_arg_info.rb +2 -2
  26. data/lib/{gir_ffi → ffi-gobject_introspection}/i_base_info.rb +1 -1
  27. data/lib/{gir_ffi → ffi-gobject_introspection}/i_callable_info.rb +4 -4
  28. data/lib/{gir_ffi → ffi-gobject_introspection}/i_callback_info.rb +1 -1
  29. data/lib/{gir_ffi → ffi-gobject_introspection}/i_constant_info.rb +2 -3
  30. data/lib/{gir_ffi → ffi-gobject_introspection}/i_enum_info.rb +1 -1
  31. data/lib/{gir_ffi → ffi-gobject_introspection}/i_field_info.rb +1 -1
  32. data/lib/{gir_ffi → ffi-gobject_introspection}/i_flags_info.rb +1 -1
  33. data/lib/{gir_ffi → ffi-gobject_introspection}/i_function_info.rb +1 -1
  34. data/lib/{gir_ffi → ffi-gobject_introspection}/i_interface_info.rb +1 -1
  35. data/lib/{gir_ffi → ffi-gobject_introspection}/i_object_info.rb +1 -1
  36. data/lib/{gir_ffi → ffi-gobject_introspection}/i_property_info.rb +1 -1
  37. data/lib/{gir_ffi → ffi-gobject_introspection}/i_registered_type_info.rb +1 -1
  38. data/lib/{gir_ffi → ffi-gobject_introspection}/i_repository.rb +37 -23
  39. data/lib/{gir_ffi → ffi-gobject_introspection}/i_signal_info.rb +1 -1
  40. data/lib/{gir_ffi → ffi-gobject_introspection}/i_struct_info.rb +1 -1
  41. data/lib/{gir_ffi → ffi-gobject_introspection}/i_type_info.rb +2 -2
  42. data/lib/{gir_ffi → ffi-gobject_introspection}/i_union_info.rb +1 -1
  43. data/lib/{gir_ffi → ffi-gobject_introspection}/i_value_info.rb +1 -1
  44. data/lib/{gir_ffi → ffi-gobject_introspection}/i_vfunc_info.rb +1 -1
  45. data/lib/{gir_ffi → ffi-gobject_introspection}/lib.rb +1 -1
  46. data/lib/ffi-gtk/base.rb +17 -0
  47. data/lib/ffi-gtk2.rb +5 -0
  48. data/lib/ffi-gtk3.rb +5 -0
  49. data/lib/gir_ffi.rb +11 -4
  50. data/lib/gir_ffi/arg_helper.rb +5 -4
  51. data/lib/gir_ffi/builder.rb +3 -25
  52. data/lib/gir_ffi/builder/argument.rb +0 -2
  53. data/lib/gir_ffi/builder/argument/hash_table_base.rb +1 -1
  54. data/lib/gir_ffi/builder/argument/list_base.rb +1 -1
  55. data/lib/gir_ffi/builder/module.rb +1 -6
  56. data/lib/gir_ffi/builder/type/unintrospectable.rb +1 -1
  57. data/lib/gir_ffi/callback_helper.rb +14 -7
  58. data/lib/gir_ffi/in_out_pointer.rb +1 -1
  59. data/lib/gir_ffi/in_pointer.rb +1 -1
  60. data/lib/gir_ffi/module_base.rb +4 -0
  61. data/lib/gir_ffi/type_map.rb +29 -0
  62. data/lib/gir_ffi/version.rb +1 -1
  63. data/tasks/test.rake +20 -1
  64. data/test/arg_helper_test.rb +10 -13
  65. data/test/builder_test.rb +2 -2
  66. data/test/class_base_test.rb +1 -1
  67. data/test/{glib_overrides_test.rb → ffi-glib/glib_overrides_test.rb} +3 -5
  68. data/test/{g_object_overrides_test.rb → ffi-gobject/g_object_overrides_test.rb} +7 -37
  69. data/test/ffi-gobject/gobject_test.rb +22 -0
  70. data/test/ffi-gobject/value_test.rb +34 -0
  71. data/test/{unit → ffi-gobject_introspection}/i_base_info_test.rb +2 -2
  72. data/test/{unit → ffi-gobject_introspection}/i_constant_info_test.rb +1 -1
  73. data/test/ffi-gobject_introspection/i_object_info_test.rb +20 -0
  74. data/test/{unit → ffi-gobject_introspection}/i_repository_test.rb +11 -11
  75. data/test/function_definition_builder_test.rb +1 -1
  76. data/test/gir_ffi_test_helper.rb +114 -0
  77. data/test/girffi_test.rb +2 -2
  78. data/test/gtk_overrides_test.rb +15 -12
  79. data/test/integration/generated_gimarshallingtests_test.rb +10 -5
  80. data/test/integration/generated_gio_test.rb +1 -1
  81. data/test/integration/generated_gobject_test.rb +1 -1
  82. data/test/integration/generated_gtk_test.rb +3 -3
  83. data/test/integration/generated_regress_test.rb +11 -3
  84. data/test/interface_type_builder_test.rb +1 -1
  85. data/test/module_builder_test.rb +1 -1
  86. data/test/test_helper.rb +2 -111
  87. data/test/type_builder_test.rb +2 -2
  88. data/test/unintrospectable_type_builder_test.rb +1 -1
  89. data/test/unit/builder_test.rb +1 -1
  90. data/test/unit/callback_helper_test.rb +13 -10
  91. data/test/unit/constant_builder_test.rb +1 -1
  92. data/test/unit/in_out_pointer_test.rb +1 -1
  93. data/test/unit/in_pointer_test.rb +1 -1
  94. data/test/unit/object_type_builder_test.rb +1 -1
  95. metadata +62 -43
  96. data/lib/gir_ffi/g_object.rb +0 -38
  97. data/lib/gir_ffi/overrides/glib.rb +0 -225
  98. data/lib/gir_ffi/overrides/gobject.rb +0 -330
  99. data/lib/gir_ffi/overrides/gtk.rb +0 -29
  100. data/test/g_object_test.rb +0 -21
  101. 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,10 @@
1
+ module GObject
2
+ load_class :InitiallyUnowned
3
+
4
+ class InitiallyUnowned
5
+ def self.constructor_wrap ptr
6
+ super.tap {|obj| ::GObject.object_ref_sink obj}
7
+ end
8
+ end
9
+ end
10
+
@@ -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
@@ -0,0 +1,3 @@
1
+ require 'ffi'
2
+ require 'ffi-gobject_introspection/i_repository'
3
+
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps GObject's GError struct.
3
3
  class GError < FFI::Struct
4
4
  layout :domain, :uint32,
@@ -0,0 +1,7 @@
1
+ module GObjectIntrospection
2
+ module GObjectLib
3
+ extend FFI::Library
4
+ ffi_lib "gobject-2.0"
5
+ attach_function :g_type_init, [], :void
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
- require 'gir_ffi/i_base_info'
2
- module GirFFI
1
+ require 'ffi-gobject_introspection/i_base_info'
2
+ module GObjectIntrospection
3
3
  # Wraps a GIArgInfo struct.
4
4
  # Represents an argument.
5
5
  class IArgInfo < IBaseInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps GIBaseInfo struct, the base \type for all info types.
3
3
  # Decendant types will be implemented as needed.
4
4
  class IBaseInfo
@@ -1,8 +1,8 @@
1
- require 'gir_ffi/i_base_info'
2
- require 'gir_ffi/i_type_info'
3
- require 'gir_ffi/i_arg_info'
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 GirFFI
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,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GICallbackInfo struct. Has no methods in addition to the ones
3
3
  # inherited from ICallableInfo.
4
4
  class ICallbackInfo < ICallableInfo
@@ -1,10 +1,9 @@
1
- module GirFFI
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
- size = Lib.g_constant_info_get_value @gobj, val
6
+ Lib.g_constant_info_get_value @gobj, val
8
7
  return val
9
8
  end
10
9
 
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIEnumInfo struct if it represents an enum.
3
3
  # If it represents a flag, an IFlagsInfo object is used instead.
4
4
  class IEnumInfo < IRegisteredTypeInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIFieldInfo struct.
3
3
  # Represents a field of an IStructInfo or an IUnionInfo.
4
4
  class IFieldInfo < IBaseInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIEnumInfo struct, if it represents a flag type.
3
3
  # TODO: Perhaps just use IEnumInfo. Seems to make more sense.
4
4
  class IFlagsInfo < IEnumInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIFunctioInfo struct.
3
3
  # Represents a function.
4
4
  class IFunctionInfo < ICallableInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a IInterfaceInfo struct.
3
3
  # Represents an interface.
4
4
  class IInterfaceInfo < IRegisteredTypeInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIObjectInfo struct.
3
3
  # Represents an object.
4
4
  class IObjectInfo < IRegisteredTypeInfo
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIPropertyInfo struct.
3
3
  # Represents a property of an IObjectInfo or an IInterfaceInfo.
4
4
  # Not implemented yet.
@@ -1,4 +1,4 @@
1
- module GirFFI
1
+ module GObjectIntrospection
2
2
  # Wraps a GIRegisteredTypeInfo struct.
3
3
  # Represents a registered type.
4
4
  class IRegisteredTypeInfo < IBaseInfo
@@ -1,26 +1,28 @@
1
1
  require 'singleton'
2
- require 'gir_ffi/lib'
3
- require 'gir_ffi/g_error'
4
- require 'gir_ffi/i_base_info'
5
- require 'gir_ffi/i_callable_info'
6
- require 'gir_ffi/i_callback_info'
7
- require 'gir_ffi/i_function_info'
8
- require 'gir_ffi/i_constant_info'
9
- require 'gir_ffi/i_field_info'
10
- require 'gir_ffi/i_registered_type_info'
11
- require 'gir_ffi/i_interface_info'
12
- require 'gir_ffi/i_property_info'
13
- require 'gir_ffi/i_vfunc_info'
14
- require 'gir_ffi/i_signal_info'
15
- require 'gir_ffi/i_object_info'
16
- require 'gir_ffi/i_struct_info'
17
- require 'gir_ffi/i_value_info'
18
- require 'gir_ffi/i_union_info'
19
- require 'gir_ffi/i_enum_info'
20
- require 'gir_ffi/i_flags_info'
21
- require 'gir_ffi/arg_helper'
22
-
23
- module GirFFI
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
- ArgHelper.strv_to_utf8_array strv
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