1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
#
require 'ffi'
#
module Efl
#
module Native
class VersionStruct < FFI::Struct
layout :major, :int,
:minor, :int,
:micro, :int,
:revision, :int
def full
[:major,:minor,:micro,:revision].collect { |e| self[e].to_s }.join '.'
end
end
end
#
module FFIHelper
#
def attach_fcts fcts
fcts.each do |func|
begin
attach_function(*func)
rescue Object => e
puts "Could not attach #{func} #{e.message}"
end
end
end
#
def ffi_typedefs
@ffi_typedefs
end
#
def steal_ffitype mod, sym
typedef mod.ffi_typedefs[sym], sym
end
#
def self.extended mod
#
mod.extend FFI::Library
#
mod.typedef :pointer, :char_p
mod.typedef :pointer, :short_p
mod.typedef :pointer, :int_p
mod.typedef :pointer, :long_p
mod.typedef :pointer, :float_p
mod.typedef :pointer, :double_p
mod.typedef :pointer, :uchar_p
mod.typedef :pointer, :ushort_p
mod.typedef :pointer, :uint_p
mod.typedef :pointer, :ulong_p
mod.typedef :pointer, :ufloat_p
mod.typedef :pointer, :udouble_p
mod.typedef :pointer, :void_p
mod.typedef :pointer, :string_array
mod.typedef :pointer, :string_array_p
mod.typedef :uint_p, :uintptr_t
#
mod.typedef :bool, :eina_bool
mod.typedef :pointer, :eina_bool_p
mod.typedef :pointer, :eina_list_p
mod.typedef :pointer, :eina_hash_p
mod.typedef :pointer, :eina_iterator_p
mod.typedef :pointer, :eina_accessor_p
mod.typedef :pointer, :evas_p
mod.typedef :pointer, :evas_object_p
mod.typedef :pointer, :evas_object_pp
mod.typedef :pointer, :ecore_getopt_p
mod.typedef :pointer, :ecore_getopt_desc_p
mod.typedef :pointer, :ecore_getopt_value_p
#
mod.callback :eina_compare_cb, [ :void_p, :void_p ], :int
mod.callback :eina_each_cb, [ :void_p, :void_p, :void_p ], :eina_bool
mod.callback :eina_free_cb, [ :void_p ], :void
#
end
#
end
#
module ClassHelper
def to_a; [self] end
def to_ary; [self] end
def to_s; Object.instance_method(:to_s).bind(self).call+' ['+self.to_ptr.to_s+']' end
def to_ptr; @ptr; end
def === o; @ptr === o.to_ptr; end
def null?; @ptr.null?; end
def address; @ptr.address; end
def self.included kls
# create class instance @search_prefixes
kls.class_eval "@search_prefixes ||=[]"
# access and prepend *args to @search_prefixes
kls.class_eval "def self.search_prefixes *args; @search_prefixes.unshift *args unless args.empty?; @search_prefixes; end"
# on inheritance, copy ancestor's @search_prefixes
kls.class_eval <<-EOF
def self.inherited sub
sub.class_eval '@search_prefixes = []'
sub.search_prefixes *self.search_prefixes
end
EOF
end
def method_missing m, *args, &block
m_s = m.to_s
if m_s =~/^(.*)=$/
m_s = $1+'_set'
args_s = '*args[0]'
elsif m_s =~/^(.*)\?$/
m_s = $1+'_get'
args_s = '*args'
else
args_s = '*args'
end
(['']+self.class.search_prefixes).each do |p|
sym = p+m_s
meth = (
if Efl::Native.respond_to? sym
sym
elsif Efl::Native.respond_to? m
m
elsif Efl::Native.respond_to? sym+'_get'
sym+'_get'
elsif Efl::Native.respond_to? m_s+'_get'
m_s+'_get'
else
nil
end
)
if not meth.nil?
self.class.class_eval "def #{m} *args, █ r=Efl::Native.#{meth}(@ptr,#{args_s}); yield r if block_given?; r; end"
return self.send m, *args, &block
end
end
Kernel.raise NameError.new "#{self.class.name} is unable to resolve #{m} within #{self.class.search_prefixes.inspect}"
end
end
end
#
# EOF
|