class GObject::Object

Overrides for GObject, GObject's generic base class.

Public Class Methods

make_finalizer(ptr) click to toggle source
# File lib/ffi-gobject/object.rb, line 82
def self.make_finalizer(ptr)
  proc do
    rc = GObject::Object::Struct.new(ptr)[:ref_count]
    if rc == 0
      warn "not unreffing #{name}:#{ptr} (#{rc})"
    else
      GObject::Lib.g_object_unref ptr
    end
  end
end
new(*args, &block) click to toggle source
# File lib/ffi-gobject/object.rb, line 41
def self.new(*args, &block)
  obj = allocate
  obj.__send__ :initialize, *args, &block
  obj
end
new_with_properties(*args, &block) click to toggle source
# File lib/ffi-gobject/object.rb, line 15
def self.new_with_properties(*args, &block)
  obj = allocate
  obj.__send__ :initialize_with_properties, *args, &block
  obj
end

Public Instance Methods

get_property(property_name)
get_property_extended(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 120
def get_property_extended(property_name)
  value = get_property(property_name)
  type_info = get_property_type property_name
  property_value_post_conversion value, type_info
end
get_property_with_override(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 126
def get_property_with_override(property_name)
  gvalue = gvalue_for_property property_name
  get_property_without_override property_name, gvalue
  gvalue.get_value
end
Also aliased as: get_property
get_property_without_override(property_name)
Alias for: get_property
initialize(properties = {})
initialize_with_automatic_gtype(properties = {}) click to toggle source

Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.

# File lib/ffi-gobject/object.rb, line 50
def initialize_with_automatic_gtype(properties = {})
  gparameters = properties.map do |name, value|
    name = name.to_s
    property_param_spec(name)
    GObject::Parameter.new.tap do |gparam|
      gparam.name = name
      gparam.value = value
    end
  end
  initialize_without_automatic_gtype(self.class.gtype, gparameters)
end
Also aliased as: initialize
initialize_with_properties(properties = {}) click to toggle source

Starting with GLib 2.54.0, use g_object_new_with_properties, which takes an array of names and an array of values.

# File lib/ffi-gobject/object.rb, line 23
def initialize_with_properties(properties = {})
  names, gvalues = names_and_gvalues_for_properties(properties)

  n_properties = names.length
  names_arr = GirFFI::SizedArray.from(:utf8, -1, names)
  gvalues_arr = GirFFI::SizedArray.from(GObject::Value, -1, gvalues)

  ptr = GObject::Lib.g_object_new_with_properties(self.class.gtype,
                                                  n_properties,
                                                  names_arr,
                                                  gvalues_arr)
  store_pointer ptr
end
Also aliased as: initialize
initialize_without_automatic_gtype(properties = {})
Alias for: initialize
method_missing(method, *args) click to toggle source

TODO: Generate accessor methods from GIR at class definition time

Calls superclass method
# File lib/ffi-gobject/object.rb, line 94
def method_missing(method, *args)
  getter_name = "get_#{method}"
  return send(getter_name, *args) if respond_to?(getter_name)

  if method.to_s =~ /(.*)=$/
    setter_name = "set_#{Regexp.last_match[1]}"
    return send(setter_name, *args) if respond_to?(setter_name)
  end
  super
end
old_initialze(properties = {})
Alias for: initialize
ref() click to toggle source
# File lib/ffi-gobject/object.rb, line 72
def ref
  Lib.g_object_ref self
  self
end
respond_to_missing?(*) click to toggle source
# File lib/ffi-gobject/object.rb, line 105
def respond_to_missing?(*)
  false
end
set_property(property_name, value)
set_property_extended(property_name, value) click to toggle source
# File lib/ffi-gobject/object.rb, line 132
def set_property_extended(property_name, value)
  type_info = get_property_type property_name
  adjusted_value = property_value_pre_conversion(value, type_info)
  set_property property_name, adjusted_value
end
set_property_with_override(property_name, value) click to toggle source
# File lib/ffi-gobject/object.rb, line 138
def set_property_with_override(property_name, value)
  gvalue = gvalue_for_property(property_name)
  gvalue.set_value value
  set_property_without_override property_name, gvalue
end
Also aliased as: set_property
set_property_without_override(property_name, value)
Alias for: set_property
signal_connect(event, data = nil, &block) click to toggle source
# File lib/ffi-gobject/object.rb, line 109
def signal_connect(event, data = nil, &block)
  GObject.signal_connect(self, event, data, &block)
end
signal_connect_after(event, data = nil, &block) click to toggle source
# File lib/ffi-gobject/object.rb, line 113
def signal_connect_after(event, data = nil, &block)
  GObject.signal_connect_after(self, event, data, &block)
end
store_pointer(ptr) click to toggle source
Calls superclass method
# File lib/ffi-gobject/object.rb, line 77
def store_pointer(ptr)
  super
  ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)
end

Private Instance Methods

base_initialize(properties = {})
Alias for: initialize
get_property_type(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 167
def get_property_type(property_name)
  prop = self.class.find_property(property_name)
  prop.property_type
end
gvalue_for_property(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 172
def gvalue_for_property(property_name)
  gtype = property_gtype property_name
  GObject::Value.for_gtype gtype
end
names_and_gvalues_for_properties(properties) click to toggle source
# File lib/ffi-gobject/object.rb, line 155
def names_and_gvalues_for_properties(properties)
  return [], [] unless properties.any?

  properties.map do |name, value|
    name = name.to_s
    gvalue = gvalue_for_property(name)
    gvalue.set_value value

    [name, gvalue]
  end.transpose
end
property_gtype(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 177
def property_gtype(property_name)
  pspec = property_param_spec(property_name)
  pspec.value_type
end
property_param_spec(property_name) click to toggle source
# File lib/ffi-gobject/object.rb, line 182
def property_param_spec(property_name)
  object_class.find_property property_name or
    raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
end
property_value_post_conversion(val, type_info) click to toggle source

TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer

# File lib/ffi-gobject/object.rb, line 188
def property_value_post_conversion(val, type_info)
  case type_info.flattened_tag
  when :ghash
    GLib::HashTable.from type_info.element_type, val
  when :glist
    GLib::List.from type_info.element_type, val
  when :callback
    GirFFI::Builder.build_class(type_info.interface).wrap val
  else
    val
  end
end
property_value_pre_conversion(val, type_info) click to toggle source

TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer

# File lib/ffi-gobject/object.rb, line 202
def property_value_pre_conversion(val, type_info)
  case type_info.flattened_tag
  when :ghash
    GLib::HashTable.from type_info.element_type, val
  when :glist
    GLib::List.from type_info.element_type, val
  when :strv
    GLib::Strv.from val
  when :callback
    GirFFI::Builder.build_class(type_info.interface).from val
  else
    val
  end
end