ffi-efl 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|