ffi-efl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/efl/evas.rb ADDED
@@ -0,0 +1,108 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/evas/evas-ffi'
5
+ #
6
+ module Efl
7
+ module Evas
8
+ #
9
+ class Evas
10
+ include Efl::Helper
11
+ @func_prefixes = [ 'evas_' ].freeze
12
+ def initialize o=nil
13
+ @ptr = (
14
+ case o
15
+ when NilClass
16
+ FFI::AutoPointer.new Efl::API.evas_new, method(:free)
17
+ when self.class
18
+ o.ptr
19
+ when FFI::AutoPointer
20
+ o
21
+ when FFI::Pointer
22
+ FFI::AutoPointer.new o, method(:free)
23
+ else
24
+ raise ArgumentError.new "#{ptr.class} valid argument"
25
+ end
26
+ )
27
+ yield self if block_given?
28
+ end
29
+ def free
30
+ Efl::API.evas_free @ptr
31
+ @ptr=nil
32
+ end
33
+ def === o
34
+ @ptr === o.ptr
35
+ end
36
+ def output_size_get
37
+ x = FFI::MemoryPointer.new :int
38
+ y = FFI::MemoryPointer.new :int
39
+ Efl::API.evas_output_size_get @ptr, x, y
40
+ [ x.read_int, y.read_int ]
41
+ end
42
+ def output_viewport_get
43
+ x = FFI::MemoryPointer.new :int
44
+ y = FFI::MemoryPointer.new :int
45
+ w = FFI::MemoryPointer.new :int
46
+ h = FFI::MemoryPointer.new :int
47
+ Efl::API.evas_output_viewport_get @ptr, x, y, w, h
48
+ [ x.read_int, y.read_int, w.read_int, h.read_int ]
49
+ end
50
+ def pointer_output_xy_get
51
+ x = FFI::MemoryPointer.new :int
52
+ y = FFI::MemoryPointer.new :int
53
+ Efl::API.evas_pointer_output_xy_get @ptr, x, y
54
+ [ x.read_int, y.read_int ]
55
+ end
56
+ def pointer_canvas_xy_get
57
+ x = FFI::MemoryPointer.new :int
58
+ y = FFI::MemoryPointer.new :int
59
+ Efl::API.evas_pointer_canvas_xy_get @ptr, x, y
60
+ [ x.read_int, y.read_int ]
61
+ end
62
+ end
63
+ #
64
+ class EvasObject
65
+ include Efl::Helper
66
+ @func_prefixes = [ 'evas_object_', 'evas_' ].freeze
67
+ def initialize o=nil
68
+ @ptr = (
69
+ case o
70
+ when NilClass
71
+ FFI::AutoPointer.new Efl::API.evas_new, method(:free)
72
+ when self.class
73
+ o.ptr
74
+ when FFI::AutoPointer
75
+ o
76
+ when FFI::Pointer
77
+ FFI::AutoPointer.new o, method(:free)
78
+ else
79
+ raise ArgumentError.new "#{ptr.class} valid argument"
80
+ end
81
+ )
82
+ yield self if block_given?
83
+ end
84
+ def free
85
+ Efl::API.evas_object_del @ptr
86
+ @ptr=nil
87
+ end
88
+ def geometry_get
89
+ x = FFI::MemoryPointer.new :int
90
+ y = FFI::MemoryPointer.new :int
91
+ w = FFI::MemoryPointer.new :int
92
+ h = FFI::MemoryPointer.new :int
93
+ Efl::API.evas_object_geometry_get @evas, x, y, w, h
94
+ [ x.read_int, y.read_int, w.read_int, h.read_int ]
95
+ end
96
+ def color_get
97
+ r = FFI::MemoryPointer.new :int
98
+ g = FFI::MemoryPointer.new :int
99
+ b = FFI::MemoryPointer.new :int
100
+ a = FFI::MemoryPointer.new :int
101
+ Efl::API.evas_object_color_get @evas, r, g, b, a
102
+ [ r.read_int, g.read_int, b.read_int, a.read_int ]
103
+ end
104
+ end
105
+ end
106
+ end
107
+ #
108
+ # EOF
data/lib/efl/ffi.rb ADDED
@@ -0,0 +1,63 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'ffi'
5
+ #
6
+ module Efl
7
+ #
8
+ module API
9
+ #
10
+ extend FFI::Library
11
+ #
12
+ def attach_fcts fcts
13
+ fcts.each do |func|
14
+ begin
15
+ attach_function(*func)
16
+ rescue Object => e
17
+ puts "Could not attach #{func} #{e.message}"
18
+ end
19
+ end
20
+ end
21
+ module_function :attach_fcts
22
+ #
23
+ typedef :pointer, :int_p
24
+ typedef :pointer, :uint_p
25
+ typedef :pointer, :void_p
26
+ typedef :pointer, :uchar_p
27
+ typedef :pointer, :float_p
28
+ typedef :pointer, :double_p
29
+ typedef :pointer, :string_array
30
+ typedef :pointer, :string_array_p
31
+ #
32
+ typedef :pointer, :eina_list_p
33
+ typedef :pointer, :eina_iterator_p
34
+ typedef :pointer, :eina_accessor_p
35
+ typedef :pointer, :evas_p
36
+ typedef :pointer, :evas_object_p
37
+ #
38
+ end
39
+ #
40
+ module Helper
41
+ def self.included m
42
+ m.class_eval "def ptr; @ptr; end"
43
+ m.class_eval "def self.func_prefixes; @func_prefixes; end"
44
+ m.class_eval "def self.inherited sub; sub.class_eval 'def self.func_prefixes; superclass.func_prefixes; end'; end"
45
+ end
46
+ def method_missing m, *args, &block
47
+ self.class.func_prefixes.each do |p|
48
+ sym = p+m.to_s
49
+ if Efl::API.respond_to? sym
50
+ self.class.class_eval "def #{m} *args, █ r=Efl::API.#{sym}(@ptr,*args); yield r if block_given?; r; end"
51
+ return self.send m, *args, &block
52
+ end
53
+ end
54
+ r = Efl::API.send m, @ptr, *args
55
+ self.class.class_eval "def #{m} *args, █ r=Efl::API.#{m}(@ptr,*args); yield r if block_given?; r; end"
56
+ r
57
+ end
58
+ end
59
+ end
60
+ #
61
+ require 'efl/eina/eina_types-ffi'
62
+ #
63
+ # EOF
data/lib/efl.rb ADDED
@@ -0,0 +1,14 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ #
5
+ module Efl
6
+ # autoload :Eina, './lib/efl/eina.rb'
7
+ autoload :Eet, './lib/efl/eet.rb'
8
+ autoload :Evas, './lib/efl/evas.rb'
9
+ autoload :Ecore, './lib/efl/ecore.rb'
10
+ autoload :Edje, './lib/efl/edje.rb'
11
+ autoload :Elm, './lib/efl/elementary.rb'
12
+ end
13
+ #
14
+ # EOF
@@ -0,0 +1,43 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ecore_getopt'
5
+ #
6
+ describe Efl::EcoreGetopt do
7
+ #
8
+ it "should run a single iteration of the mainloop" do
9
+ Efl::Ecore.init
10
+ # puts Efl::EcoreGetopt::EcoreGetopt.methods.sort
11
+ # eg = Efl::EcoreGetopt::EcoreGetopt.new
12
+ # val1 = Efl::API::Ecore_Getopt_Value.new
13
+ # val1[:val] =
14
+ # val2 = Efl::API::Ecore_Getopt_Value.new
15
+ #
16
+ verbosity = 0
17
+ egd = Efl::API::Ecore_Getopt_Desc.new
18
+ egd[:shortname] = "V".to_i
19
+ egd[:longname] = FFI::MemoryPointer.from_string "verbose"
20
+ egd[:help] = FFI::MemoryPointer.from_string "increase log verbosity"
21
+ egd[:metavar] = 0
22
+ egd[:action] = 1 #:ecore_getopt_type_bool
23
+ egd[:action_param] = 0
24
+
25
+ descs = FFI::MemoryPointer.new :pointer, 2, false
26
+ descs[0] = egd
27
+ descs[1] = FFI::Pointer::NULL
28
+ #
29
+ pointer = FFI::MemoryPointer.new :char, Efl::API::EcoreGetopt.size, false
30
+ ego = Efl::API::EcoreGetopt.new pointer
31
+ ego[:prog] = FFI::MemoryPointer.from_string "Prog"
32
+ ego[:usage] = FFI::MemoryPointer.from_string "Usage"
33
+ ego[:version] = FFI::MemoryPointer.from_string "0.0.0"
34
+ ego[:copyright] = FFI::MemoryPointer.from_string "less"
35
+ ego[:license] = FFI::MemoryPointer.from_string "MIT"
36
+ ego[:description] = FFI::MemoryPointer.from_string "description"
37
+ ego[:strict] = 1
38
+ ego[:descs] = descs
39
+ args = Efl::EcoreGetopt.parse(ego.to_ptr, FFI::MemoryPointer::NULL, 1, "--help");
40
+ Efl::Ecore.shutdown
41
+ end
42
+ #
43
+ end
@@ -0,0 +1,151 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ecore'
5
+ #
6
+ describe Efl::Ecore do
7
+ #
8
+ include Efl
9
+ #
10
+ before(:all) do
11
+ USER_SIGNAL_CB = Proc.new do |data, type, event|
12
+ data.read_string.should eql "ok"
13
+ type.should eql Ecore::EVENT_SIGNAL_USER
14
+ event.read_int.should eql 666
15
+ Ecore.event_current_type_get.should eql Ecore::EVENT_SIGNAL_USER
16
+ Ecore.event_current_event_get.address.should eql event.address
17
+ Ecore.main_loop_quit
18
+ end
19
+ EVENT_FREE_CB = Proc.new do |data,event|
20
+ data.read_string.should eql "none"
21
+ event.read_int.should eql 666
22
+ end
23
+ OK = FFI::MemoryPointer.from_string "ok"
24
+ KO = FFI::MemoryPointer.from_string "ko"
25
+ NONE = FFI::MemoryPointer.from_string "none"
26
+ end
27
+ #
28
+ it "should init" do
29
+ Ecore.init.should eql 1
30
+ Ecore.init.should eql 2
31
+ Ecore.init.should eql 3
32
+ end
33
+ #
34
+ it "should shutdown" do
35
+ Ecore.shutdown.should eql 2
36
+ Ecore.shutdown.should eql 1
37
+ Ecore.shutdown.should eql 0
38
+ end
39
+ #
40
+ it "should run a single iteration of the mainloop" do
41
+ Ecore.init
42
+ Ecore.main_loop_iterate
43
+ Ecore.shutdown
44
+ end
45
+ #
46
+ it 'should write and read data from pipe' do
47
+ data = FFI::MemoryPointer.from_string("none")
48
+ cb = Proc.new do |data,buffer,bytes|
49
+ data.read_string.should eql 'none'
50
+ buffer.read_string.should eql 'hello world'
51
+ bytes.should eql 12
52
+ end
53
+ Ecore.init
54
+ pipe = Ecore::EcorePipe.new cb, data
55
+ pipe.write("hello world").should be_true
56
+ Ecore.main_loop_iterate
57
+ pipe.read_close
58
+ pipe.write_close
59
+ pipe.del.address.should eql data.address
60
+ Ecore.shutdown
61
+ end
62
+ #
63
+ it 'should be able to add, del event hanlder and process event' do
64
+ Ecore.init
65
+ evt = FFI::MemoryPointer.new(:int)
66
+ evt.write_int 666
67
+ # add, del, add event handler
68
+ evt_handler = Ecore.event_handler_add Ecore::EVENT_SIGNAL_USER, USER_SIGNAL_CB, KO
69
+ evt_handler.null?.should be_false
70
+ Ecore.event_handler_del(evt_handler).address.should eql KO.address
71
+ evt_handler = Ecore.event_handler_add Ecore::EVENT_SIGNAL_USER, USER_SIGNAL_CB, OK
72
+ evt_handler.null?.should be_false
73
+ # add, del, add event
74
+ ecore_evt = Ecore.event_add Ecore::EVENT_SIGNAL_USER, evt, EVENT_FREE_CB, NONE
75
+ ecore_evt.null?.should be_false
76
+ Ecore.event_del(ecore_evt).address.should eql NONE.address
77
+ ecore_evt = Ecore.event_add Ecore::EVENT_SIGNAL_USER, evt, EVENT_FREE_CB, NONE
78
+ ecore_evt.null?.should be_false
79
+ Ecore.main_loop_begin # process event
80
+ Ecore.shutdown
81
+ end
82
+ #
83
+ it "should be able to get and set event handler data" do
84
+ Ecore.init
85
+ evt = FFI::MemoryPointer.new(:int)
86
+ evt.write_int 666
87
+ evt_handler = Ecore.event_handler_add Ecore::EVENT_SIGNAL_USER, USER_SIGNAL_CB, KO
88
+ evt_handler.null?.should be_false
89
+ Ecore.event_handler_data_get(evt_handler).read_string.should eql "ko"
90
+ Ecore.event_handler_data_set(evt_handler, OK).address.should eql KO.address
91
+ Ecore.event_handler_data_get(evt_handler).read_string.should eql "ok"
92
+ ecore_evt = Ecore.event_add Ecore::EVENT_SIGNAL_USER, evt, EVENT_FREE_CB, NONE
93
+ ecore_evt.null?.should be_false
94
+ Ecore.main_loop_begin # process event
95
+ Ecore.shutdown
96
+ end
97
+ #
98
+ it "should be able to create new event type" do
99
+ Ecore.init
100
+ Ecore.event_type_new.should_not eql 0
101
+ Ecore.event_type_new.should_not eql 0
102
+ Ecore.event_type_new.should_not eql 0
103
+ Ecore.shutdown
104
+ end
105
+ #
106
+ it "should be possible to add and del event filters" do
107
+ Ecore.init
108
+ loop_data = FFI::MemoryPointer.from_string("loop_data")
109
+ event_free_cb = Proc.new do |data,event|
110
+ data.read_string.should eql "ko"
111
+ event.read_int.should eql 69
112
+ end
113
+ start_cb = Proc.new do |data|
114
+ data.read_string.should eql "ok"
115
+ loop_data
116
+ end
117
+ count = 0
118
+ filter_cb = Proc.new do |data,loop_data,type,event|
119
+ data.read_string.should eql "ok"
120
+ loop_data.read_string.should eql "loop_data"
121
+ type.should eql Ecore::EVENT_SIGNAL_USER
122
+ count += 1
123
+ if event.read_int == 69
124
+ count.should eql 1
125
+ false # drop first event
126
+ else
127
+ count.should eql 2
128
+ event.read_int.should eql 666
129
+ true
130
+ end
131
+ end
132
+ end_cb = Proc.new do |data,loop_data|
133
+ data.read_string.should eql "ok"
134
+ loop_data.read_string.should eql "loop_data"
135
+ end
136
+ filter = Ecore.event_filter_add start_cb, filter_cb, end_cb, OK
137
+ Ecore.event_handler_add Ecore::EVENT_SIGNAL_USER, USER_SIGNAL_CB, OK
138
+ e1 = FFI::MemoryPointer.new(:int)
139
+ e1.write_int 69
140
+ evt1 = Ecore.event_add Ecore::EVENT_SIGNAL_USER, e1, event_free_cb, KO
141
+ e2 = FFI::MemoryPointer.new(:int)
142
+ e2.write_int 666
143
+ evt2 = Ecore.event_add Ecore::EVENT_SIGNAL_USER, e2, EVENT_FREE_CB, NONE
144
+ Ecore.main_loop_begin # process event
145
+ Ecore.event_filter_del(filter).address.should eql OK.address
146
+ evt2 = Ecore.event_add Ecore::EVENT_SIGNAL_USER, e2, EVENT_FREE_CB, NONE
147
+ Ecore.main_loop_begin # process event
148
+ Ecore.shutdown
149
+ end
150
+ #
151
+ end
data/spec/edje_spec.rb ADDED
@@ -0,0 +1,22 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/edje'
5
+ #
6
+ describe Efl::Edje do
7
+ #
8
+ include Efl
9
+ #
10
+ it "should init" do
11
+ Edje.init.should eql 1
12
+ Edje.init.should eql 2
13
+ Edje.init.should eql 3
14
+ end
15
+ #
16
+ it "should shutdown" do
17
+ Edje.shutdown.should eql 2
18
+ Edje.shutdown.should eql 1
19
+ Edje.shutdown.should eql 0
20
+ end
21
+ #
22
+ end
data/spec/eet_spec.rb ADDED
@@ -0,0 +1,107 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/eet'
5
+ #
6
+ describe Efl::Eet do
7
+ #
8
+ include Efl
9
+ #
10
+ FP = '/tmp/_eet.cfg'
11
+ #
12
+ it "should init" do
13
+ Eet.init.should eql 1
14
+ Eet.init.should eql 2
15
+ Eet.init.should eql 3
16
+ end
17
+ #
18
+ it "should shutdown" do
19
+ Eet.shutdown.should eql 2
20
+ Eet.shutdown.should eql 1
21
+ Eet.shutdown.should eql 0
22
+ end
23
+ #
24
+ it "should clearcache" do
25
+ Eet.clearcache
26
+ Eet.clearcache
27
+ Eet.clearcache
28
+ end
29
+ #
30
+ it "should have good enums" do
31
+ Efl::API.enum_type(:eet_file_mode)[:eet_file_mode_invalid].should eql -1
32
+ Efl::API.enum_type(:eet_file_mode)[:eet_file_mode_read].should eql 0
33
+ Efl::API.enum_type(:eet_file_mode)[:eet_file_mode_write].should eql 1
34
+ Efl::API.enum_type(:eet_file_mode)[:eet_file_mode_read_write].should eql 2
35
+ end
36
+ #
37
+ it "should open and close" do
38
+ Eet.init
39
+ f = Eet.open FP, Efl::API.enum_type(:eet_file_mode)[:eet_file_mode_write]
40
+ f.write 'fake', 'value'
41
+ f.close
42
+ Eet.shutdown
43
+ end
44
+ #
45
+ it "should be able to get file access mode" do
46
+ Eet.init
47
+ Efl::API.enum_type(:eet_file_mode).symbols.each do |m|
48
+ next if m==:eet_file_mode_invalid
49
+ Eet.open FP, Efl::API.enum_type(:eet_file_mode)[m] do |f|
50
+ f.mode_get.should eql m
51
+ end
52
+ end
53
+ Eet.shutdown
54
+ end
55
+ #
56
+ it "should write" do
57
+ Eet.init
58
+ f = Eet.open FP, :eet_file_mode_write
59
+ f.mode_get.should eql :eet_file_mode_write
60
+ f.write 'config', 'test key'
61
+ f.close
62
+ Eet.shutdown
63
+ end
64
+ #
65
+ it "should read" do
66
+ Eet.init
67
+ f = Eet.open FP, :eet_file_mode_read
68
+ f.mode_get.should eql :eet_file_mode_read
69
+ f.read('config').should eql 'test key'
70
+ f.close
71
+ Eet.shutdown
72
+ end
73
+ #
74
+ it "should read/write" do
75
+ Eet.init
76
+ f = Eet.open FP, :eet_file_mode_read_write
77
+ f.write 'configg', 'test key'
78
+ f.read('configg').should eql 'test key'
79
+ f.close
80
+ Eet.shutdown
81
+ end
82
+ #
83
+ it "should write in block" do
84
+ Eet.init
85
+ Eet.open FP, :eet_file_mode_write do |f|
86
+ f.write 'config2', 'test--key'
87
+ end
88
+ Eet.shutdown
89
+ end
90
+ #
91
+ it "should read in block" do
92
+ Eet.init
93
+ Eet.open FP, :eet_file_mode_read do |f|
94
+ f.read('config2').should eql 'test--key'
95
+ end
96
+ Eet.shutdown
97
+ end
98
+ #
99
+ it "should read/write in block" do
100
+ Eet.init
101
+ Eet.open FP, :eet_file_mode_read_write do |f|
102
+ f.write 'config22', 'test--key'
103
+ f.read('config22').should eql 'test--key'
104
+ end
105
+ Eet.shutdown
106
+ end
107
+ end
data/spec/evas_spec.rb ADDED
@@ -0,0 +1,103 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/evas'
5
+ #
6
+ describe Efl::Evas do
7
+ #
8
+ include Efl
9
+ #
10
+ it "should init" do
11
+ Evas.init.should eql 1
12
+ Evas.init.should eql 2
13
+ Evas.init.should eql 3
14
+ end
15
+ #
16
+ it "should shutdown" do
17
+ Evas.shutdown.should eql 2
18
+ Evas.shutdown.should eql 1
19
+ Evas.shutdown.should eql 0
20
+ end
21
+ #
22
+ it "evas alloc error enum is ok" do
23
+ Efl::API.enum_value(:evas_alloc_error_none).should eql 0
24
+ Efl::API.enum_value(:evas_alloc_error_fatal).should eql 1
25
+ Efl::API.enum_value(:evas_alloc_error_recovered).should eql 2
26
+ Efl::API.enum_type(:evas_alloc_error)[0].should eql :evas_alloc_error_none
27
+ Efl::API.enum_type(:evas_alloc_error)[1].should eql :evas_alloc_error_fatal
28
+ Efl::API.enum_type(:evas_alloc_error)[2].should eql :evas_alloc_error_recovered
29
+ Efl::API.enum_type(:evas_alloc_error)[:evas_alloc_error_none].should eql 0
30
+ Efl::API.enum_type(:evas_alloc_error)[:evas_alloc_error_fatal].should eql 1
31
+ Efl::API.enum_type(:evas_alloc_error)[:evas_alloc_error_recovered].should eql 2
32
+ end
33
+ #
34
+ it "should have no memory allocation error occured" do
35
+ Evas.init
36
+ Evas.alloc_error.should eql :evas_alloc_error_none
37
+ Evas.shutdown
38
+ end
39
+ #
40
+ it "should process async events" do
41
+ cb = Proc.new do |target,type,evt|
42
+ target.read_string.should eql "target"
43
+ type.should eql :evas_callback_show
44
+ evt.read_string.should eql "work"
45
+ end
46
+ Evas.init
47
+ target = FFI::MemoryPointer.from_string("target")
48
+ work = FFI::MemoryPointer.from_string("work")
49
+ Evas.async_events_put target, :evas_callback_show, work, cb
50
+ Evas.async_events_process.should eql 1
51
+ Evas.async_events_process.should eql 0
52
+ Evas.shutdown
53
+ end
54
+ #
55
+ describe Efl::Evas::Evas do
56
+ it "should be able to create and destroy evas" do
57
+ e1 = Evas::Evas.new
58
+ e1.ptr.address.should_not eql 0
59
+ e2 = Evas::Evas.new e1
60
+ e1.ptr.address.should eql e2.ptr.address
61
+ e3 = Evas::Evas.new e1.ptr
62
+ e1.ptr.address.should eql e3.ptr.address
63
+ e2.ptr.address.should eql e3.ptr.address
64
+ (e1==e2).should be_false
65
+ (e2==e3).should be_false
66
+ (e1==e3).should be_false
67
+ (e1===e2).should be_true
68
+ (e2===e3).should be_true
69
+ (e1===e3).should be_true
70
+ e1.free
71
+ e1.ptr.should be_nil
72
+ e4 = Evas::Evas.new Efl::API.evas_new
73
+ e4.ptr.address.should_not eql 0
74
+ e5 = e4.dup
75
+ e4.ptr.address.should eql e5.ptr.address
76
+ e6 = e4.clone
77
+ e4.ptr.address.should eql e6.ptr.address
78
+ e4.free
79
+ e4.ptr.should be_nil
80
+ end
81
+ #
82
+ it "focus should work" do
83
+ e = Evas::Evas.new
84
+ Efl::API.evas_focus_in e.ptr
85
+ Efl::API.evas_focus_state_get(e.ptr).should be_true
86
+ Efl::API.evas_focus_out e.ptr
87
+ Efl::API.evas_focus_state_get(e.ptr).should be_false
88
+ Efl::Evas.focus_in e.ptr
89
+ Efl::Evas.focus_state_get(e.ptr).should be_true
90
+ Efl::Evas.focus_out e.ptr
91
+ Efl::Evas.focus_state_get(e.ptr).should be_false
92
+ e.focus_in { |r| r.should be_nil }
93
+ e.focus_state_get.should be_true
94
+ e.focus_state_get { |r| r.should be_true }
95
+ e.focus_out.should be_nil
96
+ e.focus_state_get.should be_false
97
+ e.focus_state_get { |r| r.should be_false }
98
+ e.free
99
+ end
100
+ #
101
+ end
102
+ #
103
+ end
data/tasks/ann.rake ADDED
@@ -0,0 +1,83 @@
1
+ # -*- coding: UTF-8 -*-
2
+ #
3
+ begin
4
+ require 'bones/smtp_tls'
5
+ rescue LoadError
6
+ require 'net/smtp'
7
+ end
8
+ require 'time'
9
+
10
+ namespace :ann do
11
+
12
+ # A prerequisites task that all other tasks depend upon
13
+ task :prereqs
14
+ file PROJ.ann.file do
15
+ ann = PROJ.ann
16
+ puts "Generating #{ann.file}"
17
+ File.open(ann.file,'w') do |fd|
18
+ fd.puts("#{PROJ.name} version #{PROJ.version}")
19
+ fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
20
+ fd.puts(" #{PROJ.url}") if PROJ.url.valid?
21
+ fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
22
+ fd.puts
23
+ fd.puts("== DESCRIPTION")
24
+ fd.puts
25
+ fd.puts(PROJ.description)
26
+ fd.puts
27
+ fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
28
+ fd.puts
29
+ ann.paragraphs.each do |p|
30
+ fd.puts "== #{p.upcase}"
31
+ fd.puts
32
+ fd.puts paragraphs_of(PROJ.readme_file, p).join("\n\n")
33
+ fd.puts
34
+ end
35
+ fd.puts ann.text if ann.text
36
+ end
37
+ end
38
+
39
+ desc "Create an announcement file"
40
+ task :announcement => ['ann:prereqs', PROJ.ann.file]
41
+
42
+ desc "Send an email announcement"
43
+ task :email => ['ann:prereqs', PROJ.ann.file] do
44
+ ann = PROJ.ann
45
+ from = ann.email[:from] || Array(PROJ.authors).first || PROJ.email
46
+ to = Array(ann.email[:to])
47
+
48
+ ### build a mail header for RFC 822
49
+ rfc822msg = "From: #{from}\n"
50
+ rfc822msg << "To: #{to.join(',')}\n"
51
+ rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
52
+ rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
53
+ rfc822msg << "\n"
54
+ rfc822msg << "Date: #{Time.new.rfc822}\n"
55
+ rfc822msg << "Message-Id: "
56
+ rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{ann.email[:domain]}>\n\n"
57
+ rfc822msg << File.read(ann.file)
58
+
59
+ params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
60
+ ann.email[key]
61
+ end
62
+
63
+ params[3] = (PROJ.ann.email[:from] || PROJ.email) if params[3].nil?
64
+
65
+ # if ann.email[:tls] and params[4].nil?
66
+ if params[4].nil?
67
+ STDOUT.write "Please enter your e-mail password (#{params[3]}): "
68
+ params[4] = STDIN.gets.chomp
69
+ end
70
+ # params = params.shift 2 if not ann.email[:tls]
71
+
72
+ ### send email
73
+ # TODO find a way to bypass /var/lib/gems/1.9/gems/bones-3.6.5/lib/bones/smtp_tls.rb which forces starttls usage
74
+ Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
75
+ end
76
+ end # namespace :ann
77
+
78
+ desc 'Alias to ann:announcement'
79
+ task :ann => 'ann:announcement'
80
+
81
+ CLOBBER << PROJ.ann.file
82
+
83
+ # EOF