gir_ffi 0.15.1 → 0.15.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +42 -0
  3. data/README.md +10 -10
  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 +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/container_class_methods.rb +1 -3
  10. data/lib/ffi-glib/destroy_notify.rb +2 -2
  11. data/lib/ffi-glib/hash_table.rb +1 -2
  12. data/lib/ffi-glib/list.rb +11 -5
  13. data/lib/ffi-glib/list_methods.rb +12 -0
  14. data/lib/ffi-glib/s_list.rb +10 -4
  15. data/lib/ffi-gobject.rb +2 -5
  16. data/lib/ffi-gobject/object.rb +102 -92
  17. data/lib/ffi-gobject/object_class.rb +1 -1
  18. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  19. data/lib/ffi-gobject/value.rb +108 -117
  20. data/lib/ffi-gobject_introspection/i_base_info.rb +35 -27
  21. data/lib/ffi-gobject_introspection/lib.rb +1 -1
  22. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  23. data/lib/gir_ffi/array_element_convertor.rb +2 -3
  24. data/lib/gir_ffi/boxed_base.rb +13 -11
  25. data/lib/gir_ffi/builder.rb +3 -4
  26. data/lib/gir_ffi/builder_helper.rb +10 -2
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  28. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  29. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +25 -11
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  33. data/lib/gir_ffi/builders/enum_builder.rb +9 -5
  34. data/lib/gir_ffi/builders/field_builder.rb +2 -1
  35. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  36. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  37. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  38. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  39. data/lib/gir_ffi/builders/method_template.rb +4 -4
  40. data/lib/gir_ffi/builders/module_builder.rb +4 -2
  41. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  42. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  43. data/lib/gir_ffi/builders/object_builder.rb +18 -6
  44. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  45. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  46. data/lib/gir_ffi/builders/struct_builder.rb +34 -7
  47. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  48. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  49. data/lib/gir_ffi/callback_base.rb +7 -8
  50. data/lib/gir_ffi/class_base.rb +1 -0
  51. data/lib/gir_ffi/core.rb +17 -2
  52. data/lib/gir_ffi/glib_error.rb +1 -2
  53. data/lib/gir_ffi/in_pointer.rb +7 -0
  54. data/lib/gir_ffi/object_base.rb +27 -0
  55. data/lib/gir_ffi/return_value_info.rb +1 -2
  56. data/lib/gir_ffi/struct_base.rb +1 -9
  57. data/lib/gir_ffi/struct_like_base.rb +9 -5
  58. data/lib/gir_ffi/type_map.rb +1 -0
  59. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  60. data/lib/gir_ffi/union_base.rb +1 -9
  61. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  62. data/lib/gir_ffi/version.rb +1 -1
  63. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  64. metadata +106 -143
  65. data/Gemfile +0 -14
  66. data/Rakefile +0 -9
  67. data/tasks/test.rake +0 -204
  68. data/test/base_test_helper.rb +0 -70
  69. data/test/ffi-glib/array_test.rb +0 -203
  70. data/test/ffi-glib/byte_array_test.rb +0 -28
  71. data/test/ffi-glib/bytes_test.rb +0 -61
  72. data/test/ffi-glib/closure_test.rb +0 -38
  73. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  74. data/test/ffi-glib/hash_table_test.rb +0 -68
  75. data/test/ffi-glib/list_test.rb +0 -86
  76. data/test/ffi-glib/main_loop_test.rb +0 -53
  77. data/test/ffi-glib/ptr_array_test.rb +0 -112
  78. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  79. data/test/ffi-glib/s_list_test.rb +0 -76
  80. data/test/ffi-glib/strv_test.rb +0 -60
  81. data/test/ffi-glib/variant_test.rb +0 -12
  82. data/test/ffi-gobject/gobject_test.rb +0 -76
  83. data/test/ffi-gobject/object_class_test.rb +0 -31
  84. data/test/ffi-gobject/object_test.rb +0 -122
  85. data/test/ffi-gobject/param_spec_test.rb +0 -32
  86. data/test/ffi-gobject/value_test.rb +0 -390
  87. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  88. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  89. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  90. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  91. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  92. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  93. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  94. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  95. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  96. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  97. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  98. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  99. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  100. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  101. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  102. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  103. data/test/ffi-gobject_test.rb +0 -151
  104. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  105. data/test/gir_ffi/arg_helper_test.rb +0 -139
  106. data/test/gir_ffi/boolean_test.rb +0 -43
  107. data/test/gir_ffi/boxed_base_test.rb +0 -65
  108. data/test/gir_ffi/builder_test.rb +0 -322
  109. data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
  110. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  111. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
  112. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  113. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
  114. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  115. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  116. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  117. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  118. data/test/gir_ffi/builders/function_builder_test.rb +0 -550
  119. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  120. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  121. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  122. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  123. data/test/gir_ffi/builders/property_builder_test.rb +0 -158
  124. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  125. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
  126. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
  127. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  128. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  129. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  130. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  131. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  132. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  133. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
  134. data/test/gir_ffi/callback_base_test.rb +0 -22
  135. data/test/gir_ffi/class_base_test.rb +0 -166
  136. data/test/gir_ffi/core_test.rb +0 -98
  137. data/test/gir_ffi/enum_base_test.rb +0 -43
  138. data/test/gir_ffi/error_type_info_test.rb +0 -50
  139. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  140. data/test/gir_ffi/g_type_test.rb +0 -31
  141. data/test/gir_ffi/in_pointer_test.rb +0 -203
  142. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  144. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  145. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  146. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  147. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
  148. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  149. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  150. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  151. data/test/gir_ffi/interface_base_test.rb +0 -20
  152. data/test/gir_ffi/method_stubber_test.rb +0 -65
  153. data/test/gir_ffi/object_base_test.rb +0 -64
  154. data/test/gir_ffi/object_store_test.rb +0 -41
  155. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  156. data/test/gir_ffi/sized_array_test.rb +0 -206
  157. data/test/gir_ffi/struct_base_test.rb +0 -23
  158. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  159. data/test/gir_ffi/type_map_test.rb +0 -17
  160. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  161. data/test/gir_ffi/union_base_test.rb +0 -23
  162. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  163. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  164. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  165. data/test/gir_ffi/version_test.rb +0 -9
  166. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  167. data/test/gir_ffi_test_helper.rb +0 -84
  168. data/test/integration/callback_exceptions_test.rb +0 -59
  169. data/test/integration/derived_classes_test.rb +0 -53
  170. data/test/integration/generated_everything_test.rb +0 -452
  171. data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
  172. data/test/integration/generated_gio_test.rb +0 -116
  173. data/test/integration/generated_glib_test.rb +0 -10
  174. data/test/integration/generated_gobject_test.rb +0 -124
  175. data/test/integration/generated_gst_test.rb +0 -38
  176. data/test/integration/generated_gtk_source_test.rb +0 -32
  177. data/test/integration/generated_gtop_test.rb +0 -22
  178. data/test/integration/generated_pango_ft2_test.rb +0 -17
  179. data/test/integration/generated_pango_test.rb +0 -24
  180. data/test/integration/generated_regress_test.rb +0 -4038
  181. data/test/integration/generated_secret_test.rb +0 -14
  182. data/test/integration/generated_utility_test.rb +0 -174
  183. data/test/integration/generated_warnlib_test.rb +0 -43
  184. data/test/integration/method_lookup_test.rb +0 -34
  185. data/test/introspection_test_helper.rb +0 -93
  186. data/test/lib/Makefile.am +0 -110
  187. data/test/lib/autogen.sh +0 -4
  188. data/test/lib/configure.ac +0 -34
  189. data/test/lib/m4/jhflags.m4 +0 -21
  190. data/test/minitest/stats_plugin.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fe7307d0aeb897a34c52b3f39d9ad074ea90094e9f0d10efb1a0cc94275d433
4
- data.tar.gz: 3fe78f8c5332d10b9124ee1ab5a6f316e24f9e8b96e8f1450110e1e7e53feaa3
3
+ metadata.gz: 666da2b23f02fadc3172e473ea267f3d81280e6377943426c8f89e7258391ed4
4
+ data.tar.gz: f19dd857e24269b43109ea8ffa407de64d47531acf00f1104971db171c64bcf6
5
5
  SHA512:
6
- metadata.gz: b98e88240766bff193e05eb33ad47d585968b7d1d1a276f9703ec18a264ef7db083dea3b98f5923284c8a48d196498daaef04c06e63840b225692329730b04d2
7
- data.tar.gz: 7a6818654b514e14dd7c8a7920446fdceb8471a271bf9184a975e4c6b80d6b6f56bf0596855d4eba0febaf2616eb2422ac43bd4456c1a9263f8cf42f22e25242
6
+ metadata.gz: 4f711ebd41bfedb31e496268b125bf3079f373582b5ac0acbe25938701ceeb42ec98cdbe118a735119f6fafc43357b5d0ba2e52ed8e957e65090669d18d2f692
7
+ data.tar.gz: e415f33719d96705bfba9e6181123facec99131685613ee8cb753178c9ce3af655e6978e55e55b3435e71c12c744a94200468df9b606bb27f1feac67990cf3a0
@@ -1,5 +1,47 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.6 / 2021-01-10
4
+
5
+ * Officially support Ruby 3.0
6
+ * Rely on `GObject.boxed_free` to free GValue objects
7
+ * Require 'set' in `callback_base.rb`, which needs it (thanks, Jordan Webb!)
8
+ * Make SizedArray handle `:filename` elements
9
+
10
+ ## 0.15.5 / 2020-11-13
11
+
12
+ * Make building and finding metaclasses via `Builder.build_class` work again
13
+
14
+ ## 0.15.4 / 2020-11-01
15
+
16
+ * Support disguised object class structs
17
+ * Handle the case where vfunc object arguments are null
18
+ * Bail out earlier when trying to register non-GObject class
19
+ * Small improvements
20
+ * Use `Module#prepend` for overrides
21
+ * Clean up initialization of structs, unions, and boxed types
22
+ * Make `GObject::Object#store_pointer` private like in the superclass
23
+ * Handle creating SizedArray of uint8 from a string
24
+ * Improve derived class setup
25
+ * Improve List and SList methods
26
+ * Make `ByteArray#append` return self
27
+ * Improve packaging infrastructure (thanks, utkarsh2102!)
28
+
29
+ ## 0.15.3 / 2020-06-14
30
+
31
+ * Officially support Ruby 2.7
32
+ * Officially drop support for Ruby 2.4
33
+ * Store classes representing inline callback types in the class that defines
34
+ them instead of in the main namespace, thus avoiding some potential name
35
+ clashes
36
+ * Update development dependencies
37
+ * Various code quality improvements
38
+ * Record approved licenses for dependencies
39
+
40
+ ## 0.15.2 / 2019-11-29
41
+
42
+ * Load girepository-1.0 library in a way that does not require installing a
43
+ development package.
44
+
3
45
  ## 0.15.1 / 2019-10-20
4
46
 
5
47
  * Allow access to properties for unintrospectable classes.
data/README.md CHANGED
@@ -12,7 +12,6 @@ Ruby bindings for GNOME using the GObject Introspection Repository.
12
12
  [![Depfu](https://badges.depfu.com/badges/d5a8e9bffd2462a7ab4921d2f7e6fc48/overview.svg)](https://depfu.com/github/mvz/gir_ffi)
13
13
  [![Build Status](https://travis-ci.org/mvz/gir_ffi.svg?branch=master)](https://travis-ci.org/mvz/gir_ffi)
14
14
  [![Code Climate](https://codeclimate.com/github/mvz/gir_ffi/badges/gpa.svg)](https://codeclimate.com/github/mvz/gir_ffi)
15
- [![Coverage Status](https://coveralls.io/repos/github/mvz/gir_ffi/badge.svg?branch=master)](https://coveralls.io/github/mvz/gir_ffi?branch=master)
16
15
  [![Documentation Status](https://inch-ci.org/github/mvz/gir_ffi.svg?branch=master)](https://inch-ci.org/github/mvz/gir_ffi/branch/master)
17
16
 
18
17
  ## Features
@@ -53,7 +52,7 @@ examples can be found in `gir_ffi-gtk` and `gir_ffi-gst`.
53
52
 
54
53
  ## Requirements
55
54
 
56
- GirFFI is supported on CRuby 2.4, 2.5 and 2.6, and JRuby 9.2.
55
+ GirFFI is supported on CRuby 2.5, 2.6, 2.7 and 3.0, and JRuby 9.2.
57
56
 
58
57
  You will also need gobject-introspection installed with some
59
58
  introspection data.
@@ -65,15 +64,16 @@ libraries.
65
64
 
66
65
  GirFFI should work with gobject-introspection 1.46.0 and up.
67
66
 
68
- On Debian and Ubuntu, installing `libgirepository1.0-1` and `gir1.2-glib-2.0`
67
+ On Debian and Ubuntu, installing `libgirepository-1.0-1` and `gir1.2-glib-2.0`
69
68
  should be enough to use GirFFI in your application.
70
69
 
71
70
  To run the tests, you should additionally install `libgirepository1.0-dev`,
72
- `libcairo2-dev`, `gobject-introspection`, `gir1.2-gtop-2.0`, `gir1.2-gtk-3.0`,
73
- `gir1.2-gtksource-3.0`, `gir1.2-pango-1.0`, `gir1.2-secret-1` and
71
+ `gobject-introspection`, `libcairo2-dev`, `gir1.2-gtop-2.0`, `gir1.2-gtk-3.0`,
72
+ `gir1.2-pango-1.0`, `gir1.2-gtksource-3.0`, `gir1.2-secret-1` and
74
73
  `gir1.2-gstreamer-1.0`. This should be enough to get `rake test` working.
75
74
 
76
- GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV.
75
+ GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV. Pull
76
+ requests to support these platforms are welcome.
77
77
 
78
78
  ## Overrides
79
79
 
@@ -96,9 +96,9 @@ Please feel free to file bugs or send pull requests!
96
96
  If you just want to help out but don't know where to start, have a look at
97
97
  TODO.md, and check the notes in the code (e.g., using `dnote`).
98
98
 
99
- If you want to send pull requests or patches, please try to follow these
100
- instructions. If you get stuck, make a pull request anyway and I'll try to help
101
- out.
99
+ If you want to send pull requests or patches, try to follow the instructions
100
+ below. **If you get stuck, please make a pull request anyway and I'll try to
101
+ help out.**
102
102
 
103
103
  * Make sure `rake test` runs without reporting any failures.
104
104
  * Add tests for your feature. Otherwise, I can't see if it works or if I
@@ -119,7 +119,7 @@ The following people have contributed to GirFFI over the years:
119
119
 
120
120
  ## License
121
121
 
122
- Copyright © 2009–2018 [Matijs van Zuijlen](http://www.matijs.net)
122
+ Copyright © 2009–2020 [Matijs van Zuijlen](http://www.matijs.net)
123
123
 
124
124
  GirFFI is free software, distributed under the terms of the GNU Lesser
125
125
  General Public License, version 2.1 or later. See the file COPYING.LIB for
data/TODO.md CHANGED
@@ -26,57 +26,36 @@ These in the order they occured to me, and may therefore be fixed in any order.
26
26
 
27
27
  ## Derived types
28
28
 
29
- Derived classes can now be registered with GObject, but the way to do this is
30
- not very nice:
29
+ Derived classes are now registered like so:
31
30
 
32
31
  class Derived < Base
33
- end
32
+ install_property GObject.param_spec_int("foo", "foo bar",
33
+ "The Foo Bar Property",
34
+ 10, 20, 15, 3)
34
35
 
35
- GirFFI.define_type Derived do |info|
36
- info.install_property GObject.param_spec_int("foo", "foo bar",
37
- "The Foo Bar Property",
38
- 10, 20, 15, 3)
39
36
  # assume Base defines a virtual function called 'some_vfunc'
40
- info.install_vfunc_implementation :some_vfunc, proc {|obj|
41
- #implementation goes here
37
+ install_vfunc_implementation :some_vfunc, proc {|obj|
38
+ # implementation goes here
42
39
  }
43
- end
44
40
 
45
- or
46
-
47
- class Derived < Base
48
- def some_vfunc
49
- #implementation goes here
41
+ def other_vfunc
42
+ # implementation
50
43
  end
51
- end
52
44
 
53
- GirFFI.define_type Derived do |info|
54
- info.install_property GObject.param_spec_int("foo", "foo bar",
55
- "The Foo Bar Property",
56
- 10, 20, 15, 3)
57
- info.install_vfunc_implementation :some_vfunc
45
+ # assume Base defines a virtual function called 'other_vfunc'
46
+ install_vfunc_implementation :other_vfunc
58
47
  end
59
48
 
49
+ GirFFI.define_type Derived
50
+
51
+ Potential improvements:
60
52
 
61
- It would be good to replace this with something that's easier to use:
53
+ * Allow `define_type` to be called in the class definition
62
54
  * Perhaps auto-register types, like Gtk# does
63
55
  * Perhaps automagically find vfunc implementations, like PyGObject and
64
56
  Ruby-GNOME do
65
57
  * What about properties?
66
58
 
67
- How about:
68
-
69
- class Derived < Base
70
- include SomeGObjectInterface
71
-
72
- register_type 'Derived'
73
-
74
- install_property ...
75
- install_vfunc_implementation ...
76
- end
77
-
78
- This needs issue #63 to be resolved.
79
-
80
59
  NOTE: When adding an interface module to a derived class, its prerequisites
81
60
  should be checked.
82
61
 
@@ -0,0 +1,6 @@
1
+ # Documentation
2
+
3
+ See [the README](../README.md) for basic usage.
4
+
5
+ See [Subclassing](Subclassing.md) for details on creating your own subclasses
6
+ of GObject classes.
@@ -0,0 +1,38 @@
1
+ # Subclassing
2
+
3
+ Creating a Ruby subclass of one of the GObject classes requires following some rules.
4
+
5
+ First of all, if you override the initializer, you **must** call `super`
6
+ otherwise, the underlying GObject pointer will not be created and stored.
7
+
8
+ Second, GObject objects often have several constructors. GirFFI creates a
9
+ separate initializer for each constructor. This allows customization of the
10
+ call to super for each initializer. This means you will have to override each
11
+ initializer separately, as needed.
12
+
13
+ As an example, here is a subclass of `Regress::TestSubObj`, a class from
14
+ GObjectIntrospection's test suite, adding an extra argument to some of its
15
+ constructors.
16
+
17
+ ```
18
+ class MyObj < Regress::TestSubObj
19
+ attr_reader :animal
20
+
21
+ def initialize animal
22
+ super()
23
+ @animal = animal
24
+ end
25
+
26
+ def initialize_from_file animal, file
27
+ super(file)
28
+ @animal = animal
29
+ end
30
+ end
31
+
32
+ o1 = MyObj.new 'dog'
33
+ o1.foo # => 'dog'
34
+ o2 = MyObj.constructor
35
+ o2.foo # => nil
36
+ o3 = MyObj.new_from_file 'cat', 'my_file.txt'
37
+ o3.foo # => 'cat'
38
+ ```
@@ -5,7 +5,8 @@ raise "The module GLib was already defined elsewhere" if Kernel.const_defined? :
5
5
 
6
6
  require "gir_ffi/core"
7
7
 
8
- # Bypass check for existing modules
8
+ # Set up the GLib module, bypassing the check for existing modules. This also
9
+ # creates GLib::Lib.
9
10
  GirFFI::Builders::ModuleBuilder.new("GLib").generate
10
11
 
11
12
  require "ffi-glib/array"
@@ -28,12 +29,16 @@ module GLib
28
29
  load_class :EqualFunc
29
30
  load_class :Func
30
31
 
31
- # Module for attaching functions from the glib library.
32
- # NOTE: This module is defined by the call to GirFFI.setup above.
32
+ # Module for attaching functions from the glib library. This module is
33
+ # defined by the call to ModuleBuilder#generate above.
33
34
  module Lib
35
+ attach_function :g_slist_append, [:pointer, :pointer], :pointer
34
36
  attach_function :g_slist_prepend, [:pointer, :pointer], :pointer
37
+ attach_function :g_slist_reverse, [:pointer], :pointer
35
38
 
36
39
  attach_function :g_list_append, [:pointer, :pointer], :pointer
40
+ attach_function :g_list_prepend, [:pointer, :pointer], :pointer
41
+ attach_function :g_list_reverse, [:pointer], :pointer
37
42
 
38
43
  attach_function :g_hash_table_foreach, [:pointer, HFunc, :pointer], :void
39
44
  attach_function :g_hash_table_new, [HashFunc, EqualFunc], :pointer
@@ -12,7 +12,8 @@ module GLib
12
12
  def append(data)
13
13
  bytes = GirFFI::InPointer.from_utf8 data
14
14
  len = data.bytesize
15
- self.class.wrap Lib.g_byte_array_append(to_ptr, bytes, len)
15
+ Lib.g_byte_array_append(to_ptr, bytes, len)
16
+ self
16
17
  end
17
18
 
18
19
  def self.from(data)
@@ -11,9 +11,7 @@ module GLib
11
11
  nil
12
12
  when FFI::Pointer
13
13
  ptr
14
- when self
15
- ptr.to_ptr
16
- when GirFFI::BoxedBase
14
+ when self, GirFFI::BoxedBase
17
15
  ptr.to_ptr
18
16
  end
19
17
 
@@ -9,8 +9,8 @@ module GLib
9
9
  class DestroyNotify
10
10
  def self.default
11
11
  @default ||= from proc { |user_data|
12
- callback_key = GirFFI::ArgHelper::OBJECT_STORE.fetch(user_data)
13
- drop_callback callback_key
12
+ callback = GirFFI::ArgHelper::OBJECT_STORE.fetch(user_data)
13
+ drop_callback callback
14
14
  }
15
15
  end
16
16
  end
@@ -10,8 +10,7 @@ module GLib
10
10
  include Enumerable
11
11
  extend ContainerClassMethods
12
12
 
13
- attr_reader :key_type
14
- attr_reader :value_type
13
+ attr_reader :key_type, :value_type
15
14
 
16
15
  def initialize(key_type, value_type)
17
16
  @key_type = key_type
@@ -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
@@ -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
@@ -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
@@ -63,7 +63,7 @@ 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
+ block or raise ArgumentError, "Block needed"
67
67
 
68
68
  signal_name, = detailed_signal.split("::")
69
69
  sig_info = object.class.find_signal signal_name
@@ -86,13 +86,12 @@ module GObject
86
86
  load_class :ParamFlags
87
87
 
88
88
  # NOTE: This Lib module is set up in `gir_ffi-base/gobject/lib.rb`.
89
- module Lib
89
+ Lib.class_eval do
90
90
  attach_function :g_object_ref_sink, [:pointer], :pointer
91
91
  attach_function :g_object_ref, [:pointer], :pointer
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
@@ -7,7 +7,25 @@ GObject.load_class :Object
7
7
  module GObject
8
8
  # Overrides for GObject, GObject's generic base class.
9
9
  class Object
10
- if !GLib.check_version(2, 54, 0)
10
+ if GLib.check_version(2, 54, 0)
11
+ setup_method! "new"
12
+
13
+ # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
14
+ def initialize_with_automatic_gtype(properties = {})
15
+ gparameters = properties.map do |name, value|
16
+ name = name.to_s
17
+ property_param_spec(name)
18
+ GObject::Parameter.new.tap do |gparam|
19
+ gparam.name = name
20
+ gparam.value = value
21
+ end
22
+ end
23
+ initialize_without_automatic_gtype(self.class.gtype, gparameters)
24
+ end
25
+
26
+ alias initialize_without_automatic_gtype initialize
27
+ alias initialize initialize_with_automatic_gtype
28
+ else
11
29
  GObject::Lib.attach_function(:g_object_new_with_properties,
12
30
  [:size_t, :uint32, :pointer, :pointer],
13
31
  :pointer)
@@ -43,24 +61,6 @@ module GObject
43
61
  obj.__send__ :initialize, *args, &block
44
62
  obj
45
63
  end
46
- else
47
- setup_method! "new"
48
-
49
- # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
50
- def initialize_with_automatic_gtype(properties = {})
51
- gparameters = properties.map do |name, value|
52
- name = name.to_s
53
- property_param_spec(name)
54
- GObject::Parameter.new.tap do |gparam|
55
- gparam.name = name
56
- gparam.value = value
57
- end
58
- end
59
- initialize_without_automatic_gtype(self.class.gtype, gparameters)
60
- end
61
-
62
- alias initialize_without_automatic_gtype initialize
63
- alias initialize initialize_with_automatic_gtype
64
64
  end
65
65
 
66
66
  alias base_initialize initialize
@@ -74,13 +74,14 @@ 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)
77
+ def self.make_finalizer(ptr)
78
+ proc { finalize ptr }
80
79
  end
81
80
 
82
- def self.make_finalizer(ptr)
83
- proc do
81
+ class << self
82
+ protected
83
+
84
+ def finalize(ptr)
84
85
  rc = GObject::Object::Struct.new(ptr)[:ref_count]
85
86
  if rc == 0
86
87
  warn "not unreffing #{name}:#{ptr} (#{rc})"
@@ -100,49 +101,20 @@ module GObject
100
101
 
101
102
  setup_instance_method! "get_property"
102
103
  setup_instance_method! "set_property"
104
+ setup_instance_method! "is_floating"
105
+ alias floating? is_floating
103
106
 
104
- # @deprecated
105
- def get_property_extended(property_name)
106
- get_property(property_name)
107
- end
108
-
109
- def get_property_with_override(property_name)
110
- gvalue = gvalue_for_property property_name
111
- get_property_without_override property_name, gvalue
112
- value = gvalue.get_value
113
-
114
- type_info = get_property_type property_name
115
- value = property_value_post_conversion(value, type_info) if type_info
116
-
117
- value
118
- end
107
+ private
119
108
 
120
- # @deprecated
121
- def set_property_extended(property_name, value)
122
- set_property property_name, value
109
+ def store_pointer(ptr)
110
+ super
111
+ make_finalizer
123
112
  end
124
113
 
125
- def set_property_with_override(property_name, value)
126
- type_info = get_property_type property_name
127
- value = property_value_pre_conversion(value, type_info) if type_info
128
-
129
- gvalue = gvalue_for_property(property_name)
130
- gvalue.set_value value
131
-
132
- set_property_without_override property_name, gvalue
114
+ def make_finalizer
115
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(struct.to_ptr)
133
116
  end
134
117
 
135
- alias get_property_without_override get_property
136
- alias get_property get_property_with_override
137
-
138
- alias set_property_without_override set_property
139
- alias set_property set_property_with_override
140
-
141
- setup_instance_method! "is_floating"
142
- alias floating? is_floating
143
-
144
- private
145
-
146
118
  def names_and_gvalues_for_properties(properties)
147
119
  return [], [] unless properties.any?
148
120
 
@@ -155,10 +127,6 @@ module GObject
155
127
  end.transpose
156
128
  end
157
129
 
158
- def get_property_type(property_name)
159
- self.class.find_property(property_name)&.property_type
160
- end
161
-
162
130
  def gvalue_for_property(property_name)
163
131
  gtype = property_gtype property_name
164
132
  GObject::Value.for_gtype gtype
@@ -173,36 +141,78 @@ module GObject
173
141
  raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
174
142
  end
175
143
 
176
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
177
- def property_value_post_conversion(val, type_info)
178
- case type_info.flattened_tag
179
- when :ghash
180
- GLib::HashTable.from type_info.element_type, val
181
- when :glist
182
- GLib::List.from type_info.element_type, val
183
- when :callback
184
- GirFFI::Builder.build_class(type_info.interface).wrap val
185
- else
186
- val
144
+ # Overrides for GObject, GObject's generic base class.
145
+ module Overrides
146
+ # @deprecated
147
+ def get_property_extended(property_name)
148
+ get_property(property_name)
187
149
  end
188
- end
189
150
 
190
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
191
- def property_value_pre_conversion(val, type_info)
192
- case type_info.flattened_tag
193
- when :ghash
194
- GLib::HashTable.from type_info.element_type, val
195
- when :glist
196
- GLib::List.from type_info.element_type, val
197
- when :strv
198
- GLib::Strv.from val
199
- when :byte_array
200
- GLib::ByteArray.from val
201
- when :callback
202
- GirFFI::Builder.build_class(type_info.interface).from val
203
- else
204
- val
151
+ def get_property(property_name)
152
+ gvalue = gvalue_for_property property_name
153
+ super property_name, gvalue
154
+ value = gvalue.get_value
155
+
156
+ type_info = get_property_type property_name
157
+ value = property_value_post_conversion(value, type_info) if type_info
158
+
159
+ value
160
+ end
161
+
162
+ # @deprecated
163
+ def set_property_extended(property_name, value)
164
+ set_property property_name, value
165
+ end
166
+
167
+ def set_property(property_name, value)
168
+ type_info = get_property_type property_name
169
+ value = property_value_pre_conversion(value, type_info) if type_info
170
+
171
+ gvalue = gvalue_for_property(property_name)
172
+ gvalue.set_value value
173
+
174
+ super property_name, gvalue
175
+ end
176
+
177
+ private
178
+
179
+ def get_property_type(property_name)
180
+ self.class.find_property(property_name)&.property_type
181
+ end
182
+
183
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
184
+ def property_value_post_conversion(val, type_info)
185
+ case type_info.flattened_tag
186
+ when :ghash
187
+ GLib::HashTable.from type_info.element_type, val
188
+ when :glist
189
+ GLib::List.from type_info.element_type, val
190
+ when :callback
191
+ GirFFI::Builder.build_class(type_info.interface).wrap val
192
+ else
193
+ val
194
+ end
195
+ end
196
+
197
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
198
+ def property_value_pre_conversion(val, type_info)
199
+ case type_info.flattened_tag
200
+ when :ghash
201
+ GLib::HashTable.from type_info.element_type, val
202
+ when :glist
203
+ GLib::List.from type_info.element_type, val
204
+ when :strv
205
+ GLib::Strv.from val
206
+ when :byte_array
207
+ GLib::ByteArray.from val
208
+ when :callback
209
+ GirFFI::Builder.build_class(type_info.interface).from val
210
+ else
211
+ val
212
+ end
205
213
  end
206
214
  end
215
+
216
+ prepend Overrides
207
217
  end
208
218
  end