class GirFFI::Builders::UserDefinedBuilder

Implements the creation of GObject subclasses from Ruby.

Public Class Methods

new(info) click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 7
def initialize info
  @info = info
end

Public Instance Methods

instantiate_class() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 11
def instantiate_class
  @klass = @info.described_class

  parent_type = @klass.get_gtype
  @parent = gir.find_by_gtype(parent_type)

  query_result = GObject.type_query parent_type
  type_info = GObject::TypeInfo.new
  type_info.class_size = query_result.class_size
  type_info.instance_size = query_result.instance_size
  properties.each do
    type_info.instance_size += FFI.type_size(:int32)
  end

  @gtype = GObject.type_register_static(parent_type, @klass.name,
                                        type_info, 0)

  @structklass = get_or_define_class @klass, :Struct, layout_superclass
  setup_class unless already_set_up
  TypeBuilder::CACHE[@gtype] = @klass
end
setup_class() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 33
def setup_class
  setup_layout
  setup_constants
  #stub_methods
  setup_gtype_getter
  setup_property_accessors
  #setup_vfunc_invokers
  #setup_interfaces
  setup_constructor
end

Private Instance Methods

layout_specification() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 58
def layout_specification
  parent_spec = [:parent, superclass::Struct, 0]
  offset = superclass::Struct.size
  fields_spec = properties.map do |pinfo|
    spec = [pinfo.name.to_sym, :int32, offset]
    offset += FFI.type_size(:int32)
    spec
  end.flatten(1)
  parent_spec + fields_spec
end
method_introspection_data(method) click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 88
def method_introspection_data method
  nil
end
parent() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 50
def parent
  @parent
end
properties() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 54
def properties
  info.properties
end
setup_accessors_for_param_info(pinfo) click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 75
def setup_accessors_for_param_info pinfo
  code = <<-CODE
  def #{pinfo.name}
    @struct[:#{pinfo.name}]
  end
  def #{pinfo.name}= val
    @struct[:#{pinfo.name}] = val
  end
  CODE

  @klass.class_eval code
end
setup_constructor() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 92
def setup_constructor
  code = <<-CODE
  def self.new
    gptr = GObject::Lib.g_object_newv #{@gtype}, 0, nil
    self.wrap(gptr)
  end
  CODE
  @klass.class_eval code
end
setup_property_accessors() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 69
def setup_property_accessors
  properties.each do |pinfo|
    setup_accessors_for_param_info pinfo
  end
end
target_gtype() click to toggle source
# File lib/gir_ffi/builders/user_defined_builder.rb, line 46
def target_gtype
  @gtype
end