gir_ffi 0.15.3 → 0.15.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +15 -0
  3. data/README.md +5 -6
  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/destroy_notify.rb +2 -2
  10. data/lib/ffi-glib/hash_table.rb +1 -2
  11. data/lib/ffi-glib/list.rb +11 -5
  12. data/lib/ffi-glib/list_methods.rb +12 -0
  13. data/lib/ffi-glib/s_list.rb +10 -4
  14. data/lib/ffi-gobject.rb +0 -3
  15. data/lib/ffi-gobject/object.rb +77 -73
  16. data/lib/ffi-gobject/object_class.rb +1 -1
  17. data/lib/ffi-gobject/value.rb +107 -108
  18. data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
  19. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  20. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  21. data/lib/gir_ffi/boxed_base.rb +1 -5
  22. data/lib/gir_ffi/builder.rb +1 -1
  23. data/lib/gir_ffi/builder_helper.rb +7 -4
  24. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  25. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  28. data/lib/gir_ffi/builders/callback_builder.rb +14 -12
  29. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  30. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  31. data/lib/gir_ffi/builders/enum_builder.rb +3 -3
  32. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  33. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  34. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  35. data/lib/gir_ffi/builders/method_template.rb +4 -4
  36. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  37. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  38. data/lib/gir_ffi/builders/object_builder.rb +16 -6
  39. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  40. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  41. data/lib/gir_ffi/builders/struct_builder.rb +5 -5
  42. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  43. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  44. data/lib/gir_ffi/callback_base.rb +3 -3
  45. data/lib/gir_ffi/core.rb +17 -2
  46. data/lib/gir_ffi/glib_error.rb +1 -2
  47. data/lib/gir_ffi/in_pointer.rb +7 -0
  48. data/lib/gir_ffi/object_base.rb +27 -0
  49. data/lib/gir_ffi/return_value_info.rb +1 -2
  50. data/lib/gir_ffi/struct_base.rb +1 -9
  51. data/lib/gir_ffi/struct_like_base.rb +9 -5
  52. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  53. data/lib/gir_ffi/union_base.rb +1 -9
  54. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  55. data/lib/gir_ffi/version.rb +1 -1
  56. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  57. metadata +86 -136
  58. data/Gemfile +0 -14
  59. data/Rakefile +0 -9
  60. data/tasks/test.rake +0 -204
  61. data/test/base_test_helper.rb +0 -70
  62. data/test/ffi-glib/array_test.rb +0 -203
  63. data/test/ffi-glib/byte_array_test.rb +0 -28
  64. data/test/ffi-glib/bytes_test.rb +0 -61
  65. data/test/ffi-glib/closure_test.rb +0 -38
  66. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  67. data/test/ffi-glib/hash_table_test.rb +0 -68
  68. data/test/ffi-glib/list_test.rb +0 -86
  69. data/test/ffi-glib/main_loop_test.rb +0 -53
  70. data/test/ffi-glib/ptr_array_test.rb +0 -112
  71. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  72. data/test/ffi-glib/s_list_test.rb +0 -76
  73. data/test/ffi-glib/strv_test.rb +0 -60
  74. data/test/ffi-glib/variant_test.rb +0 -12
  75. data/test/ffi-gobject/gobject_test.rb +0 -76
  76. data/test/ffi-gobject/object_class_test.rb +0 -31
  77. data/test/ffi-gobject/object_test.rb +0 -123
  78. data/test/ffi-gobject/param_spec_test.rb +0 -32
  79. data/test/ffi-gobject/value_test.rb +0 -390
  80. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  81. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  82. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  83. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  84. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  85. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  86. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  87. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  88. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  89. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  90. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  91. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  92. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  93. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  94. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  95. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  96. data/test/ffi-gobject_test.rb +0 -153
  97. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  98. data/test/gir_ffi/arg_helper_test.rb +0 -146
  99. data/test/gir_ffi/boolean_test.rb +0 -43
  100. data/test/gir_ffi/boxed_base_test.rb +0 -65
  101. data/test/gir_ffi/builder_test.rb +0 -168
  102. data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
  103. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  104. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
  105. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  106. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
  107. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  108. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
  109. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  110. data/test/gir_ffi/builders/field_builder_test.rb +0 -140
  111. data/test/gir_ffi/builders/function_builder_test.rb +0 -570
  112. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
  113. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  114. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  115. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  116. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  117. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  118. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
  119. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
  120. data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
  121. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  122. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  123. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  124. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
  125. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
  126. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
  127. data/test/gir_ffi/callback_base_test.rb +0 -22
  128. data/test/gir_ffi/class_base_test.rb +0 -171
  129. data/test/gir_ffi/core_test.rb +0 -99
  130. data/test/gir_ffi/enum_base_test.rb +0 -43
  131. data/test/gir_ffi/error_type_info_test.rb +0 -50
  132. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
  133. data/test/gir_ffi/g_type_test.rb +0 -31
  134. data/test/gir_ffi/in_pointer_test.rb +0 -203
  135. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  136. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
  137. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  138. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  139. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  140. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
  141. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  142. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  144. data/test/gir_ffi/interface_base_test.rb +0 -20
  145. data/test/gir_ffi/method_stubber_test.rb +0 -67
  146. data/test/gir_ffi/object_base_test.rb +0 -64
  147. data/test/gir_ffi/object_store_test.rb +0 -41
  148. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  149. data/test/gir_ffi/sized_array_test.rb +0 -206
  150. data/test/gir_ffi/struct_base_test.rb +0 -23
  151. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  152. data/test/gir_ffi/type_map_test.rb +0 -17
  153. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  154. data/test/gir_ffi/union_base_test.rb +0 -23
  155. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  156. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  157. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  158. data/test/gir_ffi/version_test.rb +0 -9
  159. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  160. data/test/gir_ffi_test_helper.rb +0 -84
  161. data/test/integration/callback_exceptions_test.rb +0 -59
  162. data/test/integration/derived_classes_test.rb +0 -54
  163. data/test/integration/generated_everything_test.rb +0 -453
  164. data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
  165. data/test/integration/generated_gio_test.rb +0 -116
  166. data/test/integration/generated_glib_test.rb +0 -10
  167. data/test/integration/generated_gobject_test.rb +0 -124
  168. data/test/integration/generated_gst_test.rb +0 -38
  169. data/test/integration/generated_gtk_source_test.rb +0 -21
  170. data/test/integration/generated_gtop_test.rb +0 -22
  171. data/test/integration/generated_pango_ft2_test.rb +0 -17
  172. data/test/integration/generated_pango_test.rb +0 -24
  173. data/test/integration/generated_regress_test.rb +0 -4076
  174. data/test/integration/generated_secret_test.rb +0 -14
  175. data/test/integration/generated_utility_test.rb +0 -174
  176. data/test/integration/generated_warnlib_test.rb +0 -45
  177. data/test/integration/method_lookup_test.rb +0 -34
  178. data/test/introspection_test_helper.rb +0 -94
  179. data/test/lib/Makefile.am +0 -110
  180. data/test/lib/autogen.sh +0 -4
  181. data/test/lib/configure.ac +0 -34
  182. data/test/lib/m4/jhflags.m4 +0 -21
  183. data/test/minitest/stats_plugin.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ee5f86f4d4106139b51edf6855aa3a84bff5437b728dac4c0b878a61bbf86ea
4
- data.tar.gz: de0aef98573ba69d41ffa094d08f576977928e6e55598586cf07c08c9c38da6f
3
+ metadata.gz: 1cd304c670b5b7b26e9bbaa939f2b5162ef3f92f7c0bd78d8e524b1586cbdb3b
4
+ data.tar.gz: ccf4916ed552cf23752fb6270a61cfffdea53269b7d4bdb0bb408f3e3de7ae59
5
5
  SHA512:
6
- metadata.gz: 57de8a0753d8add11635ca497712988aa16507312d719bdc6ed7c8f63a707275622b73c1d968e742d13ba96094fe253baf6d60076dd186683851479cffa8cbe2
7
- data.tar.gz: abc9d12f2590a325ab3d8deb087cc4dcf4f5e1eccf0a4dd2f74f48c50553c3b63c19cd799661830da3c13850d50b32cdcb6113ebfb0569b15e7875796a7287ed
6
+ metadata.gz: 59fa0cf7451808b87a1ff028c0b8309d7c46c2acbbc894c535db4e1b3f30be7d6ee9649472a6932dd1fea0747bda6f56ceb3c753c48370750966c06da509f5bf
7
+ data.tar.gz: e2bd4de38d2db08b17e20c1bc42556530b4b14312400d5b9e15dc201eaf1494606bfe56c7fcdf78d632d164f6b553e897f488d533d70ab6d35042e069e5c5f61
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.4 / 2020-11-01
4
+
5
+ * Support disguised object class structs
6
+ * Handle the case where vfunc object arguments are null
7
+ * Bail out earlier when trying to register non-GObject class
8
+ * Small improvements
9
+ * Use `Module#prepend` for overrides
10
+ * Clean up initialization of structs, unions, and boxed types
11
+ * Make `GObject::Object#store_pointer` private like in the superclass
12
+ * Handle creating SizedArray of uint8 from a string
13
+ * Improve derived class setup
14
+ * Improve List and SList methods
15
+ * Make `ByteArray#append` return self
16
+ * Improve packaging infrastructure (thanks, utkarsh2102!)
17
+
3
18
  ## 0.15.3 / 2020-06-14
4
19
 
5
20
  * Officially support Ruby 2.7
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 and 2.7, and JRuby 9.2.
57
56
 
58
57
  You will also need gobject-introspection installed with some
59
58
  introspection data.
@@ -65,12 +64,12 @@ 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
- `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
75
  GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV. Pull
@@ -120,7 +119,7 @@ The following people have contributed to GirFFI over the years:
120
119
 
121
120
  ## License
122
121
 
123
- Copyright © 2009–2019 [Matijs van Zuijlen](http://www.matijs.net)
122
+ Copyright © 2009–2020 [Matijs van Zuijlen](http://www.matijs.net)
124
123
 
125
124
  GirFFI is free software, distributed under the terms of the GNU Lesser
126
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)
@@ -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
@@ -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
@@ -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]
@@ -100,49 +95,20 @@ module GObject
100
95
 
101
96
  setup_instance_method! "get_property"
102
97
  setup_instance_method! "set_property"
98
+ setup_instance_method! "is_floating"
99
+ alias floating? is_floating
103
100
 
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
101
+ private
119
102
 
120
- # @deprecated
121
- def set_property_extended(property_name, value)
122
- set_property property_name, value
103
+ def store_pointer(ptr)
104
+ super
105
+ make_finalizer
123
106
  end
124
107
 
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
108
+ def make_finalizer
109
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(struct.to_ptr)
133
110
  end
134
111
 
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
112
  def names_and_gvalues_for_properties(properties)
147
113
  return [], [] unless properties.any?
148
114
 
@@ -155,10 +121,6 @@ module GObject
155
121
  end.transpose
156
122
  end
157
123
 
158
- def get_property_type(property_name)
159
- self.class.find_property(property_name)&.property_type
160
- end
161
-
162
124
  def gvalue_for_property(property_name)
163
125
  gtype = property_gtype property_name
164
126
  GObject::Value.for_gtype gtype
@@ -173,36 +135,78 @@ module GObject
173
135
  raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
174
136
  end
175
137
 
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
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)
143
+ end
144
+
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
187
154
  end
188
- end
189
155
 
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
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
205
207
  end
206
208
  end
209
+
210
+ prepend Overrides
207
211
  end
208
212
  end