gir_ffi 0.14.1 → 0.15.4

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 (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