Module: GObject::Helper

Defined in:
lib/ffi-gobject/helper.rb

Class Method Summary collapse

Class Method Details

.builderObject



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.

Parameters:

  • klass

    The class of the object that will receive the signal.

  • signal

    The name of the signal

  • block

    The body of the signal handler

Returns:

  • (FFI::Function)

    The signal handler, ready to be passed as a callback to C.



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.

Raises:

  • (ArgumentError)


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