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
|
#! /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 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 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
|