gir_ffi 0.0.14 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/README.rdoc +36 -12
- data/examples/01_empty_window.rb +1 -3
- data/examples/02_hello_world.rb +1 -3
- data/examples/03_upgraded_hello_world.rb +1 -3
- data/examples/04_webkit.rb +2 -2
- data/examples/05_notification.rb +1 -2
- data/examples/print_class.rb +6 -4
- data/lib/ffi-glib.rb +107 -0
- data/lib/ffi-glib/array.rb +14 -0
- data/lib/ffi-glib/byte_array.rb +10 -0
- data/lib/ffi-glib/hash_table.rb +55 -0
- data/lib/ffi-glib/list.rb +9 -0
- data/lib/ffi-glib/list_methods.rb +31 -0
- data/lib/ffi-glib/s_list.rb +9 -0
- data/lib/ffi-gobject.rb +94 -0
- data/lib/ffi-gobject/closure.rb +12 -0
- data/lib/ffi-gobject/helper.rb +119 -0
- data/lib/ffi-gobject/initially_unowned.rb +10 -0
- data/lib/ffi-gobject/ruby_closure.rb +47 -0
- data/lib/ffi-gobject/value.rb +65 -0
- data/lib/ffi-gobject_introspection.rb +3 -0
- data/lib/{gir_ffi → ffi-gobject_introspection}/g_error.rb +1 -1
- data/lib/ffi-gobject_introspection/gobject_lib.rb +7 -0
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_arg_info.rb +2 -2
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_base_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_callable_info.rb +4 -4
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_callback_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_constant_info.rb +2 -3
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_enum_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_field_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_flags_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_function_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_interface_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_object_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_property_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_registered_type_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_repository.rb +37 -23
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_signal_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_struct_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_type_info.rb +2 -2
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_union_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_value_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/i_vfunc_info.rb +1 -1
- data/lib/{gir_ffi → ffi-gobject_introspection}/lib.rb +1 -1
- data/lib/ffi-gtk/base.rb +17 -0
- data/lib/ffi-gtk2.rb +5 -0
- data/lib/ffi-gtk3.rb +5 -0
- data/lib/gir_ffi.rb +11 -4
- data/lib/gir_ffi/arg_helper.rb +5 -4
- data/lib/gir_ffi/builder.rb +3 -25
- data/lib/gir_ffi/builder/argument.rb +0 -2
- data/lib/gir_ffi/builder/argument/hash_table_base.rb +1 -1
- data/lib/gir_ffi/builder/argument/list_base.rb +1 -1
- data/lib/gir_ffi/builder/module.rb +1 -6
- data/lib/gir_ffi/builder/type/unintrospectable.rb +1 -1
- data/lib/gir_ffi/callback_helper.rb +14 -7
- data/lib/gir_ffi/in_out_pointer.rb +1 -1
- data/lib/gir_ffi/in_pointer.rb +1 -1
- data/lib/gir_ffi/module_base.rb +4 -0
- data/lib/gir_ffi/type_map.rb +29 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/tasks/test.rake +20 -1
- data/test/arg_helper_test.rb +10 -13
- data/test/builder_test.rb +2 -2
- data/test/class_base_test.rb +1 -1
- data/test/{glib_overrides_test.rb → ffi-glib/glib_overrides_test.rb} +3 -5
- data/test/{g_object_overrides_test.rb → ffi-gobject/g_object_overrides_test.rb} +7 -37
- data/test/ffi-gobject/gobject_test.rb +22 -0
- data/test/ffi-gobject/value_test.rb +34 -0
- data/test/{unit → ffi-gobject_introspection}/i_base_info_test.rb +2 -2
- data/test/{unit → ffi-gobject_introspection}/i_constant_info_test.rb +1 -1
- data/test/ffi-gobject_introspection/i_object_info_test.rb +20 -0
- data/test/{unit → ffi-gobject_introspection}/i_repository_test.rb +11 -11
- data/test/function_definition_builder_test.rb +1 -1
- data/test/gir_ffi_test_helper.rb +114 -0
- data/test/girffi_test.rb +2 -2
- data/test/gtk_overrides_test.rb +15 -12
- data/test/integration/generated_gimarshallingtests_test.rb +10 -5
- data/test/integration/generated_gio_test.rb +1 -1
- data/test/integration/generated_gobject_test.rb +1 -1
- data/test/integration/generated_gtk_test.rb +3 -3
- data/test/integration/generated_regress_test.rb +11 -3
- data/test/interface_type_builder_test.rb +1 -1
- data/test/module_builder_test.rb +1 -1
- data/test/test_helper.rb +2 -111
- data/test/type_builder_test.rb +2 -2
- data/test/unintrospectable_type_builder_test.rb +1 -1
- data/test/unit/builder_test.rb +1 -1
- data/test/unit/callback_helper_test.rb +13 -10
- data/test/unit/constant_builder_test.rb +1 -1
- data/test/unit/in_out_pointer_test.rb +1 -1
- data/test/unit/in_pointer_test.rb +1 -1
- data/test/unit/object_type_builder_test.rb +1 -1
- metadata +62 -43
- data/lib/gir_ffi/g_object.rb +0 -38
- data/lib/gir_ffi/overrides/glib.rb +0 -225
- data/lib/gir_ffi/overrides/gobject.rb +0 -330
- data/lib/gir_ffi/overrides/gtk.rb +0 -29
- data/test/g_object_test.rb +0 -21
- data/test/i_object_info_test.rb +0 -20
data/History.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.1.0 / 2011-10-28
|
2
|
+
|
3
|
+
* Put bindings for GObjectIntrospection in their own namespace.
|
4
|
+
* GirFFI.setup no longer loads overrides.
|
5
|
+
* Add ffi-gtk2 and ffi-gtk3 files for loading Gtk+ overrides.
|
6
|
+
|
1
7
|
== 0.0.14 / 2011-10-28
|
2
8
|
|
3
9
|
* Support GObject Introspection version 1.30:
|
data/README.rdoc
CHANGED
@@ -8,18 +8,48 @@ http://www.github.com/mvz/ruby-gir-ffi
|
|
8
8
|
|
9
9
|
Ruby bindings for GNOME using the GObject Introspection Repository.
|
10
10
|
|
11
|
-
== Features/
|
11
|
+
== Features/Notes
|
12
12
|
|
13
|
-
* Create bindings to GObject-based
|
14
|
-
*
|
13
|
+
* Create bindings to any GObject-based library.
|
14
|
+
* Supports both Gtk+ 2 and Gtk+ 3.
|
15
|
+
* Bindings generated at runtime.
|
16
|
+
* Provides overridden bindings for selected methods.
|
17
|
+
* Require 'ffi-gtk2' or 'ffi-gtk3' to load overrides for Gtk2 or Gtk3.
|
18
|
+
|
19
|
+
== Install
|
20
|
+
|
21
|
+
* sudo gem install gir_ffi
|
15
22
|
|
16
23
|
== Synopsis
|
17
24
|
|
25
|
+
Basic usage:
|
26
|
+
|
18
27
|
require 'gir_ffi'
|
19
28
|
|
20
|
-
GirFFI.setup :
|
29
|
+
GirFFI.setup :TheNamespace
|
30
|
+
|
31
|
+
TheNamespace.some_function
|
32
|
+
|
33
|
+
obj = TheNamespace::SomeClass.new
|
34
|
+
obj.some_method with, some, args
|
35
|
+
|
36
|
+
Gtk2:
|
37
|
+
|
38
|
+
require 'ffi-gtk2'
|
21
39
|
Gtk.init
|
22
40
|
win = Gtk::Window.new :toplevel
|
41
|
+
win.show
|
42
|
+
GObject.signal_connect(win, "destroy") { Gtk.main_quit }
|
43
|
+
Gtk.main
|
44
|
+
|
45
|
+
Gtk3:
|
46
|
+
|
47
|
+
require 'ffi-gtk3'
|
48
|
+
Gtk.init
|
49
|
+
win = Gtk::Window.new :toplevel
|
50
|
+
win.show
|
51
|
+
GObject.signal_connect(win, "destroy") { Gtk.main_quit }
|
52
|
+
Gtk.main
|
23
53
|
|
24
54
|
See the `examples/` directory for more, well, examples.
|
25
55
|
|
@@ -40,10 +70,8 @@ On Debian and Ubuntu, the following set of packages should be enough to get
|
|
40
70
|
|
41
71
|
== Hacking and contributing
|
42
72
|
|
43
|
-
|
44
|
-
|
45
|
-
what works, some are a test bed for how things should work. Have a look at
|
46
|
-
the output of `rake notes`. Feel free to file bugs or send pull requests.
|
73
|
+
If you want to help out, have a look at TODO.rdoc, and the output of `rake
|
74
|
+
notes`. Feel free to file bugs or send pull requests.
|
47
75
|
|
48
76
|
If you want to send pull requests or patches, please:
|
49
77
|
|
@@ -56,10 +84,6 @@ If you want to send pull requests or patches, please:
|
|
56
84
|
* Try not to include changes that are irrelevant to your feature in the
|
57
85
|
same commit.
|
58
86
|
|
59
|
-
== Install
|
60
|
-
|
61
|
-
* sudo gem install gir_ffi
|
62
|
-
|
63
87
|
== License
|
64
88
|
|
65
89
|
Copyright (c) 2009--2011 Matijs van Zuijlen
|
data/examples/01_empty_window.rb
CHANGED
data/examples/02_hello_world.rb
CHANGED
@@ -3,9 +3,7 @@
|
|
3
3
|
# http://library.gnome.org/devel/gtk-tutorial/2.90/x344.html
|
4
4
|
#
|
5
5
|
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
6
|
-
require '
|
7
|
-
|
8
|
-
GirFFI.setup :Gtk, '2.0'
|
6
|
+
require 'ffi-gtk3'
|
9
7
|
|
10
8
|
callback = lambda { |widget, data|
|
11
9
|
puts "Hello again - #{data} was pressed"
|
data/examples/04_webkit.rb
CHANGED
data/examples/05_notification.rb
CHANGED
data/examples/print_class.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
1
2
|
require 'gir_ffi'
|
2
3
|
|
3
4
|
# File activesupport/lib/active_support/inflector/methods.rb, line 48
|
@@ -11,10 +12,11 @@ def underscore(camel_cased_word)
|
|
11
12
|
word
|
12
13
|
end
|
13
14
|
|
14
|
-
namespace = '
|
15
|
+
namespace = 'GObject'
|
15
16
|
GirFFI.setup namespace
|
17
|
+
modul = Kernel.const_get(namespace)
|
16
18
|
|
17
|
-
gir =
|
19
|
+
gir = GObjectIntrospection::IRepository.default
|
18
20
|
gir.require namespace, nil
|
19
21
|
infos = gir.infos namespace
|
20
22
|
|
@@ -25,7 +27,7 @@ main_file.write "module #{namespace}\n"
|
|
25
27
|
infos.each do |info|
|
26
28
|
case info.info_type
|
27
29
|
when :function
|
28
|
-
fbuilder = GirFFI::Builder::Function.new info,
|
30
|
+
fbuilder = GirFFI::Builder::Function.new info, modul::Lib
|
29
31
|
main_file.write "\n"
|
30
32
|
main_file.write fbuilder.generate
|
31
33
|
main_file.write "\n"
|
@@ -41,7 +43,7 @@ infos.each do |info|
|
|
41
43
|
end
|
42
44
|
main_file.write "# @return [#{minfo.return_type.tag}]\n"
|
43
45
|
|
44
|
-
fbuilder = GirFFI::Builder::Function.new minfo,
|
46
|
+
fbuilder = GirFFI::Builder::Function.new minfo, modul::Lib
|
45
47
|
main_file.write fbuilder.generate
|
46
48
|
unless minfo.method?
|
47
49
|
main_file.write "end\n"
|
data/lib/ffi-glib.rb
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
GirFFI.setup :GLib
|
2
|
+
|
3
|
+
require 'ffi-glib/s_list'
|
4
|
+
require 'ffi-glib/list'
|
5
|
+
require 'ffi-glib/hash_table'
|
6
|
+
require 'ffi-glib/byte_array'
|
7
|
+
require 'ffi-glib/array'
|
8
|
+
|
9
|
+
module GLib
|
10
|
+
# FIXME: Turn into real constructor
|
11
|
+
def self.slist_new elmttype
|
12
|
+
::GLib::List._real_new(FFI::Pointer.new(0)).tap {|it|
|
13
|
+
it.element_type = elmttype}
|
14
|
+
end
|
15
|
+
|
16
|
+
# FIXME: Turn into instance method; Use element type.
|
17
|
+
def self.slist_prepend slist, data
|
18
|
+
::GLib::SList.wrap(slist.element_type, ::GLib::Lib.g_slist_prepend(slist, data))
|
19
|
+
end
|
20
|
+
|
21
|
+
# FIXME: Turn into real constructor
|
22
|
+
def self.list_new elmttype
|
23
|
+
::GLib::List._real_new(FFI::Pointer.new(0)).tap {|it|
|
24
|
+
it.element_type = elmttype}
|
25
|
+
end
|
26
|
+
|
27
|
+
# FIXME: Turn into instance method; Use element type.
|
28
|
+
def self.list_append list, data
|
29
|
+
::GLib::List.wrap(list.element_type, ::GLib::Lib.g_list_append(list, data))
|
30
|
+
end
|
31
|
+
|
32
|
+
# FIXME: Turn into real constructor
|
33
|
+
def self.hash_table_new keytype, valtype
|
34
|
+
hash_fn, eq_fn = case keytype
|
35
|
+
when :utf8
|
36
|
+
lib = ::GLib::Lib.ffi_libraries.first
|
37
|
+
[ FFI::Function.new(:uint, [:pointer], lib.find_function("g_str_hash")),
|
38
|
+
FFI::Function.new(:int, [:pointer, :pointer], lib.find_function("g_str_equal"))]
|
39
|
+
else
|
40
|
+
[nil, nil]
|
41
|
+
end
|
42
|
+
|
43
|
+
::GLib::HashTable.wrap(keytype, valtype, ::GLib::Lib.g_hash_table_new(hash_fn, eq_fn))
|
44
|
+
end
|
45
|
+
|
46
|
+
# FIXME: Turn into real constructor
|
47
|
+
def self.byte_array_new
|
48
|
+
::GLib::ByteArray.wrap(::GLib::Lib.g_byte_array_new)
|
49
|
+
end
|
50
|
+
|
51
|
+
# FIXME: Turn into instance method
|
52
|
+
def self.byte_array_append arr, data
|
53
|
+
bytes = GirFFI::InPointer.from :utf8, data
|
54
|
+
len = data.bytesize
|
55
|
+
::GLib::ByteArray.wrap(::GLib::Lib.g_byte_array_append arr.to_ptr, bytes, len)
|
56
|
+
end
|
57
|
+
|
58
|
+
# FIXME: Turn into real constructor
|
59
|
+
def self.array_new type
|
60
|
+
ffi_type = type == :utf8 ? :pointer : type
|
61
|
+
arr = ::GLib::Array.wrap(
|
62
|
+
::GLib::Lib.g_array_new(0, 0, FFI.type_size(ffi_type)))
|
63
|
+
arr.element_type = type
|
64
|
+
arr
|
65
|
+
end
|
66
|
+
|
67
|
+
# FIXME: Turn into instance method
|
68
|
+
def self.array_append_vals arr, data
|
69
|
+
bytes = GirFFI::InPointer.from_array arr.element_type, data
|
70
|
+
len = data.length
|
71
|
+
res = ::GLib::Array.wrap(
|
72
|
+
::GLib::Lib.g_array_append_vals(arr.to_ptr, bytes, len))
|
73
|
+
res.element_type = arr.element_type
|
74
|
+
res
|
75
|
+
end
|
76
|
+
|
77
|
+
# FIXME: Turn into real constructor?
|
78
|
+
def self.main_loop_new context, is_running
|
79
|
+
::GLib::MainLoop.wrap(::GLib::Lib.g_main_loop_new context, is_running)
|
80
|
+
end
|
81
|
+
|
82
|
+
load_class :HFunc
|
83
|
+
load_class :HashFunc
|
84
|
+
load_class :EqualFunc
|
85
|
+
module Lib
|
86
|
+
attach_function :g_slist_prepend, [:pointer, :pointer], :pointer
|
87
|
+
|
88
|
+
attach_function :g_list_append, [:pointer, :pointer], :pointer
|
89
|
+
|
90
|
+
attach_function :g_hash_table_foreach,
|
91
|
+
[:pointer, HFunc, :pointer], :void
|
92
|
+
attach_function :g_hash_table_new,
|
93
|
+
[HashFunc, EqualFunc], :pointer
|
94
|
+
attach_function :g_hash_table_insert,
|
95
|
+
[:pointer, :pointer, :pointer], :void
|
96
|
+
|
97
|
+
attach_function :g_byte_array_new, [], :pointer
|
98
|
+
attach_function :g_byte_array_append,
|
99
|
+
[:pointer, :pointer, :uint], :pointer
|
100
|
+
|
101
|
+
attach_function :g_array_new, [:int, :int, :uint], :pointer
|
102
|
+
attach_function :g_array_append_vals,
|
103
|
+
[:pointer, :pointer, :uint], :pointer
|
104
|
+
|
105
|
+
attach_function :g_main_loop_new, [:pointer, :bool], :pointer
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module GLib
|
2
|
+
load_class :HashTable
|
3
|
+
|
4
|
+
class HashTable
|
5
|
+
include Enumerable
|
6
|
+
attr_accessor :key_type
|
7
|
+
attr_accessor :value_type
|
8
|
+
|
9
|
+
def each
|
10
|
+
prc = Proc.new {|keyptr, valptr, userdata|
|
11
|
+
key = cast_from_pointer key_type, keyptr
|
12
|
+
val = cast_from_pointer value_type, valptr
|
13
|
+
yield key, val
|
14
|
+
}
|
15
|
+
::GLib::Lib.g_hash_table_foreach self.to_ptr, prc, nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash
|
19
|
+
Hash[self.to_a]
|
20
|
+
end
|
21
|
+
|
22
|
+
def insert key, value
|
23
|
+
keyptr = cast_to_pointer key_type, key
|
24
|
+
valptr = cast_to_pointer value_type, value
|
25
|
+
::GLib::Lib.g_hash_table_insert self.to_ptr, keyptr, valptr
|
26
|
+
end
|
27
|
+
|
28
|
+
def cast_to_pointer type, it
|
29
|
+
if type == :utf8
|
30
|
+
GirFFI::InPointer.from :utf8, it
|
31
|
+
else
|
32
|
+
FFI::Pointer.new(it)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def cast_from_pointer type, it
|
37
|
+
case type
|
38
|
+
when :utf8
|
39
|
+
GirFFI::ArgHelper.ptr_to_utf8 it
|
40
|
+
when :gint32
|
41
|
+
GirFFI::ArgHelper.cast_pointer_to_int32 it
|
42
|
+
else
|
43
|
+
it.address
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.wrap keytype, valtype, ptr
|
48
|
+
super(ptr).tap do |it|
|
49
|
+
break if it.nil?
|
50
|
+
it.key_type = keytype
|
51
|
+
it.value_type = valtype
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module GLib
|
2
|
+
module ListMethods
|
3
|
+
include Enumerable
|
4
|
+
attr_accessor :element_type
|
5
|
+
|
6
|
+
def self.included base
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
def each
|
11
|
+
list = self
|
12
|
+
rval = nil
|
13
|
+
until list.nil?
|
14
|
+
rval = yield GirFFI::ArgHelper.cast_from_pointer(element_type, list[:data])
|
15
|
+
list = self.class.wrap(element_type, list[:next])
|
16
|
+
end
|
17
|
+
rval
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def wrap elmttype, ptr
|
22
|
+
super(ptr).tap do |it|
|
23
|
+
break if it.nil?
|
24
|
+
it.element_type = elmttype
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
data/lib/ffi-gobject.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
GirFFI.setup :GObject
|
2
|
+
|
3
|
+
require 'ffi-gobject/value'
|
4
|
+
require 'ffi-gobject/initially_unowned'
|
5
|
+
require 'ffi-gobject/closure'
|
6
|
+
require 'ffi-gobject/ruby_closure'
|
7
|
+
require 'ffi-gobject/helper'
|
8
|
+
|
9
|
+
module GObject
|
10
|
+
def self.type_init
|
11
|
+
Lib::g_type_init
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.object_ref obj
|
15
|
+
Lib::g_object_ref obj.to_ptr
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.object_ref_sink obj
|
19
|
+
Lib::g_object_ref_sink obj.to_ptr
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.object_unref obj
|
23
|
+
Lib::g_object_unref obj.to_ptr
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.object_is_floating obj
|
27
|
+
Lib::g_object_is_floating obj.to_ptr
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.type_from_instance_pointer inst_ptr
|
31
|
+
klsptr = inst_ptr.get_pointer 0
|
32
|
+
klsptr.send "get_#{GirFFI::TypeMap::TAG_TYPE_MAP[:gtype]}", 0
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.type_from_instance instance
|
36
|
+
type_from_instance_pointer instance.to_ptr
|
37
|
+
end
|
38
|
+
|
39
|
+
_setup_method :signal_emitv
|
40
|
+
|
41
|
+
def self.signal_emit object, signal, *args
|
42
|
+
type = type_from_instance object
|
43
|
+
id = signal_lookup signal, type
|
44
|
+
|
45
|
+
arr = Helper.signal_arguments_to_gvalue_array signal, object, *args
|
46
|
+
rval = Helper.gvalue_for_signal_return_value signal, object
|
47
|
+
|
48
|
+
::GObject::Lib.g_signal_emitv arr[:values], id, 0, rval
|
49
|
+
|
50
|
+
rval
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.signal_connect object, signal, data=nil, &block
|
54
|
+
sig = object.class._find_signal signal
|
55
|
+
if sig.nil?
|
56
|
+
raise "Signal #{signal} is invalid for #{object}"
|
57
|
+
end
|
58
|
+
if block.nil?
|
59
|
+
raise ArgumentError, "Block needed"
|
60
|
+
end
|
61
|
+
|
62
|
+
rettype = GirFFI::Builder.itypeinfo_to_ffitype sig.return_type
|
63
|
+
|
64
|
+
argtypes = GirFFI::Builder.ffi_argument_types_for_signal sig
|
65
|
+
|
66
|
+
callback = FFI::Function.new rettype, argtypes,
|
67
|
+
&(Helper.signal_callback_args(sig, object.class, &block))
|
68
|
+
::GObject::Lib::CALLBACKS << callback
|
69
|
+
|
70
|
+
data_ptr = GirFFI::ArgHelper.object_to_inptr data
|
71
|
+
|
72
|
+
::GObject::Lib.g_signal_connect_data object, signal, callback, data_ptr, nil, 0
|
73
|
+
end
|
74
|
+
|
75
|
+
load_class :Callback
|
76
|
+
load_class :ClosureNotify
|
77
|
+
load_class :ConnectFlags
|
78
|
+
load_class :ClosureMarshal
|
79
|
+
|
80
|
+
module Lib
|
81
|
+
attach_function :g_type_init, [], :void
|
82
|
+
attach_function :g_object_ref, [:pointer], :void
|
83
|
+
attach_function :g_object_ref_sink, [:pointer], :void
|
84
|
+
attach_function :g_object_unref, [:pointer], :void
|
85
|
+
attach_function :g_object_is_floating, [:pointer], :bool
|
86
|
+
|
87
|
+
attach_function :g_signal_connect_data,
|
88
|
+
[:pointer, :string, Callback, :pointer, ClosureNotify,
|
89
|
+
ConnectFlags],
|
90
|
+
:ulong
|
91
|
+
attach_function :g_closure_set_marshal,
|
92
|
+
[:pointer, ClosureMarshal], :void
|
93
|
+
end
|
94
|
+
end
|