gir_ffi 0.14.1 → 0.15.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (281) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +56 -0
  3. data/README.md +12 -12
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +26 -21
  8. data/lib/ffi-glib/array.rb +14 -4
  9. data/lib/ffi-glib/byte_array.rb +9 -3
  10. data/lib/ffi-glib/container_class_methods.rb +1 -1
  11. data/lib/ffi-glib/destroy_notify.rb +2 -2
  12. data/lib/ffi-glib/error.rb +1 -1
  13. data/lib/ffi-glib/hash_table.rb +4 -5
  14. data/lib/ffi-glib/list.rb +12 -6
  15. data/lib/ffi-glib/list_methods.rb +13 -1
  16. data/lib/ffi-glib/main_loop.rb +3 -3
  17. data/lib/ffi-glib/ptr_array.rb +30 -8
  18. data/lib/ffi-glib/s_list.rb +11 -5
  19. data/lib/ffi-glib/variant.rb +1 -1
  20. data/lib/ffi-gobject.rb +13 -16
  21. data/lib/ffi-gobject/object.rb +82 -87
  22. data/lib/ffi-gobject/object_class.rb +1 -1
  23. data/lib/ffi-gobject/param_spec.rb +1 -1
  24. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  25. data/lib/ffi-gobject/value.rb +136 -126
  26. data/lib/ffi-gobject_introspection.rb +20 -20
  27. data/lib/ffi-gobject_introspection/gobject_type_init.rb +2 -2
  28. data/lib/ffi-gobject_introspection/i_arg_info.rb +2 -2
  29. data/lib/ffi-gobject_introspection/i_base_info.rb +34 -23
  30. data/lib/ffi-gobject_introspection/i_callable_info.rb +4 -4
  31. data/lib/ffi-gobject_introspection/i_constant_info.rb +2 -2
  32. data/lib/ffi-gobject_introspection/i_enum_info.rb +1 -0
  33. data/lib/ffi-gobject_introspection/i_field_info.rb +1 -1
  34. data/lib/ffi-gobject_introspection/i_function_info.rb +1 -1
  35. data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -1
  36. data/lib/ffi-gobject_introspection/i_object_info.rb +2 -2
  37. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  38. data/lib/ffi-gobject_introspection/i_repository.rb +9 -6
  39. data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -1
  40. data/lib/ffi-gobject_introspection/i_type_info.rb +13 -7
  41. data/lib/ffi-gobject_introspection/i_unresolved_info.rb +1 -1
  42. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  43. data/lib/ffi-gobject_introspection/lib.rb +30 -19
  44. data/lib/ffi-gobject_introspection/strv.rb +1 -1
  45. data/lib/gir_ffi-base.rb +1 -1
  46. data/lib/gir_ffi-base/gobject.rb +26 -25
  47. data/lib/gir_ffi-base/gobject/lib.rb +7 -2
  48. data/lib/gir_ffi.rb +3 -3
  49. data/lib/gir_ffi/allocation_helper.rb +1 -1
  50. data/lib/gir_ffi/arg_helper.rb +4 -4
  51. data/lib/gir_ffi/{in_out_pointer.rb → array_element_convertor.rb} +16 -24
  52. data/lib/gir_ffi/boolean.rb +1 -1
  53. data/lib/gir_ffi/boxed_base.rb +2 -6
  54. data/lib/gir_ffi/builder.rb +19 -11
  55. data/lib/gir_ffi/builder_helper.rb +10 -2
  56. data/lib/gir_ffi/builders/argument_builder.rb +19 -19
  57. data/lib/gir_ffi/builders/argument_builder_collection.rb +2 -2
  58. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -1
  59. data/lib/gir_ffi/builders/base_method_builder.rb +8 -8
  60. data/lib/gir_ffi/builders/base_return_value_builder.rb +1 -1
  61. data/lib/gir_ffi/builders/base_type_builder.rb +2 -2
  62. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +5 -5
  63. data/lib/gir_ffi/builders/callback_argument_builder.rb +10 -8
  64. data/lib/gir_ffi/builders/callback_builder.rb +28 -14
  65. data/lib/gir_ffi/builders/callback_return_value_builder.rb +6 -8
  66. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  67. data/lib/gir_ffi/builders/closure_argument_builder.rb +1 -1
  68. data/lib/gir_ffi/builders/closure_return_value_builder.rb +1 -1
  69. data/lib/gir_ffi/builders/constant_builder.rb +1 -1
  70. data/lib/gir_ffi/builders/constructor_builder.rb +9 -9
  71. data/lib/gir_ffi/builders/enum_builder.rb +11 -7
  72. data/lib/gir_ffi/builders/field_builder.rb +20 -18
  73. data/lib/gir_ffi/builders/flags_builder.rb +2 -2
  74. data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +1 -1
  75. data/lib/gir_ffi/builders/function_builder.rb +11 -5
  76. data/lib/gir_ffi/builders/initializer_builder.rb +3 -3
  77. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +2 -2
  78. data/lib/gir_ffi/builders/interface_builder.rb +5 -3
  79. data/lib/gir_ffi/builders/mapping_method_builder.rb +10 -10
  80. data/lib/gir_ffi/builders/marshalling_method_builder.rb +12 -9
  81. data/lib/gir_ffi/builders/method_template.rb +5 -5
  82. data/lib/gir_ffi/builders/module_builder.rb +7 -7
  83. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  84. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  85. data/lib/gir_ffi/builders/object_builder.rb +22 -12
  86. data/lib/gir_ffi/builders/property_argument_builder.rb +1 -1
  87. data/lib/gir_ffi/builders/property_builder.rb +14 -14
  88. data/lib/gir_ffi/builders/property_return_value_builder.rb +1 -1
  89. data/lib/gir_ffi/builders/registered_type_builder.rb +14 -5
  90. data/lib/gir_ffi/builders/return_value_builder.rb +4 -4
  91. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +6 -6
  92. data/lib/gir_ffi/builders/signal_closure_builder.rb +5 -7
  93. data/lib/gir_ffi/builders/struct_builder.rb +8 -6
  94. data/lib/gir_ffi/builders/struct_like.rb +1 -1
  95. data/lib/gir_ffi/builders/type_builder.rb +12 -12
  96. data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +2 -2
  97. data/lib/gir_ffi/builders/unintrospectable_builder.rb +2 -2
  98. data/lib/gir_ffi/builders/union_builder.rb +4 -4
  99. data/lib/gir_ffi/builders/user_defined_builder.rb +10 -3
  100. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +2 -2
  101. data/lib/gir_ffi/builders/vfunc_builder.rb +8 -8
  102. data/lib/gir_ffi/builders/with_layout.rb +2 -2
  103. data/lib/gir_ffi/callback_base.rb +7 -9
  104. data/lib/gir_ffi/class_base.rb +6 -5
  105. data/lib/gir_ffi/core.rb +36 -22
  106. data/lib/gir_ffi/enum_base.rb +1 -1
  107. data/lib/gir_ffi/enum_like_base.rb +2 -2
  108. data/lib/gir_ffi/error_argument_info.rb +2 -2
  109. data/lib/gir_ffi/error_type_info.rb +1 -1
  110. data/lib/gir_ffi/ffi_ext.rb +1 -1
  111. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  112. data/lib/gir_ffi/flags_base.rb +1 -1
  113. data/lib/gir_ffi/glib_error.rb +1 -2
  114. data/lib/gir_ffi/in_pointer.rb +17 -0
  115. data/lib/gir_ffi/info_ext.rb +15 -15
  116. data/lib/gir_ffi/info_ext/full_type_name.rb +3 -3
  117. data/lib/gir_ffi/info_ext/i_arg_info.rb +1 -1
  118. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  119. data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -1
  120. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  121. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  122. data/lib/gir_ffi/info_ext/i_property_info.rb +2 -2
  123. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -5
  124. data/lib/gir_ffi/info_ext/i_signal_info.rb +7 -3
  125. data/lib/gir_ffi/info_ext/i_type_info.rb +48 -26
  126. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +1 -1
  127. data/lib/gir_ffi/info_ext/i_value_info.rb +2 -2
  128. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
  129. data/lib/gir_ffi/info_ext/safe_constant_name.rb +8 -8
  130. data/lib/gir_ffi/info_ext/safe_function_name.rb +2 -2
  131. data/lib/gir_ffi/interface_base.rb +3 -3
  132. data/lib/gir_ffi/lib_c.rb +1 -1
  133. data/lib/gir_ffi/method_stubber.rb +1 -1
  134. data/lib/gir_ffi/module_base.rb +1 -1
  135. data/lib/gir_ffi/object_base.rb +30 -4
  136. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  137. data/lib/gir_ffi/receiver_type_info.rb +2 -2
  138. data/lib/gir_ffi/registered_type_base.rb +1 -1
  139. data/lib/gir_ffi/return_value_info.rb +1 -2
  140. data/lib/gir_ffi/sized_array.rb +4 -2
  141. data/lib/gir_ffi/struct.rb +1 -1
  142. data/lib/gir_ffi/struct_base.rb +2 -10
  143. data/lib/gir_ffi/struct_like_base.rb +9 -5
  144. data/lib/gir_ffi/type_map.rb +2 -23
  145. data/lib/gir_ffi/unintrospectable_boxed_info.rb +2 -2
  146. data/lib/gir_ffi/unintrospectable_type_info.rb +6 -2
  147. data/lib/gir_ffi/union.rb +1 -1
  148. data/lib/gir_ffi/union_base.rb +2 -10
  149. data/lib/gir_ffi/user_defined_object_info.rb +9 -4
  150. data/lib/gir_ffi/user_defined_property_info.rb +33 -33
  151. data/lib/gir_ffi/version.rb +1 -1
  152. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  153. metadata +102 -155
  154. data/Gemfile +0 -12
  155. data/Rakefile +0 -9
  156. data/lib/ffi-glib/array_methods.rb +0 -16
  157. data/tasks/test.rake +0 -203
  158. data/test/base_test_helper.rb +0 -63
  159. data/test/ffi-glib/array_test.rb +0 -188
  160. data/test/ffi-glib/byte_array_test.rb +0 -22
  161. data/test/ffi-glib/bytes_test.rb +0 -56
  162. data/test/ffi-glib/closure_test.rb +0 -38
  163. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  164. data/test/ffi-glib/hash_table_test.rb +0 -68
  165. data/test/ffi-glib/list_test.rb +0 -86
  166. data/test/ffi-glib/main_loop_test.rb +0 -53
  167. data/test/ffi-glib/ptr_array_test.rb +0 -112
  168. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  169. data/test/ffi-glib/s_list_test.rb +0 -76
  170. data/test/ffi-glib/strv_test.rb +0 -60
  171. data/test/ffi-glib/variant_test.rb +0 -12
  172. data/test/ffi-gobject/gobject_test.rb +0 -72
  173. data/test/ffi-gobject/object_class_test.rb +0 -31
  174. data/test/ffi-gobject/object_test.rb +0 -140
  175. data/test/ffi-gobject/param_spec_test.rb +0 -32
  176. data/test/ffi-gobject/value_test.rb +0 -370
  177. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  178. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -53
  179. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -33
  180. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  181. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  182. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  183. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  184. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  185. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  186. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  187. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  188. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -33
  189. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  190. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  191. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  192. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  193. data/test/ffi-gobject_test.rb +0 -151
  194. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  195. data/test/gir_ffi/arg_helper_test.rb +0 -140
  196. data/test/gir_ffi/boolean_test.rb +0 -43
  197. data/test/gir_ffi/boxed_base_test.rb +0 -65
  198. data/test/gir_ffi/builder_test.rb +0 -300
  199. data/test/gir_ffi/builders/argument_builder_test.rb +0 -657
  200. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  201. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -129
  202. data/test/gir_ffi/builders/callback_builder_test.rb +0 -118
  203. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -85
  204. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  205. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  206. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  207. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  208. data/test/gir_ffi/builders/function_builder_test.rb +0 -538
  209. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  210. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  211. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  212. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  213. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  214. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -30
  215. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -440
  216. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -188
  217. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  218. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -35
  219. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -73
  220. data/test/gir_ffi/builders/union_builder_test.rb +0 -31
  221. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  222. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  223. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -253
  224. data/test/gir_ffi/callback_base_test.rb +0 -22
  225. data/test/gir_ffi/class_base_test.rb +0 -168
  226. data/test/gir_ffi/core_test.rb +0 -98
  227. data/test/gir_ffi/enum_base_test.rb +0 -43
  228. data/test/gir_ffi/error_type_info_test.rb +0 -50
  229. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  230. data/test/gir_ffi/g_type_test.rb +0 -31
  231. data/test/gir_ffi/in_out_pointer_test.rb +0 -56
  232. data/test/gir_ffi/in_pointer_test.rb +0 -183
  233. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  234. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  235. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  236. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  237. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  238. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -697
  239. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  240. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  241. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  242. data/test/gir_ffi/interface_base_test.rb +0 -20
  243. data/test/gir_ffi/method_stubber_test.rb +0 -65
  244. data/test/gir_ffi/object_base_test.rb +0 -64
  245. data/test/gir_ffi/object_store_test.rb +0 -41
  246. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  247. data/test/gir_ffi/sized_array_test.rb +0 -206
  248. data/test/gir_ffi/struct_base_test.rb +0 -23
  249. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  250. data/test/gir_ffi/type_map_test.rb +0 -17
  251. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  252. data/test/gir_ffi/union_base_test.rb +0 -23
  253. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  254. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  255. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  256. data/test/gir_ffi/version_test.rb +0 -9
  257. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  258. data/test/gir_ffi_test_helper.rb +0 -84
  259. data/test/integration/callback_exceptions_test.rb +0 -63
  260. data/test/integration/derived_classes_test.rb +0 -53
  261. data/test/integration/generated_everything_test.rb +0 -452
  262. data/test/integration/generated_gimarshallingtests_test.rb +0 -2995
  263. data/test/integration/generated_gio_test.rb +0 -116
  264. data/test/integration/generated_glib_test.rb +0 -12
  265. data/test/integration/generated_gobject_test.rb +0 -116
  266. data/test/integration/generated_gst_test.rb +0 -34
  267. data/test/integration/generated_gtk_source_test.rb +0 -27
  268. data/test/integration/generated_gtop_test.rb +0 -29
  269. data/test/integration/generated_pango_ft2_test.rb +0 -17
  270. data/test/integration/generated_pango_test.rb +0 -24
  271. data/test/integration/generated_regress_test.rb +0 -3850
  272. data/test/integration/generated_secret_test.rb +0 -17
  273. data/test/integration/generated_utility_test.rb +0 -174
  274. data/test/integration/generated_warnlib_test.rb +0 -49
  275. data/test/integration/method_lookup_test.rb +0 -34
  276. data/test/introspection_test_helper.rb +0 -52
  277. data/test/lib/Makefile.am +0 -110
  278. data/test/lib/autogen.sh +0 -4
  279. data/test/lib/configure.ac +0 -34
  280. data/test/lib/m4/jhflags.m4 +0 -21
  281. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-glib/list_methods'
3
+ require "ffi-glib/list_methods"
4
4
 
5
5
  GLib.load_class :List
6
6
 
@@ -9,13 +9,19 @@ module GLib
9
9
  class List
10
10
  include ListMethods
11
11
 
12
- def self.from_enumerable(type, arr)
13
- arr.reduce(new(type)) { |lst, val| lst.append val }
12
+ def append(data)
13
+ store_pointer Lib.g_list_append(self, element_ptr_for(data))
14
+ self
14
15
  end
15
16
 
16
- def append(data)
17
- self.class.wrap(element_type,
18
- Lib.g_list_append(self, element_ptr_for(data)))
17
+ def prepend(data)
18
+ store_pointer Lib.g_list_prepend(self, element_ptr_for(data))
19
+ self
20
+ end
21
+
22
+ def reverse
23
+ store_pointer Lib.g_list_reverse(self)
24
+ self
19
25
  end
20
26
  end
21
27
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-glib/container_class_methods'
3
+ require "ffi-glib/container_class_methods"
4
4
 
5
5
  module GLib
6
6
  # Common methods for List and SList.
@@ -14,6 +14,7 @@ module GLib
14
14
  replace_method base, :data, :head
15
15
 
16
16
  base.extend ContainerClassMethods
17
+ base.extend ClassMethods
17
18
  end
18
19
 
19
20
  def self.replace_method(base, old, new)
@@ -36,10 +37,14 @@ module GLib
36
37
  end
37
38
 
38
39
  def tail
40
+ return nil if struct.null?
41
+
39
42
  self.class.wrap(element_type, struct[:next])
40
43
  end
41
44
 
42
45
  def head
46
+ return nil if struct.null?
47
+
43
48
  GirFFI::ArgHelper.cast_from_pointer(element_type, struct[:data])
44
49
  end
45
50
 
@@ -69,5 +74,12 @@ module GLib
69
74
  def element_ptr_for(data)
70
75
  GirFFI::InPointer.from(element_type, data)
71
76
  end
77
+
78
+ # Common class methods for List and SList
79
+ module ClassMethods
80
+ def from_enumerable(type, arr)
81
+ arr.reduce(new(type)) { |lst, val| lst.prepend val }.reverse
82
+ end
83
+ end
72
84
  end
73
85
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'singleton'
3
+ require "singleton"
4
4
 
5
5
  GLib.load_class :MainLoop
6
6
 
@@ -40,7 +40,7 @@ module GLib
40
40
  setup_instance_method! :run
41
41
 
42
42
  def run_with_thread_enabler
43
- ThreadEnabler.instance.setup_idle_handler if RUBY_ENGINE == 'ruby'
43
+ ThreadEnabler.instance.setup_idle_handler if RUBY_ENGINE == "ruby"
44
44
  RUNNING_LOOPS << self
45
45
  result = run_without_thread_enabler
46
46
  exception = EXCEPTIONS.shift
@@ -63,6 +63,6 @@ module GLib
63
63
  end
64
64
  end
65
65
 
66
- Signal.trap 'INT' do
66
+ Signal.trap "INT" do
67
67
  GLib::MainLoop.handle_exception(Interrupt.new)
68
68
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-glib/container_class_methods'
4
- require 'ffi-glib/array_methods'
3
+ require "ffi-glib/container_class_methods"
4
+ require "gir_ffi/array_element_convertor"
5
5
 
6
6
  GLib.load_class :PtrArray
7
7
 
@@ -10,7 +10,6 @@ module GLib
10
10
  # pointers.
11
11
  class PtrArray
12
12
  include Enumerable
13
- include ArrayMethods
14
13
  extend ContainerClassMethods
15
14
 
16
15
  attr_reader :element_type
@@ -49,12 +48,25 @@ module GLib
49
48
  ary.each { |item| add item }
50
49
  end
51
50
 
52
- def data_ptr
53
- struct[:pdata]
54
- end
51
+ # Re-implementation of the g_ptrarray_index macro
52
+ def index(idx)
53
+ unless (0...length).cover? idx
54
+ raise IndexError, "Index #{idx} outside of bounds 0..#{length - 1}"
55
+ end
55
56
 
56
- def element_size
57
- POINTER_SIZE
57
+ item_ptr = data_ptr + idx * element_size
58
+
59
+ convert_element_type = case element_type
60
+ when :utf8
61
+ :utf8
62
+ when GirFFI::ObjectBase
63
+ element_type
64
+ else
65
+ [:pointer, element_type]
66
+ end
67
+
68
+ convertor = GirFFI::ArrayElementConvertor.new convert_element_type, item_ptr
69
+ convertor.to_ruby_value
58
70
  end
59
71
 
60
72
  def each
@@ -70,5 +82,15 @@ module GLib
70
82
  def ==(other)
71
83
  to_a == other.to_a
72
84
  end
85
+
86
+ private
87
+
88
+ def element_size
89
+ POINTER_SIZE
90
+ end
91
+
92
+ def data_ptr
93
+ struct[:pdata]
94
+ end
73
95
  end
74
96
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-glib/list_methods'
3
+ require "ffi-glib/list_methods"
4
4
 
5
5
  GLib.load_class :SList
6
6
 
@@ -9,13 +9,19 @@ module GLib
9
9
  class SList
10
10
  include ListMethods
11
11
 
12
- def self.from_enumerable(type, arr)
13
- arr.reverse.reduce(new(type)) { |lst, val| lst.prepend val }
12
+ def append(data)
13
+ store_pointer Lib.g_slist_append(self, element_ptr_for(data))
14
+ self
14
15
  end
15
16
 
16
17
  def prepend(data)
17
- self.class.wrap(element_type,
18
- Lib.g_slist_prepend(self, element_ptr_for(data)))
18
+ store_pointer Lib.g_slist_prepend(self, element_ptr_for(data))
19
+ self
20
+ end
21
+
22
+ def reverse
23
+ store_pointer Lib.g_slist_reverse(self)
24
+ self
19
25
  end
20
26
  end
21
27
  end
@@ -5,7 +5,7 @@ GLib.load_class :Variant
5
5
  module GLib
6
6
  # Overrides for GVariant, GLib's variant data type.
7
7
  class Variant
8
- setup_instance_method! 'get_string'
8
+ setup_instance_method! "get_string"
9
9
 
10
10
  def get_string_with_override
11
11
  get_string_without_override.first
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/core'
3
+ require "gir_ffi/core"
4
4
 
5
5
  # Bypass check for existing modules
6
- GirFFI::Builders::ModuleBuilder.new('GObject').generate
6
+ GirFFI::Builders::ModuleBuilder.new("GObject").generate
7
7
 
8
- require 'ffi-gobject/value'
9
- require 'ffi-gobject/initially_unowned'
10
- require 'ffi-gobject/closure'
11
- require 'ffi-gobject/object'
12
- require 'ffi-gobject/object_class'
13
- require 'ffi-gobject/param_spec'
14
- require 'ffi-gobject/ruby_closure'
15
- require 'gir_ffi/signal_not_found_error'
8
+ require "ffi-gobject/value"
9
+ require "ffi-gobject/initially_unowned"
10
+ require "ffi-gobject/closure"
11
+ require "ffi-gobject/object"
12
+ require "ffi-gobject/object_class"
13
+ require "ffi-gobject/param_spec"
14
+ require "ffi-gobject/ruby_closure"
15
+ require "gir_ffi/signal_not_found_error"
16
16
 
17
17
  # Module representing GLib's GObject namespace.
18
18
  module GObject
@@ -47,7 +47,7 @@ module GObject
47
47
  end
48
48
 
49
49
  def self.signal_emit(object, detailed_signal, *args)
50
- signal, detail = detailed_signal.split('::')
50
+ signal, detail = detailed_signal.split("::")
51
51
  signal_id = signal_lookup_from_instance signal, object
52
52
  detail_quark = GLib.quark_from_string(detail)
53
53
 
@@ -63,9 +63,9 @@ module GObject
63
63
  end
64
64
 
65
65
  def self.signal_connect(object, detailed_signal, data = nil, after = false, &block)
66
- raise ArgumentError, 'Block needed' unless block_given?
66
+ raise ArgumentError, "Block needed" unless block_given?
67
67
 
68
- signal_name, = detailed_signal.split('::')
68
+ signal_name, = detailed_signal.split("::")
69
69
  sig_info = object.class.find_signal signal_name
70
70
 
71
71
  closure = sig_info.wrap_in_closure do |*args|
@@ -92,7 +92,6 @@ module GObject
92
92
  attach_function :g_object_unref, [:pointer], :pointer
93
93
 
94
94
  attach_function :g_value_copy, [:pointer, :pointer], :void
95
- attach_function :g_value_init, [:pointer, :size_t], :pointer
96
95
  attach_function :g_value_unset, [:pointer], :pointer
97
96
 
98
97
  attach_function :g_signal_connect_data,
@@ -106,7 +105,5 @@ module GObject
106
105
 
107
106
  attach_function :g_param_spec_ref, [:pointer], :pointer
108
107
  attach_function :g_param_spec_sink, [:pointer], :pointer
109
-
110
- attach_function :g_type_class_ref, [:size_t], :pointer
111
108
  end
112
109
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/property_not_found_error'
3
+ require "gir_ffi/property_not_found_error"
4
4
 
5
5
  GObject.load_class :Object
6
6
 
@@ -44,7 +44,7 @@ module GObject
44
44
  obj
45
45
  end
46
46
  else
47
- setup_method! 'new'
47
+ setup_method! "new"
48
48
 
49
49
  # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
50
50
  def initialize_with_automatic_gtype(properties = {})
@@ -74,11 +74,6 @@ module GObject
74
74
  self
75
75
  end
76
76
 
77
- def store_pointer(ptr)
78
- super
79
- ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)
80
- end
81
-
82
77
  def self.make_finalizer(ptr)
83
78
  proc do
84
79
  rc = GObject::Object::Struct.new(ptr)[:ref_count]
@@ -90,22 +85,6 @@ module GObject
90
85
  end
91
86
  end
92
87
 
93
- # TODO: Generate accessor methods from GIR at class definition time
94
- def method_missing(method, *args)
95
- getter_name = "get_#{method}"
96
- return send(getter_name, *args) if respond_to?(getter_name)
97
-
98
- if method.to_s =~ /(.*)=$/
99
- setter_name = "set_#{Regexp.last_match[1]}"
100
- return send(setter_name, *args) if respond_to?(setter_name)
101
- end
102
- super
103
- end
104
-
105
- def respond_to_missing?(*)
106
- false
107
- end
108
-
109
88
  def signal_connect(event, data = nil, &block)
110
89
  GObject.signal_connect(self, event, data, &block)
111
90
  end
@@ -114,44 +93,22 @@ module GObject
114
93
  GObject.signal_connect_after(self, event, data, &block)
115
94
  end
116
95
 
117
- setup_instance_method! 'get_property'
118
- setup_instance_method! 'set_property'
119
-
120
- def get_property_extended(property_name)
121
- value = get_property(property_name)
122
- type_info = get_property_type property_name
123
- property_value_post_conversion value, type_info
124
- end
96
+ setup_instance_method! "get_property"
97
+ setup_instance_method! "set_property"
98
+ setup_instance_method! "is_floating"
99
+ alias floating? is_floating
125
100
 
126
- def get_property_with_override(property_name)
127
- gvalue = gvalue_for_property property_name
128
- get_property_without_override property_name, gvalue
129
- gvalue.get_value
130
- end
101
+ private
131
102
 
132
- def set_property_extended(property_name, value)
133
- type_info = get_property_type property_name
134
- adjusted_value = property_value_pre_conversion(value, type_info)
135
- set_property property_name, adjusted_value
103
+ def store_pointer(ptr)
104
+ super
105
+ make_finalizer
136
106
  end
137
107
 
138
- def set_property_with_override(property_name, value)
139
- gvalue = gvalue_for_property(property_name)
140
- gvalue.set_value value
141
- set_property_without_override property_name, gvalue
108
+ def make_finalizer
109
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(struct.to_ptr)
142
110
  end
143
111
 
144
- alias get_property_without_override get_property
145
- alias get_property get_property_with_override
146
-
147
- alias set_property_without_override set_property
148
- alias set_property set_property_with_override
149
-
150
- setup_instance_method! 'is_floating'
151
- alias floating? is_floating
152
-
153
- private
154
-
155
112
  def names_and_gvalues_for_properties(properties)
156
113
  return [], [] unless properties.any?
157
114
 
@@ -164,19 +121,13 @@ module GObject
164
121
  end.transpose
165
122
  end
166
123
 
167
- def get_property_type(property_name)
168
- prop = self.class.find_property(property_name)
169
- prop.property_type
170
- end
171
-
172
124
  def gvalue_for_property(property_name)
173
125
  gtype = property_gtype property_name
174
126
  GObject::Value.for_gtype gtype
175
127
  end
176
128
 
177
129
  def property_gtype(property_name)
178
- pspec = property_param_spec(property_name)
179
- pspec.value_type
130
+ property_param_spec(property_name).value_type
180
131
  end
181
132
 
182
133
  def property_param_spec(property_name)
@@ -184,34 +135,78 @@ module GObject
184
135
  raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
185
136
  end
186
137
 
187
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
188
- def property_value_post_conversion(val, type_info)
189
- case type_info.flattened_tag
190
- when :ghash
191
- GLib::HashTable.from type_info.element_type, val
192
- when :glist
193
- GLib::List.from type_info.element_type, val
194
- when :callback
195
- GirFFI::Builder.build_class(type_info.interface).wrap val
196
- else
197
- val
138
+ # Overrides for GObject, GObject's generic base class.
139
+ module Overrides
140
+ # @deprecated
141
+ def get_property_extended(property_name)
142
+ get_property(property_name)
198
143
  end
199
- end
200
144
 
201
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
202
- def property_value_pre_conversion(val, type_info)
203
- case type_info.flattened_tag
204
- when :ghash
205
- GLib::HashTable.from type_info.element_type, val
206
- when :glist
207
- GLib::List.from type_info.element_type, val
208
- when :strv
209
- GLib::Strv.from val
210
- when :callback
211
- GirFFI::Builder.build_class(type_info.interface).from val
212
- else
213
- val
145
+ def get_property(property_name)
146
+ gvalue = gvalue_for_property property_name
147
+ super property_name, gvalue
148
+ value = gvalue.get_value
149
+
150
+ type_info = get_property_type property_name
151
+ value = property_value_post_conversion(value, type_info) if type_info
152
+
153
+ value
154
+ end
155
+
156
+ # @deprecated
157
+ def set_property_extended(property_name, value)
158
+ set_property property_name, value
159
+ end
160
+
161
+ def set_property(property_name, value)
162
+ type_info = get_property_type property_name
163
+ value = property_value_pre_conversion(value, type_info) if type_info
164
+
165
+ gvalue = gvalue_for_property(property_name)
166
+ gvalue.set_value value
167
+
168
+ super property_name, gvalue
169
+ end
170
+
171
+ private
172
+
173
+ def get_property_type(property_name)
174
+ self.class.find_property(property_name)&.property_type
175
+ end
176
+
177
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
178
+ def property_value_post_conversion(val, type_info)
179
+ case type_info.flattened_tag
180
+ when :ghash
181
+ GLib::HashTable.from type_info.element_type, val
182
+ when :glist
183
+ GLib::List.from type_info.element_type, val
184
+ when :callback
185
+ GirFFI::Builder.build_class(type_info.interface).wrap val
186
+ else
187
+ val
188
+ end
189
+ end
190
+
191
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
192
+ def property_value_pre_conversion(val, type_info)
193
+ case type_info.flattened_tag
194
+ when :ghash
195
+ GLib::HashTable.from type_info.element_type, val
196
+ when :glist
197
+ GLib::List.from type_info.element_type, val
198
+ when :strv
199
+ GLib::Strv.from val
200
+ when :byte_array
201
+ GLib::ByteArray.from val
202
+ when :callback
203
+ GirFFI::Builder.build_class(type_info.interface).from val
204
+ else
205
+ val
206
+ end
214
207
  end
215
208
  end
209
+
210
+ prepend Overrides
216
211
  end
217
212
  end