Module: GObject::Helper
- Defined in:
- lib/ffi-gobject/helper.rb
Class Method Summary collapse
- .builder ⇒ Object
- .builder=(bldr) ⇒ Object
-
.cast_back_signal_arguments(signalinfo, klass, *args) ⇒ Object
TODO: Generate cast back methods using existing Argument builders.
- .cast_signal_argument(info, arg) ⇒ Object
- .gvalue_for_signal_return_value(signal, object) ⇒ Object
- .gvalue_for_type_info(info) ⇒ Object
- .signal_argument_to_gvalue(info, arg) ⇒ Object
- .signal_arguments_to_gvalue_array(signal, instance, *rest) ⇒ Object
-
.signal_callback(klass, signal, &block) ⇒ FFI::Function
Create a signal hander callback.
-
.signal_callback_args(sig, klass, &block) ⇒ Object
FIXME: Move either to ISignalInfo or the base GObject class.
- .signal_reciever_to_gvalue(instance) ⇒ Object
Class Method Details
.builder ⇒ Object
24 25 26 |
# File 'lib/ffi-gobject/helper.rb', line 24 def self.builder @builder ||= GirFFI::Builder end |
.builder=(bldr) ⇒ Object
20 21 22 |
# File 'lib/ffi-gobject/helper.rb', line 20 def self.builder= bldr @builder = bldr end |
.cast_back_signal_arguments(signalinfo, klass, *args) ⇒ Object
TODO: Generate cast back methods using existing Argument builders.
85 86 87 88 89 90 91 92 93 94 |
# File 'lib/ffi-gobject/helper.rb', line 85 def self.cast_back_signal_arguments signalinfo, klass, *args instance = klass.wrap args.shift user_data = GirFFI::ArgHelper::OBJECT_STORE[args.pop.address] extra_arguments = signalinfo.args.zip(args).map do |info, arg| cast_signal_argument(info, arg) end return [instance, *extra_arguments].push user_data end |
.cast_signal_argument(info, arg) ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/ffi-gobject/helper.rb', line 96 def self.cast_signal_argument info, arg arg_t = info.argument_type if arg_t.tag == :interface iface = arg_t.interface kls = GirFFI::Builder.build_class iface case iface.info_type when :enum, :flags kls[arg] when :interface arg.to_object else kls.wrap(arg) end else arg end end |
.gvalue_for_signal_return_value(signal, object) ⇒ Object
77 78 79 80 81 82 |
# File 'lib/ffi-gobject/helper.rb', line 77 def self.gvalue_for_signal_return_value signal, object sig = object.class.find_signal signal rettypeinfo = sig.return_type gvalue_for_type_info rettypeinfo end |
.gvalue_for_type_info(info) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/ffi-gobject/helper.rb', line 63 def self.gvalue_for_type_info info tag = info.tag gtype = case tag when :interface info.interface.g_type when :void return nil else TYPE_TAG_TO_GTYPE[tag] end raise "GType not found for type info with tag #{tag}" unless gtype Value.new.tap {|val| val.init gtype} end |
.signal_argument_to_gvalue(info, arg) ⇒ Object
58 59 60 61 |
# File 'lib/ffi-gobject/helper.rb', line 58 def self.signal_argument_to_gvalue info, arg val = gvalue_for_type_info info.argument_type val.set_value arg end |
.signal_arguments_to_gvalue_array(signal, instance, *rest) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/ffi-gobject/helper.rb', line 37 def self.signal_arguments_to_gvalue_array signal, instance, *rest sig = instance.class.find_signal signal arr = ::GObject::ValueArray.new sig.n_args + 1 arr.append signal_reciever_to_gvalue instance sig.args.zip(rest).each do |info, arg| arr.append signal_argument_to_gvalue info, arg end arr end |
.signal_callback(klass, signal, &block) ⇒ FFI::Function
Create a signal hander callback. Wraps the given block in such a way that arguments and return value are cast correctly to the ruby world and back.
12 13 14 15 16 17 18 |
# File 'lib/ffi-gobject/helper.rb', line 12 def self.signal_callback klass, signal, &block sig_info = klass.find_signal signal callback_block = signal_callback_args(sig_info, klass, &block) builder.build_callback sig_info, &callback_block end |
.signal_callback_args(sig, klass, &block) ⇒ Object
FIXME: Move either to ISignalInfo or the base GObject class.
29 30 31 32 33 34 35 |
# File 'lib/ffi-gobject/helper.rb', line 29 def self.signal_callback_args sig, klass, &block raise ArgumentError, "Block needed" if block.nil? return Proc.new do |*args| mapped = cast_back_signal_arguments sig, klass, *args block.call(*mapped) end end |
.signal_reciever_to_gvalue(instance) ⇒ Object
51 52 53 54 55 56 |
# File 'lib/ffi-gobject/helper.rb', line 51 def self.signal_reciever_to_gvalue instance val = ::GObject::Value.new val.init ::GObject.type_from_instance instance val.set_instance instance return val end |