gir_ffi 0.15.1 → 0.15.6
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.
- checksums.yaml +4 -4
- data/Changelog.md +42 -0
- data/README.md +10 -10
- data/TODO.md +14 -35
- data/docs/Documentation.md +6 -0
- data/docs/Subclassing.md +38 -0
- data/lib/ffi-glib.rb +8 -3
- data/lib/ffi-glib/byte_array.rb +2 -1
- data/lib/ffi-glib/container_class_methods.rb +1 -3
- data/lib/ffi-glib/destroy_notify.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +1 -2
- data/lib/ffi-glib/list.rb +11 -5
- data/lib/ffi-glib/list_methods.rb +12 -0
- data/lib/ffi-glib/s_list.rb +10 -4
- data/lib/ffi-gobject.rb +2 -5
- data/lib/ffi-gobject/object.rb +102 -92
- data/lib/ffi-gobject/object_class.rb +1 -1
- data/lib/ffi-gobject/ruby_closure.rb +1 -1
- data/lib/ffi-gobject/value.rb +108 -117
- data/lib/ffi-gobject_introspection/i_base_info.rb +35 -27
- data/lib/ffi-gobject_introspection/lib.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +4 -0
- data/lib/gir_ffi/array_element_convertor.rb +2 -3
- data/lib/gir_ffi/boxed_base.rb +13 -11
- data/lib/gir_ffi/builder.rb +3 -4
- data/lib/gir_ffi/builder_helper.rb +10 -2
- data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
- data/lib/gir_ffi/builders/callback_builder.rb +25 -11
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
- data/lib/gir_ffi/builders/enum_builder.rb +9 -5
- data/lib/gir_ffi/builders/field_builder.rb +2 -1
- data/lib/gir_ffi/builders/function_builder.rb +1 -1
- data/lib/gir_ffi/builders/interface_builder.rb +3 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
- data/lib/gir_ffi/builders/method_template.rb +4 -4
- data/lib/gir_ffi/builders/module_builder.rb +4 -2
- data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
- data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
- data/lib/gir_ffi/builders/object_builder.rb +18 -6
- data/lib/gir_ffi/builders/property_builder.rb +1 -2
- data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
- data/lib/gir_ffi/builders/struct_builder.rb +34 -7
- data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
- data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +7 -8
- data/lib/gir_ffi/class_base.rb +1 -0
- data/lib/gir_ffi/core.rb +17 -2
- data/lib/gir_ffi/glib_error.rb +1 -2
- data/lib/gir_ffi/in_pointer.rb +7 -0
- data/lib/gir_ffi/object_base.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +1 -2
- data/lib/gir_ffi/struct_base.rb +1 -9
- data/lib/gir_ffi/struct_like_base.rb +9 -5
- data/lib/gir_ffi/type_map.rb +1 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
- data/lib/gir_ffi/union_base.rb +1 -9
- data/lib/gir_ffi/user_defined_object_info.rb +3 -2
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_implementation.rb +1 -0
- metadata +106 -143
- data/Gemfile +0 -14
- data/Rakefile +0 -9
- data/tasks/test.rake +0 -204
- data/test/base_test_helper.rb +0 -70
- data/test/ffi-glib/array_test.rb +0 -203
- data/test/ffi-glib/byte_array_test.rb +0 -28
- data/test/ffi-glib/bytes_test.rb +0 -61
- data/test/ffi-glib/closure_test.rb +0 -38
- data/test/ffi-glib/destroy_notify_test.rb +0 -18
- data/test/ffi-glib/hash_table_test.rb +0 -68
- data/test/ffi-glib/list_test.rb +0 -86
- data/test/ffi-glib/main_loop_test.rb +0 -53
- data/test/ffi-glib/ptr_array_test.rb +0 -112
- data/test/ffi-glib/ruby_closure_test.rb +0 -62
- data/test/ffi-glib/s_list_test.rb +0 -76
- data/test/ffi-glib/strv_test.rb +0 -60
- data/test/ffi-glib/variant_test.rb +0 -12
- data/test/ffi-gobject/gobject_test.rb +0 -76
- data/test/ffi-gobject/object_class_test.rb +0 -31
- data/test/ffi-gobject/object_test.rb +0 -122
- data/test/ffi-gobject/param_spec_test.rb +0 -32
- data/test/ffi-gobject/value_test.rb +0 -390
- data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
- data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
- data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
- data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
- data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
- data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
- data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
- data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
- data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
- data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
- data/test/ffi-gobject_introspection/lib_test.rb +0 -13
- data/test/ffi-gobject_introspection/strv_test.rb +0 -46
- data/test/ffi-gobject_test.rb +0 -151
- data/test/gir_ffi/allocation_helper_test.rb +0 -36
- data/test/gir_ffi/arg_helper_test.rb +0 -139
- data/test/gir_ffi/boolean_test.rb +0 -43
- data/test/gir_ffi/boxed_base_test.rb +0 -65
- data/test/gir_ffi/builder_test.rb +0 -322
- data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
- data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
- data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
- data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
- data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
- data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
- data/test/gir_ffi/builders/field_builder_test.rb +0 -134
- data/test/gir_ffi/builders/function_builder_test.rb +0 -550
- data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
- data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
- data/test/gir_ffi/builders/module_builder_test.rb +0 -43
- data/test/gir_ffi/builders/object_builder_test.rb +0 -98
- data/test/gir_ffi/builders/property_builder_test.rb +0 -158
- data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
- data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
- data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
- data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
- data/test/gir_ffi/builders/union_builder_test.rb +0 -28
- data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
- data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
- data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
- data/test/gir_ffi/callback_base_test.rb +0 -22
- data/test/gir_ffi/class_base_test.rb +0 -166
- data/test/gir_ffi/core_test.rb +0 -98
- data/test/gir_ffi/enum_base_test.rb +0 -43
- data/test/gir_ffi/error_type_info_test.rb +0 -50
- data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
- data/test/gir_ffi/g_type_test.rb +0 -31
- data/test/gir_ffi/in_pointer_test.rb +0 -203
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
- data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
- data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
- data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
- data/test/gir_ffi/interface_base_test.rb +0 -20
- data/test/gir_ffi/method_stubber_test.rb +0 -65
- data/test/gir_ffi/object_base_test.rb +0 -64
- data/test/gir_ffi/object_store_test.rb +0 -41
- data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
- data/test/gir_ffi/sized_array_test.rb +0 -206
- data/test/gir_ffi/struct_base_test.rb +0 -23
- data/test/gir_ffi/struct_like_base_test.rb +0 -167
- data/test/gir_ffi/type_map_test.rb +0 -17
- data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
- data/test/gir_ffi/union_base_test.rb +0 -23
- data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
- data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
- data/test/gir_ffi/variable_name_generator_test.rb +0 -18
- data/test/gir_ffi/version_test.rb +0 -9
- data/test/gir_ffi/zero_terminated_test.rb +0 -108
- data/test/gir_ffi_test_helper.rb +0 -84
- data/test/integration/callback_exceptions_test.rb +0 -59
- data/test/integration/derived_classes_test.rb +0 -53
- data/test/integration/generated_everything_test.rb +0 -452
- data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
- data/test/integration/generated_gio_test.rb +0 -116
- data/test/integration/generated_glib_test.rb +0 -10
- data/test/integration/generated_gobject_test.rb +0 -124
- data/test/integration/generated_gst_test.rb +0 -38
- data/test/integration/generated_gtk_source_test.rb +0 -32
- data/test/integration/generated_gtop_test.rb +0 -22
- data/test/integration/generated_pango_ft2_test.rb +0 -17
- data/test/integration/generated_pango_test.rb +0 -24
- data/test/integration/generated_regress_test.rb +0 -4038
- data/test/integration/generated_secret_test.rb +0 -14
- data/test/integration/generated_utility_test.rb +0 -174
- data/test/integration/generated_warnlib_test.rb +0 -43
- data/test/integration/method_lookup_test.rb +0 -34
- data/test/introspection_test_helper.rb +0 -93
- data/test/lib/Makefile.am +0 -110
- data/test/lib/autogen.sh +0 -4
- data/test/lib/configure.ac +0 -34
- data/test/lib/m4/jhflags.m4 +0 -21
- data/test/minitest/stats_plugin.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 666da2b23f02fadc3172e473ea267f3d81280e6377943426c8f89e7258391ed4
|
4
|
+
data.tar.gz: f19dd857e24269b43109ea8ffa407de64d47531acf00f1104971db171c64bcf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f711ebd41bfedb31e496268b125bf3079f373582b5ac0acbe25938701ceeb42ec98cdbe118a735119f6fafc43357b5d0ba2e52ed8e957e65090669d18d2f692
|
7
|
+
data.tar.gz: e415f33719d96705bfba9e6181123facec99131685613ee8cb753178c9ce3af655e6978e55e55b3435e71c12c744a94200468df9b606bb27f1feac67990cf3a0
|
data/Changelog.md
CHANGED
@@ -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
|
[](https://depfu.com/github/mvz/gir_ffi)
|
13
13
|
[](https://travis-ci.org/mvz/gir_ffi)
|
14
14
|
[](https://codeclimate.com/github/mvz/gir_ffi)
|
15
|
-
[](https://coveralls.io/github/mvz/gir_ffi?branch=master)
|
16
15
|
[](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.
|
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 `
|
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
|
-
`
|
73
|
-
`gir1.2-
|
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,
|
100
|
-
|
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–
|
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
|
30
|
-
not very nice:
|
29
|
+
Derived classes are now registered like so:
|
31
30
|
|
32
31
|
class Derived < Base
|
33
|
-
|
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
|
-
|
41
|
-
#implementation goes here
|
37
|
+
install_vfunc_implementation :some_vfunc, proc {|obj|
|
38
|
+
# implementation goes here
|
42
39
|
}
|
43
|
-
end
|
44
40
|
|
45
|
-
|
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
|
-
|
54
|
-
|
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
|
-
|
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
|
|
data/docs/Subclassing.md
ADDED
@@ -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
|
+
```
|
data/lib/ffi-glib.rb
CHANGED
@@ -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
|
-
#
|
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
|
-
#
|
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
|
data/lib/ffi-glib/byte_array.rb
CHANGED
@@ -9,8 +9,8 @@ module GLib
|
|
9
9
|
class DestroyNotify
|
10
10
|
def self.default
|
11
11
|
@default ||= from proc { |user_data|
|
12
|
-
|
13
|
-
drop_callback
|
12
|
+
callback = GirFFI::ArgHelper::OBJECT_STORE.fetch(user_data)
|
13
|
+
drop_callback callback
|
14
14
|
}
|
15
15
|
end
|
16
16
|
end
|
data/lib/ffi-glib/hash_table.rb
CHANGED
data/lib/ffi-glib/list.rb
CHANGED
@@ -9,13 +9,19 @@ module GLib
|
|
9
9
|
class List
|
10
10
|
include ListMethods
|
11
11
|
|
12
|
-
def
|
13
|
-
|
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
|
17
|
-
|
18
|
-
|
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
|
data/lib/ffi-glib/s_list.rb
CHANGED
@@ -9,13 +9,19 @@ module GLib
|
|
9
9
|
class SList
|
10
10
|
include ListMethods
|
11
11
|
|
12
|
-
def
|
13
|
-
|
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
|
-
|
18
|
-
|
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
|
data/lib/ffi-gobject.rb
CHANGED
@@ -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"
|
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
|
-
|
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
|
data/lib/ffi-gobject/object.rb
CHANGED
@@ -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
|
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
|
78
|
-
|
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
|
-
|
83
|
-
|
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
|
-
|
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
|
-
|
121
|
-
|
122
|
-
|
109
|
+
def store_pointer(ptr)
|
110
|
+
super
|
111
|
+
make_finalizer
|
123
112
|
end
|
124
113
|
|
125
|
-
def
|
126
|
-
|
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
|
-
#
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
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
|