Class: GObject::Value

Inherits:
Object
  • Object
show all
Defined in:
lib/ffi-gobject/value.rb

Overview

Overrides for GValue, GObject’s generic value container structure.

Constant Summary collapse

METHOD_MAP =
{
  TYPE_BOOLEAN => [:get_boolean,       :set_boolean],
  TYPE_BOXED   => [:get_boxed,         :set_boxed],
  TYPE_CHAR    => [:get_char,          :set_char],
  TYPE_DOUBLE  => [:get_double,        :set_double],
  TYPE_ENUM    => [:get_enum_enhanced, :set_enum],
  TYPE_FLAGS   => [:get_flags,         :set_flags],
  TYPE_FLOAT   => [:get_float,         :set_float],
  TYPE_GTYPE   => [:get_gtype,         :set_gtype],
  TYPE_INT     => [:get_int,           :set_int],
  TYPE_INT64   => [:get_int64,         :set_int64],
  TYPE_LONG    => [:get_long,          :set_long],
  TYPE_OBJECT  => [:get_object,        :set_instance_enhanced],
  TYPE_PARAM   => [:get_param,         :set_param],
  TYPE_POINTER => [:get_pointer,       :set_pointer],
  TYPE_STRING  => [:get_string,        :set_string],
  TYPE_UCHAR   => [:get_uchar,         :set_uchar],
  TYPE_UINT    => [:get_uint,          :set_uint],
  TYPE_UINT64  => [:get_uint64,        :set_uint64],
  TYPE_ULONG   => [:get_ulong,         :set_ulong],
  TYPE_VARIANT => [:get_variant,       :set_variant]
}
CLASS_TO_GTYPE_MAP =
{
  true => TYPE_BOOLEAN,
  false => TYPE_BOOLEAN,
  Integer => TYPE_INT,
  String => TYPE_STRING
}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.for_g_type(g_type) ⇒ Object



105
106
107
108
# File 'lib/ffi-gobject/value.rb', line 105

def self.for_g_type g_type
  return nil if g_type == TYPE_NONE
  new.tap {|it| it.init g_type }
end

.from(val) ⇒ Object



94
95
96
97
98
99
100
101
102
103
# File 'lib/ffi-gobject/value.rb', line 94

def self.from val
  case val
  when self
    val
  when nil
    nil
  else
    wrap_ruby_value val
  end
end

.wrap_instance(instance) ⇒ Object

TODO: Combine with wrap_ruby_value



111
112
113
114
115
116
# File 'lib/ffi-gobject/value.rb', line 111

def self.wrap_instance instance
  new.tap {|it|
    it.init GObject.type_from_instance instance
    it.set_instance instance
  }
end

.wrap_ruby_value(val) ⇒ Object

TODO: Give more generic name



90
91
92
# File 'lib/ffi-gobject/value.rb', line 90

def self.wrap_ruby_value val
  new.set_ruby_value val
end

Instance Method Details

#current_fundamental_typeObject



68
69
70
# File 'lib/ffi-gobject/value.rb', line 68

def current_fundamental_type
  GObject.type_fundamental current_gtype
end

#current_gtypeObject



64
65
66
# File 'lib/ffi-gobject/value.rb', line 64

def current_gtype
  @struct[:g_type]
end

#current_gtype_nameObject



72
73
74
# File 'lib/ffi-gobject/value.rb', line 72

def current_gtype_name
  GObject.type_name current_gtype
end

#get_valueObject



76
77
78
79
80
81
82
83
# File 'lib/ffi-gobject/value.rb', line 76

def get_value
  value = get_value_plain
  if current_fundamental_type == TYPE_BOXED
    wrap_boxed value
  else
    value
  end
end

#get_value_plainObject



85
86
87
# File 'lib/ffi-gobject/value.rb', line 85

def get_value_plain
  send get_method
end

#init_for_ruby_value(val) ⇒ Object



54
55
56
57
58
59
60
61
62
# File 'lib/ffi-gobject/value.rb', line 54

def init_for_ruby_value val
  CLASS_TO_GTYPE_MAP.each do |klass, type|
    if klass === val
      init type
      return self
    end
  end
  raise "Can't handle #{val.class}"
end

#set_ruby_value(val) ⇒ Object

TODO: Give more generic name



7
8
9
10
11
12
13
# File 'lib/ffi-gobject/value.rb', line 7

def set_ruby_value val
  if current_gtype == 0
    init_for_ruby_value val
  end

  set_value val
end

#set_value(val) ⇒ Object



42
43
44
45
# File 'lib/ffi-gobject/value.rb', line 42

def set_value val
  send set_method, val
  self
end

#value=(val) ⇒ Object



38
39
40
# File 'lib/ffi-gobject/value.rb', line 38

def value= val
  set_value val
end