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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
#
require 'ffi'
#
module Efl
#
module Native
#
extend FFI::Library
#
def self.attach_fcts fcts
fcts.each do |func|
begin
attach_function(*func)
rescue Object => e
puts "Could not attach #{func} #{e.message}"
end
end
end
#
class << self
alias :ffi_lib_orig :ffi_lib
def ffi_lib *names
@all_ffi_libs||=[]
@all_ffi_libs += ffi_lib_orig(names)
@all_ffi_libs.uniq!
end
def find_variable name
@all_ffi_libs.each do |lib|
address = lib.find_variable name
return address if not address.nil?
end
return nil
end
end
#
typedef :pointer, :char_p
typedef :pointer, :short_p
typedef :pointer, :int_p
typedef :pointer, :long_p
typedef :pointer, :float_p
typedef :pointer, :double_p
typedef :pointer, :uchar_p
typedef :pointer, :ushort_p
typedef :pointer, :uint_p
typedef :pointer, :ulong_p
typedef :pointer, :ufloat_p
typedef :pointer, :udouble_p
typedef :pointer, :void_p
typedef :pointer, :string_array
typedef :pointer, :string_array_p
typedef :uint_p, :uintptr_t
#
typedef :bool, :eina_bool
typedef :pointer, :eina_bool_p
typedef :pointer, :eina_list_p
typedef :pointer, :eina_hash_p
typedef :pointer, :eina_iterator_p
typedef :pointer, :eina_accessor_p
typedef :pointer, :evas_p
typedef :pointer, :evas_object_p
typedef :pointer, :evas_object_pp
typedef :pointer, :evas_gl_api_p
typedef :pointer, :ecore_getopt_p
typedef :pointer, :ecore_getopt_desc_p
typedef :pointer, :ecore_getopt_value_p
#
callback :eina_compare_cb, [ :void_p, :void_p ], :int
callback :eina_each_cb, [ :void_p, :void_p, :void_p ], :eina_bool
callback :eina_free_cb, [ :void_p ], :void
#
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 ModuleHelper
def find_function m, prefix
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
sym = (
if Efl::Native.respond_to? prefix+m_s
prefix+m_s
elsif Efl::Native.respond_to? m_s
m_s
elsif Efl::Native.respond_to? prefix+m_s+'_get'
prefix+m_s+'_get'
elsif Efl::Native.respond_to? m_s+'_get'
m_s+'_get'
else
raise NameError.new "#{self.name}.#{m_s} (#{m})"
end
)
[sym, args_s]
end
module_function :find_function
end
#
module MethResolver
def self.resolve mod, meth, prefix
meth_s = meth.to_s
if meth_s =~/^(.*)=$/
meth_s = $1+'_set'
args_s = '*args[0]'
elsif meth_s =~/^(.*)\?$/
meth_s = $1+'_get'
args_s = '*args'
else
args_s = '*args'
end
sym = (
if Efl::Native.respond_to? prefix+meth_s
prefix+meth_s
elsif Efl::Native.respond_to? meth_s
meth_s
elsif Efl::Native.respond_to? prefix+meth_s+'_get'
prefix+meth_s+'_get'
elsif Efl::Native.respond_to? meth_s+'_get'
meth_s+'_get'
else
raise NameError.new "#{mod.name}.#{meth_s} (#{meth})"
end
)
mod.module_eval "def self.#{meth} *args, █ r=Efl::Native.#{sym}(#{args_s}); yield r if block_given?; r; end"
sym
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_s
m_s
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
|