ffi-efl 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Changelog +13 -1
- data/README.rdoc +24 -14
- data/lib/efl/ecore.rb +7 -7
- data/lib/efl/ecore_evas.rb +78 -0
- data/lib/efl/ecore_getopt.rb +28 -29
- data/lib/efl/ecore_input.rb +14 -0
- data/lib/efl/edje.rb +47 -1
- data/lib/efl/eet.rb +18 -25
- data/lib/efl/eina.rb +14 -0
- data/lib/efl/eina_hash.rb +84 -0
- data/lib/efl/eina_list.rb +77 -0
- data/lib/efl/elementary.rb +22 -9
- data/lib/efl/evas.rb +67 -25
- data/lib/efl/{ecore/ecore-ffi.rb → ffi/ecore.rb} +8 -5
- data/lib/efl/{ecore/ecore_evas-ffi.rb → ffi/ecore_evas.rb} +10 -7
- data/lib/efl/{ecore/ecore_getopt-ffi.rb → ffi/ecore_getopt.rb} +8 -5
- data/lib/efl/{ecore/ecore_input-ffi.rb → ffi/ecore_input.rb} +9 -6
- data/lib/efl/{edje/edje-ffi.rb → ffi/edje.rb} +10 -7
- data/lib/efl/{eet/eet-ffi.rb → ffi/eet.rb} +8 -5
- data/lib/efl/ffi/eina.rb +48 -0
- data/lib/efl/ffi/eina_hash.rb +111 -0
- data/lib/efl/ffi/eina_list.rb +108 -0
- data/lib/efl/{eina/eina_types-ffi.rb → ffi/eina_types.rb} +8 -5
- data/lib/efl/{elementary/elementary-ffi.rb → ffi/elementary.rb} +16 -9
- data/lib/efl/{evas/evas-ffi.rb → ffi/evas.rb} +153 -150
- data/lib/efl/ffi.rb +81 -38
- data/lib/efl.rb +9 -4
- data/spec/ecore_evas_spec.rb +24 -0
- data/spec/ecore_getopt_spec.rb +1 -2
- data/spec/ecore_input_spec.rb +24 -0
- data/spec/ecore_spec.rb +2 -3
- data/spec/edje_spec.rb +1 -1
- data/spec/eet_spec.rb +68 -69
- data/spec/eina_hash_spec.rb +180 -0
- data/spec/eina_list_spec.rb +101 -0
- data/spec/eina_spec.rb +20 -0
- data/spec/evas_spec.rb +288 -40
- data/tasks/ffi.rake +1 -1
- data/test/test_edje.rb +141 -0
- data/test/test_elm_win.rb +25 -28
- data/test/test_elm_win_class.rb +7 -7
- data/test/test_evas.rb +106 -0
- metadata +30 -17
data/Changelog
CHANGED
@@ -1,5 +1,17 @@
|
|
1
|
+
2011-05-01 Jérémy Zurcher <jeremy@asynk.ch>
|
2
|
+
* release 0.0.3
|
3
|
+
+ Evas, Evas_Ecore, Edje, Elm ... usable
|
4
|
+
* use FFI::AutoPointer in ruby classes
|
5
|
+
* cleanup method_missing proxies usage and definition
|
6
|
+
* Eina_List <=> Array
|
7
|
+
* Eina_Hash <=> Hash
|
8
|
+
* .*= setters handled
|
9
|
+
* .*? getters handled
|
10
|
+
* evas test from http://docs.enlightenment.org/auto/evas/ implemented
|
11
|
+
* edje test from http://docs.enlightenment.org/auto/edje/ implemented
|
12
|
+
|
1
13
|
2011-04-25 Jérémy Zurcher <jeremy@asynk.ch>
|
2
|
-
* release 0.2
|
14
|
+
* release 0.0.2
|
3
15
|
* ecore getopt seems good
|
4
16
|
* basis of module function mapping and class method_missing usage setup
|
5
17
|
* small elementary elm_Win test app
|
data/README.rdoc
CHANGED
@@ -4,31 +4,27 @@ ffi-efl
|
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
|
8
|
-
base components of the Enlightenment project. (EFL API[http://www.enlightenment.org/p.php?p=docs&l=en])
|
9
|
-
|
10
|
-
ffi-efl project is developed on asynk[http://cgit.asynk.ch/cgi-bin/cgit/ffi-efl], github[https://github.com/jeremyz] and gitorious[https://gitorious.org/~jeyzu]
|
7
|
+
A ruby-ffi binding to efl libraries (Enlightenment Foundation Libraries).
|
11
8
|
|
12
9
|
== FEATURES/PROBLEMS:
|
13
10
|
|
14
|
-
*
|
11
|
+
* Not 1.8 compatible yet !!!
|
15
12
|
|
16
13
|
== SYNOPSIS:
|
17
14
|
|
18
|
-
require '
|
19
|
-
|
20
|
-
Eet.
|
21
|
-
Eet.open('/tmp/_eet.cfg', :eet_file_mode_write) do |f|
|
15
|
+
require 'efl'
|
16
|
+
Efl::Eet.init
|
17
|
+
Efl::Eet::REetFile.open('/tmp/_eet.cfg', :eet_file_mode_write) do |f|
|
22
18
|
f.write 'config2', 'test--key'
|
23
19
|
end
|
24
|
-
Eet.open('/tmp/_eet.cfg', :eet_file_mode_read) do |f|
|
20
|
+
Efl::Eet::REetFile.open('/tmp/_eet.cfg', :eet_file_mode_read) do |f|
|
25
21
|
puts f.read('config2')
|
26
22
|
end
|
27
|
-
Eet.shutdown
|
23
|
+
Efl::Eet.shutdown
|
28
24
|
|
29
25
|
For less minimalistic and more sane examples you may look at:
|
30
26
|
|
31
|
-
* the spec/
|
27
|
+
* the spec/ and test/ folders
|
32
28
|
|
33
29
|
== REQUIREMENTS:
|
34
30
|
|
@@ -37,7 +33,7 @@ For less minimalistic and more sane examples you may look at:
|
|
37
33
|
|
38
34
|
== DOWNLOAD/INSTALL:
|
39
35
|
|
40
|
-
From
|
36
|
+
From rubygems:
|
41
37
|
|
42
38
|
[sudo] gem install ffi-efl
|
43
39
|
|
@@ -47,11 +43,25 @@ or from the git repository on github:
|
|
47
43
|
cd ffi-efl
|
48
44
|
rake gem:install
|
49
45
|
|
46
|
+
== RESOURCES:
|
47
|
+
|
48
|
+
You can find this project in a few places:
|
49
|
+
|
50
|
+
Online repositories:
|
51
|
+
|
52
|
+
* https://github.com/jeremyz/ffi-efl
|
53
|
+
* http://cgit.asynk.ch/cgi-bin/cgit/ffi-efl/
|
54
|
+
* https://gitorious.org/ffi-efl
|
55
|
+
|
56
|
+
Gem:
|
57
|
+
|
58
|
+
* https://rubygems.org/gems/ffi-efl
|
59
|
+
|
50
60
|
== CREDITS:
|
51
61
|
|
52
62
|
Special thanks to:
|
53
63
|
|
54
|
-
*
|
64
|
+
* Lionel Orry
|
55
65
|
|
56
66
|
== LICENSE:
|
57
67
|
|
data/lib/efl/ecore.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# -*- coding: UTF-8 -*-
|
3
3
|
#
|
4
|
-
require 'efl/
|
4
|
+
require 'efl/ffi/ecore'
|
5
5
|
#
|
6
6
|
module Efl
|
7
7
|
module Ecore
|
@@ -15,15 +15,15 @@ module Efl
|
|
15
15
|
EVENT_SIGNAL_REALTIME = 5 # Realtime signal event
|
16
16
|
EVENT_COUNT = 6
|
17
17
|
#
|
18
|
-
class
|
18
|
+
class REcorePipe
|
19
19
|
def initialize cb, data
|
20
|
-
@ptr = Efl::
|
20
|
+
@ptr = Efl::Ecore.ecore_pipe_add cb, data
|
21
21
|
end
|
22
|
-
def del; Efl::
|
23
|
-
def read_close; Efl::
|
24
|
-
def write_close; Efl::
|
22
|
+
def del; Efl::Ecore.ecore_pipe_del @ptr; end
|
23
|
+
def read_close; Efl::Ecore.ecore_pipe_read_close @ptr; end
|
24
|
+
def write_close; Efl::Ecore.ecore_pipe_write_close @ptr; end
|
25
25
|
def write data
|
26
|
-
Efl::
|
26
|
+
Efl::Ecore.ecore_pipe_write @ptr, FFI::MemoryPointer.from_string(data.to_s), data.to_s.length+1
|
27
27
|
end
|
28
28
|
#
|
29
29
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/ffi/ecore_evas'
|
5
|
+
#
|
6
|
+
module Efl
|
7
|
+
#
|
8
|
+
module EcoreEvas
|
9
|
+
#
|
10
|
+
class REcoreEvas
|
11
|
+
include Efl::ClassHelper
|
12
|
+
proxy_list [Efl::EcoreEvas,'ecore_evas_'].freeze
|
13
|
+
def initialize o=nil, &block
|
14
|
+
@ptr = (
|
15
|
+
case o
|
16
|
+
when NilClass
|
17
|
+
FFI::AutoPointer.new Efl::EcoreEvas.ecore_evas_new(nil, 0, 0, 0, 0, nil), method(:free)
|
18
|
+
when self.class
|
19
|
+
o.to_ptr
|
20
|
+
when FFI::AutoPointer
|
21
|
+
o
|
22
|
+
when FFI::Pointer
|
23
|
+
FFI::AutoPointer.new o, method(:free)
|
24
|
+
else
|
25
|
+
raise ArgumentError.new "wrong argument #{o.class.name}"
|
26
|
+
end
|
27
|
+
)
|
28
|
+
yield self if block_given?
|
29
|
+
end
|
30
|
+
def free p=nil
|
31
|
+
return Efl::EcoreEvas.ecore_evas_free p unless p.nil?
|
32
|
+
Efl::EcoreEvas.ecore_evas_free @ptr
|
33
|
+
@ptr.free
|
34
|
+
@ptr=nil
|
35
|
+
end
|
36
|
+
def get
|
37
|
+
# EAPI Evas *ecore_evas_get(const Ecore_Evas *ee);
|
38
|
+
Efl::Evas::REvas.new Efl::EcoreEvas.ecore_evas_get @ptr
|
39
|
+
end
|
40
|
+
def object_image_new
|
41
|
+
# EAPI Evas_Object *ecore_evas_object_image_new(Ecore_Evas *ee_target);
|
42
|
+
Efl::Evas::REvasObject.new Efl::EcoreEvas.ecore_evas_object_image_new @prt
|
43
|
+
end
|
44
|
+
def object_associate_get
|
45
|
+
# EAPI Evas_Object *ecore_evas_object_associate_get(const Ecore_Evas *ee);
|
46
|
+
Efl::Evas::REvasObject.new Efl::EcoreEvas.ecore_evas_object_associate_get @prt
|
47
|
+
end
|
48
|
+
#
|
49
|
+
end
|
50
|
+
#
|
51
|
+
end
|
52
|
+
#
|
53
|
+
module Evas
|
54
|
+
#
|
55
|
+
class REvas
|
56
|
+
def ecore_evas_get
|
57
|
+
# EAPI Ecore_Evas *ecore_evas_ecore_evas_get(const Evas *e);
|
58
|
+
Efl::EcoreEvas::REcoreEvas.new Efl::EcoreEvas.ecore_evas_ecore_evas_get @ptr
|
59
|
+
end
|
60
|
+
end
|
61
|
+
#
|
62
|
+
class REvasObject
|
63
|
+
def ecore_evas_get
|
64
|
+
# EAPI Ecore_Evas *ecore_evas_object_ecore_evas_get(Evas_Object *obj);
|
65
|
+
Efl::EcoreEvas::REcoreEvas.new Efl::EcoreEvas.ecore_evas_object_ecore_evas_get @ptr
|
66
|
+
end
|
67
|
+
def evas_get
|
68
|
+
# EAPI Evas *ecore_evas_object_evas_get(Evas_Object *obj);
|
69
|
+
Efl::Evas::REvas.new Efl::EcoreEvas.ecore_evas_object_evas_get @ptr
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
# TODO
|
74
|
+
#EAPI unsigned char ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage);
|
75
|
+
#
|
76
|
+
end
|
77
|
+
#
|
78
|
+
# EOF
|
data/lib/efl/ecore_getopt.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# -*- coding: UTF-8 -*-
|
3
3
|
#
|
4
|
-
require 'efl/
|
4
|
+
require 'efl/ffi/ecore_getopt'
|
5
5
|
#
|
6
6
|
module Efl
|
7
|
-
|
7
|
+
#
|
8
|
+
module EcoreGetopt
|
8
9
|
#
|
9
|
-
class
|
10
|
+
class Value < FFI::Union
|
10
11
|
layout :strp, :pointer,
|
11
12
|
:boolp, :eina_bool_p,
|
12
13
|
:shortp, :short_p,
|
@@ -20,7 +21,7 @@ module Efl
|
|
20
21
|
:ptrp, :void_p,
|
21
22
|
end
|
22
23
|
#
|
23
|
-
class
|
24
|
+
class DescStoreDef < FFI::Union
|
24
25
|
layout :strv, :pointer,
|
25
26
|
:boolv, :uchar,
|
26
27
|
:shortv, :short,
|
@@ -32,37 +33,37 @@ module Efl
|
|
32
33
|
:doublev, :double,
|
33
34
|
end
|
34
35
|
#
|
35
|
-
class
|
36
|
+
class DescStore < FFI::Struct
|
36
37
|
layout :type, :ecore_getopt_type, # enum
|
37
38
|
:arg_req, :ecore_getopt_desc_arg_requirement, # enum
|
38
|
-
:def,
|
39
|
+
:def, DescStoreDef,
|
39
40
|
end
|
40
41
|
#
|
41
42
|
callback :ecore_getopt_desc_cb, [:ecore_getopt_p, :ecore_getopt_desc_p, :string, :pointer, :ecore_getopt_value_p ], :eina_bool
|
42
43
|
#
|
43
|
-
class
|
44
|
+
class DescCallback < FFI::Struct
|
44
45
|
layout :func, :ecore_getopt_desc_cb,
|
45
46
|
:data, :pointer,
|
46
47
|
:arg_req, :ecore_getopt_desc_arg_requirement, # enum
|
47
48
|
:def, :pointer,
|
48
49
|
end
|
49
50
|
#
|
50
|
-
class
|
51
|
-
layout :store,
|
51
|
+
class ActionParam < FFI::Union
|
52
|
+
layout :store, DescStore,
|
52
53
|
:store_const, :pointer,
|
53
54
|
:choices, :pointer,
|
54
55
|
:append_type, :ecore_getopt_type, # enum
|
55
|
-
:callback,
|
56
|
+
:callback, DescCallback,
|
56
57
|
:dummy, :pointer,
|
57
58
|
end
|
58
59
|
#
|
59
|
-
class
|
60
|
+
class Desc < FFI::Struct
|
60
61
|
layout :shortname, :char,
|
61
62
|
:longname, :pointer,
|
62
63
|
:help, :pointer,
|
63
64
|
:metavar, :pointer,
|
64
65
|
:action, :ecore_getopt_action, # enum
|
65
|
-
:action_param,
|
66
|
+
:action_param, ActionParam,
|
66
67
|
end
|
67
68
|
#
|
68
69
|
class EcoreGetopt < FFI::Struct
|
@@ -76,15 +77,13 @@ module Efl
|
|
76
77
|
# :descs, :pointer, # NULL terminated EcoreGetopt_Desc[]
|
77
78
|
|
78
79
|
def desc_ptr idx
|
79
|
-
|
80
|
+
Efl::EcoreGetopt::Desc.new to_ptr+Efl::EcoreGetopt::EcoreGetopt.size+(idx*Efl::EcoreGetopt::Desc.size)
|
80
81
|
end
|
81
82
|
end
|
82
83
|
#
|
83
|
-
|
84
|
-
#
|
85
|
-
module EcoreGetopt
|
86
|
-
class Parser
|
84
|
+
class REcoreGetopt
|
87
85
|
def initialize desc
|
86
|
+
@ecore_getopt = nil
|
88
87
|
@desc = desc
|
89
88
|
@options = [
|
90
89
|
[ 0, FFI::Pointer::NULL, FFI::Pointer::NULL, FFI::Pointer::NULL, 0, {:dummy=>FFI::Pointer::NULL} ]
|
@@ -107,16 +106,16 @@ module Efl
|
|
107
106
|
@values.insert -2, [ type, ptr ]
|
108
107
|
end
|
109
108
|
def to_ptr
|
110
|
-
@
|
109
|
+
@ecore_getopt.to_ptr
|
111
110
|
end
|
112
111
|
def create
|
113
|
-
@
|
112
|
+
@ecore_getopt = Efl::EcoreGetopt::EcoreGetopt.new FFI::MemoryPointer.new (Efl::EcoreGetopt::EcoreGetopt.size+Efl::EcoreGetopt::Desc.size*@options.length), 1
|
114
113
|
[:prog,:usage,:version,:copyright,:license,:description].each do |sym|
|
115
|
-
@
|
114
|
+
@ecore_getopt[sym] = ( @desc.has_key?(sym) ? FFI::MemoryPointer.from_string(@desc[sym]) : FFI::Pointer::NULL )
|
116
115
|
end
|
117
|
-
@
|
116
|
+
@ecore_getopt[:strict] = @desc[:strict] if @desc.has_key? :strict
|
118
117
|
@options.each_with_index do |o,i|
|
119
|
-
d = @
|
118
|
+
d = @ecore_getopt.desc_ptr i
|
120
119
|
d[:shortname] = o[0].ord
|
121
120
|
d[:longname] = p_from_string o[1]
|
122
121
|
d[:help] = p_from_string o[2]
|
@@ -153,9 +152,9 @@ module Efl
|
|
153
152
|
d[:action_param][:dummy] = FFI::Pointer::NULL
|
154
153
|
end
|
155
154
|
end
|
156
|
-
@values_p = FFI::MemoryPointer.new Efl::
|
155
|
+
@values_p = FFI::MemoryPointer.new Efl::EcoreGetopt::Value, @values.length, false
|
157
156
|
@values.each_with_index do |v,i|
|
158
|
-
Efl::
|
157
|
+
Efl::EcoreGetopt::Value.new(@values_p+(i*Efl::EcoreGetopt::Value.size))[v[0]] = v[1]
|
159
158
|
end
|
160
159
|
end
|
161
160
|
def parse argv
|
@@ -164,7 +163,7 @@ module Efl
|
|
164
163
|
ptr[i].put_pointer 0, p_from_string(s)
|
165
164
|
end
|
166
165
|
ptr[argv.length].put_pointer 0, FFI::Pointer::NULL
|
167
|
-
Efl::EcoreGetopt.
|
166
|
+
Efl::EcoreGetopt.ecore_getopt_parse @ecore_getopt, @values_p, argv.length, ptr
|
168
167
|
end
|
169
168
|
def store_full short, long, help, meta, type, arg_req, def_val
|
170
169
|
self << [ short, long, help, meta, :ecore_getopt_action_store, [:store, [type,arg_req, def_val] ] ]
|
@@ -251,14 +250,14 @@ module Efl
|
|
251
250
|
#
|
252
251
|
def debug
|
253
252
|
r = ''
|
254
|
-
r << "#{self.class} : #{@
|
253
|
+
r << "#{self.class} : #{@ecore_getopt.to_ptr}\n"
|
255
254
|
[:prog,:usage,:version,:copyright,:license,:description].each do |sym|
|
256
|
-
r<< " #{sym.to_s} : #{@
|
255
|
+
r<< " #{sym.to_s} : #{@ecore_getopt[sym]==FFI::Pointer::NULL ? 'NULL' : @ecore_getopt[sym].read_string}\n"
|
257
256
|
end
|
258
|
-
r << " strict : #{@
|
257
|
+
r << " strict : #{@ecore_getopt[:strict]}\n"
|
259
258
|
i=0
|
260
259
|
while true
|
261
|
-
d = @
|
260
|
+
d = @ecore_getopt.desc_ptr i
|
262
261
|
break if d[:shortname]==0 and d[:longname] == FFI::Pointer::NULL
|
263
262
|
r << " desc #{d.to_ptr}\n"
|
264
263
|
r << " short: #{d[:shortname].chr}\n" unless d[:shortname]==0
|
data/lib/efl/edje.rb
CHANGED
@@ -1,11 +1,57 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# -*- coding: UTF-8 -*-
|
3
3
|
#
|
4
|
-
require 'efl/
|
4
|
+
require 'efl/evas'
|
5
|
+
require 'efl/ffi/edje'
|
5
6
|
#
|
6
7
|
module Efl
|
8
|
+
#
|
7
9
|
module Edje
|
8
10
|
#
|
11
|
+
class REdje < Efl::Evas::REvasObject
|
12
|
+
#
|
13
|
+
proxy_list [Efl::Edje,'edje_object_'].freeze
|
14
|
+
def part_object_get part
|
15
|
+
# EAPI const Evas_Object *edje_object_part_object_get (const Evas_Object *obj, const char *part);
|
16
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_object_get @ptr, part
|
17
|
+
end
|
18
|
+
def part_swallow_get part
|
19
|
+
# EAPI Evas_Object *edje_object_part_swallow_get (const Evas_Object *obj, const char *part);
|
20
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_swallow_get @ptr, part
|
21
|
+
end
|
22
|
+
def external_object_get part
|
23
|
+
# EAPI Evas_Object *edje_object_part_external_object_get (const Evas_Object *obj, const char *part);
|
24
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_external_object_get @ptr, part
|
25
|
+
end
|
26
|
+
def external_content_get part, content
|
27
|
+
# EAPI Evas_Object *edje_object_part_external_content_get (const Evas_Object *obj, const char *part, const char *content);
|
28
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_external_content_get @ptr, part, content
|
29
|
+
end
|
30
|
+
def part_box_remove part, child
|
31
|
+
# EAPI Evas_Object *edje_object_part_box_remove (Evas_Object *obj, const char *part, Evas_Object *child);
|
32
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_box_remove @ptr, part, child
|
33
|
+
end
|
34
|
+
def part_box_remove_at part, pos
|
35
|
+
# EAPI Evas_Object *edje_object_part_box_remove_at (Evas_Object *obj, const char *part, unsigned int pos);
|
36
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_box_remove_at @ptr, part, pos
|
37
|
+
end
|
38
|
+
def part_child_get part, col, row
|
39
|
+
# EAPI Evas_Object *edje_object_part_table_child_get (Evas_Object *obj, const char *part, unsigned int col, unsigned int row);
|
40
|
+
Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_child_get @ptr, part, col, row
|
41
|
+
end
|
42
|
+
end
|
43
|
+
#
|
44
|
+
end
|
45
|
+
#
|
46
|
+
module Evas
|
47
|
+
#
|
48
|
+
class REvas
|
49
|
+
def edje_object_add
|
50
|
+
# EAPI Evas_Object *edje_object_add (Evas *evas);
|
51
|
+
Efl::Edje::REdje.new Efl::Edje.edje_object_add @ptr
|
52
|
+
end
|
53
|
+
end
|
54
|
+
#
|
9
55
|
end
|
10
56
|
end
|
11
57
|
#
|
data/lib/efl/eet.rb
CHANGED
@@ -1,49 +1,41 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
# -*- coding: UTF-8 -*-
|
3
3
|
#
|
4
|
-
require 'efl/
|
4
|
+
require 'efl/ffi/eet'
|
5
5
|
#
|
6
6
|
module Efl
|
7
|
+
#
|
7
8
|
module Eet
|
8
9
|
#
|
9
|
-
class
|
10
|
+
class REetFile
|
10
11
|
#
|
11
|
-
|
12
|
-
|
13
|
-
f = Efl::API.eet_open path, mode
|
14
|
-
raise Exception.new "Unable to open file #{path}" if f.nil?
|
15
|
-
yield EetFile.new f
|
16
|
-
Efl::API.eet_close f
|
17
|
-
else
|
18
|
-
f = Efl::API.eet_open path, mode
|
19
|
-
return EetFile.new f unless f.nil?
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
#
|
24
|
-
class EetFile
|
12
|
+
include Efl::ClassHelper
|
13
|
+
proxy_list [Efl::Eet,'eet_'].freeze
|
25
14
|
#
|
26
15
|
def initialize ptr
|
27
16
|
@ptr=ptr
|
28
17
|
end
|
29
18
|
private :initialize
|
30
19
|
#
|
31
|
-
def
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
20
|
+
def self.open path, mode=:eet_file_mode_read, &blk
|
21
|
+
if blk
|
22
|
+
f = Efl::Eet.eet_open path, mode
|
23
|
+
raise Exception.new "Unable to open file #{path}" if f.nil?
|
24
|
+
yield REetFile.new f
|
25
|
+
Efl::Eet.eet_close f
|
26
|
+
else
|
27
|
+
f = Efl::Eet.eet_open path, mode
|
28
|
+
return REetFile.new f unless f.nil?
|
29
|
+
end
|
38
30
|
end
|
39
31
|
#
|
40
32
|
def write key, data, compress=false
|
41
|
-
Efl::
|
33
|
+
Efl::Eet.eet_write @ptr, key, FFI::MemoryPointer.from_string(data), data.bytesize, ( compress ? 1 : 0 )
|
42
34
|
end
|
43
35
|
#
|
44
36
|
def read key
|
45
37
|
ptr = FFI::MemoryPointer.new(:int)
|
46
|
-
data = Efl::
|
38
|
+
data = Efl::Eet.eet_read @ptr, key, ptr
|
47
39
|
s = ptr.read_int
|
48
40
|
ptr.free
|
49
41
|
return nil if s==0
|
@@ -53,6 +45,7 @@ module Efl
|
|
53
45
|
end
|
54
46
|
#
|
55
47
|
end
|
48
|
+
#
|
56
49
|
end
|
57
50
|
#
|
58
51
|
# EOF
|
data/lib/efl/eina.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/ffi/eina_hash'
|
5
|
+
#
|
6
|
+
class Hash
|
7
|
+
def self.from_eina_hash o
|
8
|
+
if o.is_a? Efl::EinaHash::REinaHash
|
9
|
+
o.to_h
|
10
|
+
elsif o.is_a? FFI::Pointer
|
11
|
+
Efl::EinaHash::REinaHash.new(o).to_h
|
12
|
+
else
|
13
|
+
raise ArgumentError.new " wrong argument #{o.class.name}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
module Efl
|
18
|
+
module EinaHash
|
19
|
+
#
|
20
|
+
class REinaHash
|
21
|
+
include Enumerable
|
22
|
+
include Efl::ClassHelper
|
23
|
+
proxy_list [Efl::EinaHash,'eina_hash_'].freeze
|
24
|
+
def initialize o=nil, &block
|
25
|
+
cstr = ( block_given? ? block : Proc.new { Efl::EinaHash.eina_hash_string_djb2_new FFI::Pointer::NULL } )
|
26
|
+
@ptr = (
|
27
|
+
case o
|
28
|
+
when NilClass
|
29
|
+
FFI::AutoPointer.new cstr.call, method(:free)
|
30
|
+
when self.class
|
31
|
+
o.to_ptr
|
32
|
+
when FFI::AutoPointer
|
33
|
+
o
|
34
|
+
when FFI::Pointer
|
35
|
+
FFI::AutoPointer.new ( o==FFI::Pointer::NULL ? cstr.call : o ), method(:free)
|
36
|
+
when Hash
|
37
|
+
ptr = cstr.call
|
38
|
+
o.each do |k,v| Efl::EinaHash.eina_hash_add ptr, k, v end
|
39
|
+
FFI::AutoPointer.new ptr, method(:free)
|
40
|
+
else
|
41
|
+
raise ArgumentError.new "wrong argument #{o.class.name}"
|
42
|
+
end
|
43
|
+
)
|
44
|
+
end
|
45
|
+
def free p=nil
|
46
|
+
return Efl::EinaHash.eina_hash_free p unless p.nil?
|
47
|
+
Efl::EinaHash.eina_hash_free @ptr
|
48
|
+
@ptr.free
|
49
|
+
@ptr = nil
|
50
|
+
end
|
51
|
+
def each data=FFI::Pointer::NULL, &block
|
52
|
+
return if not block_given?
|
53
|
+
Efl::EinaHash::eina_hash_foreach @ptr, Proc.new{|h,k,v,d| block.call(k,v) }, data
|
54
|
+
end
|
55
|
+
def to_h
|
56
|
+
rh = {}
|
57
|
+
each { |k,v| rh[k]=v; true }
|
58
|
+
rh
|
59
|
+
end
|
60
|
+
def to_h_conv &block
|
61
|
+
rh = {}
|
62
|
+
if block_given?
|
63
|
+
each { |k,v| rh[block.call(k)]=v; true }
|
64
|
+
else
|
65
|
+
each { |k,v| rh[k.read_string]=v; true }
|
66
|
+
end
|
67
|
+
rh
|
68
|
+
end
|
69
|
+
# for fun and tests
|
70
|
+
def add k, v
|
71
|
+
Efl::EinaHash.eina_hash_add @ptr, k, v
|
72
|
+
v
|
73
|
+
end
|
74
|
+
alias :[]= :add
|
75
|
+
def find k
|
76
|
+
r = Efl::EinaHash.eina_hash_find @ptr, k
|
77
|
+
return ( r==FFI::Pointer::NULL ? nil : r )
|
78
|
+
end
|
79
|
+
alias :[] :find
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
#
|
84
|
+
# EOF
|
@@ -0,0 +1,77 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
# -*- coding: UTF-8 -*-
|
3
|
+
#
|
4
|
+
require 'efl/ffi/eina_list'
|
5
|
+
#
|
6
|
+
class Array
|
7
|
+
def self.from_eina_list o
|
8
|
+
if o.is_a? Efl::EinaList::REinaList
|
9
|
+
o.to_ary
|
10
|
+
elsif o.is_a? FFI::Pointer
|
11
|
+
Efl::EinaList::REinaList.new(o).to_ary
|
12
|
+
else
|
13
|
+
raise ArgumentError.new "wrong argument #{o.class.name}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
module Efl
|
18
|
+
module EinaList
|
19
|
+
#
|
20
|
+
class EinaListStruct < FFI::Struct
|
21
|
+
layout :data, :pointer,
|
22
|
+
:next, :pointer,
|
23
|
+
:prev, :pointer,
|
24
|
+
:accounting, :pointer,
|
25
|
+
:magic, :uint,
|
26
|
+
end
|
27
|
+
#
|
28
|
+
class REinaList
|
29
|
+
include Enumerable
|
30
|
+
include Efl::ClassHelper
|
31
|
+
proxy_list [Efl::EinaList,'eina_list_'].freeze
|
32
|
+
def initialize o=nil
|
33
|
+
@ptr = (
|
34
|
+
case o
|
35
|
+
when FFI::Pointer
|
36
|
+
o
|
37
|
+
when NilClass
|
38
|
+
FFI::Pointer::NULL
|
39
|
+
when self.class
|
40
|
+
o.to_ptr
|
41
|
+
when Array
|
42
|
+
o.inject(FFI::Pointer::NULL) { |p,e| Efl::EinaList.eina_list_append p, e }
|
43
|
+
else
|
44
|
+
raise ArgumentError.new "wrong argument #{o.class.name}"
|
45
|
+
end
|
46
|
+
)
|
47
|
+
end
|
48
|
+
def free p=nil
|
49
|
+
return Efl::EinaList.eina_list_free p unless p.nil?
|
50
|
+
Efl::EinaList.eina_list_free @ptr
|
51
|
+
@ptr = nil
|
52
|
+
end
|
53
|
+
def each
|
54
|
+
p = @ptr
|
55
|
+
while p!=::FFI::Pointer::NULL
|
56
|
+
l = Efl::EinaList::EinaListStruct.new p
|
57
|
+
yield l[:data]
|
58
|
+
p = l[:next]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
def to_ary
|
62
|
+
inject([]) { |s,e| s<<e }
|
63
|
+
end
|
64
|
+
# for fun and tests
|
65
|
+
def append p
|
66
|
+
@ptr = Efl::EinaList.eina_list_append @ptr, p
|
67
|
+
end
|
68
|
+
alias :<< :append
|
69
|
+
def prepend p
|
70
|
+
@ptr = Efl::EinaList.eina_list_prepend @ptr, p
|
71
|
+
end
|
72
|
+
alias :unshift :prepend
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
#
|
77
|
+
# EOF
|