Implements the creation of GObject subclasses from Ruby.
# File lib/gir_ffi/builders/user_defined_builder.rb, line 7 def initialize info @info = info end
# 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
# 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
# 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
# File lib/gir_ffi/builders/user_defined_builder.rb, line 88 def method_introspection_data method nil end
# File lib/gir_ffi/builders/user_defined_builder.rb, line 50 def parent @parent end
# File lib/gir_ffi/builders/user_defined_builder.rb, line 54 def properties info.properties end
# 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
# 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
# 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
# File lib/gir_ffi/builders/user_defined_builder.rb, line 46 def target_gtype @gtype end