cocoa 0.1.2 → 0.1.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/README.md +12 -8
- data/VERSION +1 -1
- data/cocoa.gemspec +5 -2
- data/examples/hello_world.rb +10 -0
- data/lib/cocoa/bindings/Cocoa.rb +6693 -0
- data/lib/cocoa/extensions.rb +58 -8
- data/lib/cocoa/helpers.rb +23 -429
- data/lib/cocoa/objc.rb +262 -0
- data/lib/cocoa/structs/NSPoint.rb +6 -0
- data/lib/cocoa/structs/NSRange.rb +23 -0
- data/lib/cocoa/structs/NSRect.rb +6 -0
- data/lib/cocoa/structs/NSSize.rb +4 -0
- data/lib/cocoa.rb +2 -6694
- data/spec/cocoa/cocoa_spec.rb +1 -1
- data/tasks/generate.rake +2 -28
- metadata +5 -2
data/lib/cocoa/extensions.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
|
-
class Cocoa::NSObject
|
2
|
-
def self.const_missing name
|
3
|
-
Cocoa.const_get name
|
4
|
-
end
|
5
|
-
end
|
6
|
-
|
7
1
|
class Cocoa::NSString < Cocoa::NSObject
|
8
2
|
def to_s
|
9
|
-
|
3
|
+
ObjC.NSString_to_String(object)
|
10
4
|
end
|
11
5
|
end
|
12
6
|
|
@@ -14,10 +8,66 @@ class String
|
|
14
8
|
def method_missing meth,*args
|
15
9
|
if Cocoa::NSString.method_defined?(meth)
|
16
10
|
str = Cocoa::NSString.new(true)
|
17
|
-
str.object =
|
11
|
+
str.object = ObjC.String_to_NSString(self)
|
18
12
|
str.send(meth,*args)
|
19
13
|
else
|
20
14
|
super
|
21
15
|
end
|
22
16
|
end
|
23
17
|
end
|
18
|
+
|
19
|
+
class Cocoa::NSObject
|
20
|
+
def self.const_missing name
|
21
|
+
Cocoa.const_get name
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.alloc
|
25
|
+
new(true).alloc
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.inherited(parent)
|
29
|
+
include ClassMethods
|
30
|
+
if parent.name
|
31
|
+
klass = ObjC.objc_allocateClassPair(ObjC.objc_getClass(name.split('::').last),parent.name,0)
|
32
|
+
ObjC.objc_registerClassPair(klass)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def initialize allocated=false
|
37
|
+
@klass = ObjC.objc_getClass(self.native_name)
|
38
|
+
unless allocated
|
39
|
+
self.object = @klass
|
40
|
+
new
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def get_class
|
45
|
+
ObjC.objc_getClass(self.native_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
def alloc
|
49
|
+
self.object = ObjC.msgSend(ObjC.objc_getClass(self.native_name),"alloc")
|
50
|
+
self
|
51
|
+
end
|
52
|
+
|
53
|
+
def init
|
54
|
+
self.object = ObjC.msgSend(@object,"init")
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def new
|
59
|
+
self.object = ObjC.msgSend(@object,"new")
|
60
|
+
self
|
61
|
+
end
|
62
|
+
|
63
|
+
def autorelease
|
64
|
+
self.object = ObjC.msgSend(@object,"autorelease")
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
module ClassMethods
|
69
|
+
def native_name
|
70
|
+
self.class.name.split('::').last
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/cocoa/helpers.rb
CHANGED
@@ -7,22 +7,7 @@ module Cocoa; end
|
|
7
7
|
require 'cocoa/structs/NSPoint'
|
8
8
|
require 'cocoa/structs/NSSize'
|
9
9
|
require 'cocoa/structs/NSRect'
|
10
|
-
|
11
|
-
class Cocoa::CFRange < FFI::Struct
|
12
|
-
def initialize *args
|
13
|
-
options = args.first
|
14
|
-
if options.is_a? Hash
|
15
|
-
self[:location] = options[:location]
|
16
|
-
self[:length] = options[:length]
|
17
|
-
else
|
18
|
-
super *args
|
19
|
-
end
|
20
|
-
end
|
21
|
-
def to_s
|
22
|
-
"<CFRange: #{self[:location]} #{self[:length]}>"
|
23
|
-
end
|
24
|
-
layout :location, :long_long, :length, :long_long
|
25
|
-
end
|
10
|
+
require 'cocoa/structs/NSRange'
|
26
11
|
|
27
12
|
module Cocoa
|
28
13
|
|
@@ -31,76 +16,20 @@ module Cocoa
|
|
31
16
|
end
|
32
17
|
def instance_for data
|
33
18
|
if data.is_a?(FFI::Pointer)
|
34
|
-
@@instances[data.address] ||= translate_retval nil,data,'@'
|
19
|
+
@@instances[data.address] ||= ObjC.translate_retval nil,data,'@'
|
35
20
|
else
|
36
21
|
data
|
37
22
|
end
|
38
23
|
end
|
39
24
|
|
40
|
-
def NSMakeSize width,height
|
41
|
-
CGSize.new(width: width, height: height)
|
42
|
-
end
|
43
|
-
def NSMakePoint x,y
|
44
|
-
CGPoint.new(x: x, y: y)
|
45
|
-
end
|
46
|
-
def CGRectMake x,y,width,height
|
47
|
-
CGRect.new(x: x, y: y, width: width, height: height)
|
48
|
-
end
|
49
|
-
NSZeroPoint = CGPoint.new(x: 0, y: 0)
|
50
|
-
NSZeroRect = CGRect.new(x: 0, y: 0, width: 0, height: 0)
|
51
|
-
|
52
|
-
def CFRangeMake loc,len
|
53
|
-
CFRange.new(location: loc, length: len)
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.String_to_NSString( string )
|
57
|
-
nsstring_class = ObjC.objc_getClass("NSString")
|
58
|
-
ObjC.msgSend( nsstring_class, "stringWithUTF8String:",
|
59
|
-
:string, string )
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.NSString_to_String( nsstring_pointer )
|
63
|
-
c_string_pointer = ObjC.msgSend( nsstring_pointer, "UTF8String" )
|
64
|
-
if c_string_pointer.null?
|
65
|
-
return "(NULL)"
|
66
|
-
else
|
67
|
-
return c_string_pointer.read_string()
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def self.fixed_args args,options={}
|
72
|
-
([args.first]+options.values).map do |arg|
|
73
|
-
case arg
|
74
|
-
when TrueClass
|
75
|
-
[:bool,arg]
|
76
|
-
when FalseClass
|
77
|
-
[:bool,arg]
|
78
|
-
when Fixnum
|
79
|
-
[:int,arg]
|
80
|
-
when String
|
81
|
-
[:pointer,Cocoa.String_to_NSString(arg)]
|
82
|
-
when NilClass
|
83
|
-
[:pointer,nil]
|
84
|
-
when Symbol
|
85
|
-
[:pointer,ObjC.sel_registerName("#{arg}:")]
|
86
|
-
when NSObject
|
87
|
-
[:pointer,arg.object]
|
88
|
-
when FFI::Struct
|
89
|
-
[arg.class.by_value,arg]
|
90
|
-
else
|
91
|
-
raise ArgumentError
|
92
|
-
end
|
93
|
-
end.flatten
|
94
|
-
end
|
95
|
-
|
96
25
|
def self.attach_nsstring_getter method
|
97
26
|
raw = "get_objc_#{method}".to_sym
|
98
27
|
attach_variable raw, method, :pointer
|
99
28
|
if /[A-Z]/ =~ method.to_s[0]
|
100
|
-
Cocoa.const_set(method,
|
29
|
+
Cocoa.const_set(method,ObjC.NSString_to_String(send(raw)))
|
101
30
|
else
|
102
31
|
define_singleton_method method do
|
103
|
-
|
32
|
+
ObjC.NSString_to_String(send(raw))
|
104
33
|
end
|
105
34
|
end
|
106
35
|
end
|
@@ -121,150 +50,6 @@ module Cocoa
|
|
121
50
|
end
|
122
51
|
end
|
123
52
|
|
124
|
-
def self.apple_type_to_ffi type
|
125
|
-
# TODO: These are just stubbed on guess - check'em'all
|
126
|
-
case type
|
127
|
-
when 'C'
|
128
|
-
:uchar
|
129
|
-
when '@'
|
130
|
-
:pointer
|
131
|
-
when '#'
|
132
|
-
:pointer
|
133
|
-
when 'Q'
|
134
|
-
:int
|
135
|
-
when ':'
|
136
|
-
:pointer
|
137
|
-
when 'I'
|
138
|
-
:int
|
139
|
-
when 'L'
|
140
|
-
:int
|
141
|
-
when 'd'
|
142
|
-
:double
|
143
|
-
when 'f'
|
144
|
-
:float
|
145
|
-
when 'i'
|
146
|
-
:int
|
147
|
-
when 's'
|
148
|
-
:int
|
149
|
-
when 'q'
|
150
|
-
:long_long
|
151
|
-
when 'S'
|
152
|
-
:int
|
153
|
-
when /^\^/
|
154
|
-
:pointer
|
155
|
-
when 'B'
|
156
|
-
:bool
|
157
|
-
when 'v'
|
158
|
-
:void
|
159
|
-
when '[5*]'
|
160
|
-
:void
|
161
|
-
when /^{[^=]*=.*}$/
|
162
|
-
begin
|
163
|
-
/^{_*([^=]*)=.*}$/.match(type)[1].constantize.by_value
|
164
|
-
rescue => e
|
165
|
-
begin
|
166
|
-
"Cocoa::#{/^{_*([^=]*)=.*}$/.match(type)[1]}".constantize.by_value
|
167
|
-
rescue => e
|
168
|
-
match = /^{_*([^=]*)=(.*)}$/.match(type)
|
169
|
-
klass = begin
|
170
|
-
Cocoa.const_get(match[1])
|
171
|
-
rescue
|
172
|
-
# puts "defining struct Cocoa::#{match[1]} as #{match[2]}"
|
173
|
-
# this stuff doesnt work with jruby
|
174
|
-
klass = Class.new(FFI::Struct)
|
175
|
-
Cocoa.const_set(match[1], klass)
|
176
|
-
name = 'a'
|
177
|
-
layout = []
|
178
|
-
match[2].each_char do |c|
|
179
|
-
case c
|
180
|
-
when 'd'
|
181
|
-
layout << name.to_sym
|
182
|
-
name = name.next
|
183
|
-
layout << :double
|
184
|
-
end
|
185
|
-
end
|
186
|
-
klass = "Cocoa::#{match[1]}".constantize
|
187
|
-
klass.layout *layout
|
188
|
-
klass
|
189
|
-
end
|
190
|
-
klass.by_ref
|
191
|
-
end
|
192
|
-
end
|
193
|
-
when nil
|
194
|
-
:void
|
195
|
-
when '*' # character string
|
196
|
-
:pointer
|
197
|
-
when '@?'
|
198
|
-
:pointer
|
199
|
-
else
|
200
|
-
raise type.inspect
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
def self.translate_retval method,ret,type
|
205
|
-
case type
|
206
|
-
when '@'
|
207
|
-
return nil if ret.address == 0
|
208
|
-
return ret if method == :NSStringFromClass
|
209
|
-
klass_name = Cocoa::NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,"class")))
|
210
|
-
return self if klass_name == '(NULL)'
|
211
|
-
instance = begin
|
212
|
-
("Cocoa::"+klass_name).constantize.new(true)
|
213
|
-
rescue
|
214
|
-
klass_name = if klass_name =~ /^__NSCF/
|
215
|
-
"NS#{klass_name[6..-1]}"
|
216
|
-
elsif klass_name[0]=='_'
|
217
|
-
"FIX_#{klass_name}"
|
218
|
-
else
|
219
|
-
klass_name
|
220
|
-
end
|
221
|
-
klass = begin
|
222
|
-
Cocoa.const_get(klass_name)
|
223
|
-
rescue => e
|
224
|
-
superclass_name = Cocoa::NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,'superclass')))
|
225
|
-
superclass = "Cocoa::#{superclass_name}".constantize
|
226
|
-
proxy = Class.new(superclass)
|
227
|
-
Cocoa.const_set(klass_name, proxy)
|
228
|
-
klass = ("Cocoa::"+klass_name).constantize
|
229
|
-
superclass.inherited(klass)
|
230
|
-
klass
|
231
|
-
end
|
232
|
-
klass.new(true)
|
233
|
-
end
|
234
|
-
instance.object = ret
|
235
|
-
instance
|
236
|
-
when '#'
|
237
|
-
ret
|
238
|
-
when /^{([^=]*)=.*}$/
|
239
|
-
ret
|
240
|
-
when /^\^{[^=]*=.*}$/
|
241
|
-
return nil if ret.address == 0
|
242
|
-
klass_name = Cocoa::NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,"class")))
|
243
|
-
return self if klass_name == '(NULL)'
|
244
|
-
instance = begin
|
245
|
-
("Cocoa::"+klass_name).constantize.new(true)
|
246
|
-
rescue
|
247
|
-
klass_name = "FIX_#{klass_name}" if klass_name[0]=='_'
|
248
|
-
klass = begin
|
249
|
-
Cocoa.const_get(klass_name)
|
250
|
-
rescue => e
|
251
|
-
superclass_name = Cocoa::NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,'superclass')))
|
252
|
-
superclass = "Cocoa::#{superclass_name}".constantize
|
253
|
-
proxy = Class.new(superclass)
|
254
|
-
Cocoa.const_set(klass_name, proxy)
|
255
|
-
klass = ("Cocoa::"+klass_name).constantize
|
256
|
-
superclass.inherited(klass)
|
257
|
-
klass
|
258
|
-
end
|
259
|
-
klass.new(true)
|
260
|
-
end
|
261
|
-
instance.object = ret
|
262
|
-
instance
|
263
|
-
else
|
264
|
-
raise type
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
53
|
def self.attach_method method,*params
|
269
54
|
if params.first.is_a? Array
|
270
55
|
params = params.last
|
@@ -272,9 +57,9 @@ module Cocoa
|
|
272
57
|
|
273
58
|
params = params.extract_options!
|
274
59
|
params.freeze
|
275
|
-
|
276
|
-
|
277
|
-
attach_function "call_#{method}".to_sym, method, [], apple_type_to_ffi(params[:retval])
|
60
|
+
begin
|
61
|
+
if params[:args] == 0
|
62
|
+
attach_function "call_#{method}".to_sym, method, [], ObjC.apple_type_to_ffi(params[:retval])
|
278
63
|
define_method method do
|
279
64
|
case params[:retval]
|
280
65
|
when /^\^{[^=]*=.*}$/
|
@@ -283,172 +68,27 @@ module Cocoa
|
|
283
68
|
raise params.inspect
|
284
69
|
end
|
285
70
|
end
|
286
|
-
|
287
|
-
|
288
|
-
end
|
289
|
-
else
|
290
|
-
begin
|
291
|
-
attach_function "call_#{method}".to_sym, method, params[:types].map{ |arg| apple_type_to_ffi(arg) }, apple_type_to_ffi(params[:retval])
|
71
|
+
else
|
72
|
+
attach_function "call_#{method}".to_sym, method, params[:types].map{ |arg| ObjC.apple_type_to_ffi(arg) }, ObjC.apple_type_to_ffi(params[:retval])
|
292
73
|
define_method method do |*args|
|
293
74
|
raise ArgumentError.new("#{method} requires #{params[:args]} argument(s)") unless params[:args] == args.size
|
294
|
-
|
295
|
-
args.each_with_index do |arg,i|
|
296
|
-
case params[:types][i]
|
297
|
-
when '@'
|
298
|
-
fixed_args << arg
|
299
|
-
when 'd'
|
300
|
-
if arg.is_a?(Fixnum)
|
301
|
-
fixed_args << arg.to_f
|
302
|
-
else
|
303
|
-
raise ArgumentError.new("float expected, got #{arg.class.name}") unless arg.is_a?(Float)
|
304
|
-
fixed_args << arg
|
305
|
-
end
|
306
|
-
when 'I'
|
307
|
-
raise ArgumentError unless arg.is_a?(Fixnum)
|
308
|
-
fixed_args << arg
|
309
|
-
when 'Q'
|
310
|
-
raise ArgumentError.new(arg.inspect) unless arg.is_a?(Fixnum)
|
311
|
-
fixed_args << arg
|
312
|
-
when 'q'
|
313
|
-
raise ArgumentError unless arg.is_a?(Fixnum)
|
314
|
-
fixed_args << arg
|
315
|
-
when '#'
|
316
|
-
raise ArgumentError unless arg.is_a?(FFI::Pointer)
|
317
|
-
fixed_args << arg
|
318
|
-
when /^{[^=]*=.*}$/
|
319
|
-
raise ArgumentError.new(arg.inspect) unless arg.kind_of?(FFI::Struct)
|
320
|
-
fixed_args << arg
|
321
|
-
when /^\^{([^=]*)=.*}$/
|
322
|
-
case arg
|
323
|
-
when FFI::Pointer
|
324
|
-
fixed_args << arg
|
325
|
-
when Array
|
326
|
-
raise ArgumentError unless $1 == '__CFArray'
|
327
|
-
fixed_args << NSArray.arrayWithObjects(arg).object
|
328
|
-
else
|
329
|
-
match = $1
|
330
|
-
if arg.class.name =~ /^Cocoa::/ # "Cocoa::#{$1}".constantize
|
331
|
-
fixed_args << arg.object
|
332
|
-
elsif arg.is_a?(NilClass)
|
333
|
-
fixed_args << FFI::MemoryPointer::NULL
|
334
|
-
elsif arg.is_a?(String) && match == '__CFString'
|
335
|
-
fixed_args << Cocoa::String_to_NSString(arg)
|
336
|
-
else
|
337
|
-
raise ArgumentError.new("expected #{params[:types][i]} got #{arg.class.name} (#{match})")
|
338
|
-
end
|
339
|
-
end
|
340
|
-
when '^d'
|
341
|
-
raise ArgumentError unless arg.is_a?(Array)
|
342
|
-
arr = FFI::MemoryPointer.new(:double,arg.size)
|
343
|
-
arr.write_array_of_double(arg)
|
344
|
-
fixed_args << arr
|
345
|
-
when '^v'
|
346
|
-
raise ArgumentError unless arg.is_a?(NilClass)
|
347
|
-
fixed_args << FFI::MemoryPointer::NULL
|
348
|
-
else
|
349
|
-
raise params[:types][i]
|
350
|
-
end
|
351
|
-
end
|
352
|
-
ret = send("call_#{method}".to_sym,*fixed_args)
|
75
|
+
ret = send("call_#{method}".to_sym,*ObjC.call_arguments(params,args))
|
353
76
|
if params[:retval]=='v'
|
354
77
|
self
|
355
78
|
else
|
356
|
-
|
79
|
+
ObjC.translate_retval(method,ret,params[:retval])
|
357
80
|
end
|
358
81
|
end
|
359
|
-
rescue FFI::NotFoundError => e
|
360
|
-
# puts "!!!"
|
361
|
-
# puts e.message
|
362
82
|
end
|
83
|
+
rescue FFI::NotFoundError => e
|
363
84
|
end
|
364
85
|
end
|
365
86
|
extend self
|
366
87
|
|
367
88
|
class NSObject
|
368
|
-
|
369
|
-
def self.inherited(parent)
|
370
|
-
if parent.name
|
371
|
-
klass = ObjC.objc_allocateClassPair(ObjC.objc_getClass(name.split('::').last),parent.name,0)
|
372
|
-
ObjC.objc_registerClassPair(klass)
|
373
|
-
end
|
374
|
-
end
|
375
|
-
|
376
|
-
def initialize allocated=false
|
377
|
-
@klass = ObjC.objc_getClass(self.class.name.split('::').last)
|
378
|
-
unless allocated
|
379
|
-
self.object = @klass
|
380
|
-
new
|
381
|
-
end
|
382
|
-
end
|
383
|
-
def self.alloc
|
384
|
-
new(true).alloc
|
385
|
-
end
|
386
|
-
def get_class
|
387
|
-
ObjC.objc_getClass(self.class.name.split('::').last)
|
388
|
-
end
|
389
|
-
def alloc
|
390
|
-
self.object = ObjC.msgSend(ObjC.objc_getClass(self.class.name.split('::').last),"alloc")
|
391
|
-
self
|
392
|
-
end
|
393
|
-
def init
|
394
|
-
self.object = ObjC.msgSend(@object,"init")
|
395
|
-
self
|
396
|
-
end
|
397
|
-
def new
|
398
|
-
self.object = ObjC.msgSend(@object,"new")
|
399
|
-
self
|
400
|
-
end
|
401
|
-
def autorelease
|
402
|
-
self.object = ObjC.msgSend(@object,"autorelease")
|
403
|
-
self
|
404
|
-
end
|
405
|
-
# protected
|
406
89
|
attr_accessor :klass
|
407
90
|
attr_reader :object
|
408
91
|
|
409
|
-
def self.fixed_args args,params={},types=[],options={}
|
410
|
-
if options[:variadic]
|
411
|
-
_types = (types.dup*args.size)
|
412
|
-
args
|
413
|
-
else
|
414
|
-
_types = types.dup
|
415
|
-
([args.first]+params.values)
|
416
|
-
end.map do |arg|
|
417
|
-
type = _types.shift
|
418
|
-
case arg
|
419
|
-
when TrueClass, FalseClass
|
420
|
-
[:bool,arg]
|
421
|
-
when Fixnum, Bignum
|
422
|
-
case type
|
423
|
-
when 'q'
|
424
|
-
[:long_long,arg]
|
425
|
-
when 'Q'
|
426
|
-
[:ulong_long,arg]
|
427
|
-
when 'd'
|
428
|
-
[:double,arg]
|
429
|
-
else
|
430
|
-
raise type.inspect
|
431
|
-
end
|
432
|
-
when Float
|
433
|
-
[:double,arg]
|
434
|
-
when String
|
435
|
-
[:pointer,Cocoa.String_to_NSString(arg)]
|
436
|
-
when NilClass
|
437
|
-
[:pointer,nil]
|
438
|
-
when Symbol
|
439
|
-
[:pointer,ObjC.sel_registerName("#{arg}:")]
|
440
|
-
when NSObject
|
441
|
-
[:pointer,arg.object]
|
442
|
-
when FFI::Struct
|
443
|
-
[arg.class.by_value,arg]
|
444
|
-
when FFI::Pointer
|
445
|
-
[:pointer,arg]
|
446
|
-
else
|
447
|
-
raise ArgumentError.new("#{arg.class.name}: #{arg.inspect}")
|
448
|
-
end
|
449
|
-
end.flatten
|
450
|
-
end
|
451
|
-
|
452
92
|
def self.smart_constantize ret,klass_name
|
453
93
|
begin
|
454
94
|
Cocoa.const_get(klass_name)
|
@@ -501,17 +141,7 @@ module Cocoa
|
|
501
141
|
case params[:retval]
|
502
142
|
when '@'
|
503
143
|
return nil if ret.address == 0
|
504
|
-
|
505
|
-
return self if klass_name == '(NULL)'
|
506
|
-
instance = begin
|
507
|
-
("Cocoa::"+klass_name).constantize.new(true)
|
508
|
-
rescue
|
509
|
-
klass_name = klass_name.gsub(/^_*/,'') if klass_name[0]=='_'
|
510
|
-
klass = smart_constantize(ret,klass_name)
|
511
|
-
klass.new(true)
|
512
|
-
end
|
513
|
-
instance.object = ret
|
514
|
-
instance
|
144
|
+
ObjC.object_to_instance(ret)
|
515
145
|
when 'v'
|
516
146
|
self
|
517
147
|
else
|
@@ -535,7 +165,7 @@ module Cocoa
|
|
535
165
|
@@method_specs[method] = params
|
536
166
|
|
537
167
|
options = args.extract_options!
|
538
|
-
fixed_args =
|
168
|
+
fixed_args = ObjC.fixed_args(args,options,params[:types])
|
539
169
|
# puts "ObjC.msgSend(@object,\"#{method}:#{params[:names].join(':')}:\",#{fixed_args.inspect})"
|
540
170
|
ObjC.msgSend(@object,"#{method}#{(['']+params[:names]).join(':')}:",*fixed_args)
|
541
171
|
self
|
@@ -544,7 +174,7 @@ module Cocoa
|
|
544
174
|
raise ArgumentError unless params.size == 1
|
545
175
|
@@method_specs[method] = params
|
546
176
|
|
547
|
-
fixed_args =
|
177
|
+
fixed_args = ObjC.fixed_args(args)
|
548
178
|
# puts "ObjC.msgSend(#{@object.inspect},#{method},#{fixed_args.inspect})"
|
549
179
|
ObjC.msgSend(@object,"#{method}:",*fixed_args)
|
550
180
|
self
|
@@ -558,13 +188,13 @@ module Cocoa
|
|
558
188
|
define_method method do
|
559
189
|
case params[:retval]
|
560
190
|
when '@'
|
561
|
-
|
191
|
+
ObjC.translate_retval(method,ObjC.msgSend(@object,method.to_s),params[:retval])
|
562
192
|
when 'v'
|
563
193
|
ObjC.msgSend(@object,method.to_s)
|
564
194
|
self
|
565
195
|
when '^v'
|
566
196
|
ObjC.msgSend(@object,method.to_s)
|
567
|
-
when 'Q'
|
197
|
+
when 'Q', 'q'
|
568
198
|
ObjC.msgSend(@object,method.to_s).address
|
569
199
|
when 'B'
|
570
200
|
ret = ObjC.msgSend(@object,method.to_s)
|
@@ -573,30 +203,7 @@ module Cocoa
|
|
573
203
|
ObjC.msgSend_stret($1.constantize,@object,method.to_s)
|
574
204
|
when /^\^{([^=]*)=.*}$/
|
575
205
|
ret = ObjC.msgSend(@object,method.to_s)
|
576
|
-
|
577
|
-
if klass_name == '__NSCFType'
|
578
|
-
# dont know what the hell this is, experiment:
|
579
|
-
klass_name = $1
|
580
|
-
end
|
581
|
-
instance = begin
|
582
|
-
("Cocoa::"+klass_name).constantize.new(true)
|
583
|
-
rescue
|
584
|
-
klass_name = "FIX_#{klass_name}" if klass_name[0]=='_'
|
585
|
-
klass = begin
|
586
|
-
Cocoa.const_get(klass_name)
|
587
|
-
rescue => e
|
588
|
-
superclass_name = Cocoa::NSString_to_String(Cocoa::NSStringFromClass(ObjC.msgSend(ret,'superclass')))
|
589
|
-
superclass = "Cocoa::#{superclass_name}".constantize
|
590
|
-
proxy = Class.new(superclass)
|
591
|
-
Cocoa.const_set(klass_name, proxy)
|
592
|
-
klass = ("Cocoa::"+klass_name).constantize
|
593
|
-
superclass.inherited(klass)
|
594
|
-
klass
|
595
|
-
end
|
596
|
-
klass.new(true)
|
597
|
-
end
|
598
|
-
instance.object = ret
|
599
|
-
instance
|
206
|
+
ObjC.object_to_instance(ret)
|
600
207
|
when '*'
|
601
208
|
ObjC.msgSend(@object,method.to_s).read_string
|
602
209
|
else
|
@@ -607,10 +214,10 @@ module Cocoa
|
|
607
214
|
else
|
608
215
|
define_method method do |*args|
|
609
216
|
options = args.extract_options!
|
610
|
-
fixed_args =
|
217
|
+
fixed_args = ObjC.fixed_args(args,options,params[:types])
|
611
218
|
case params[:retval]
|
612
219
|
when '@'
|
613
|
-
|
220
|
+
ObjC.translate_retval(method,ObjC.msgSend(@object,"#{method}#{(['']+params[:names]).join(':')}:",*fixed_args),params[:retval])
|
614
221
|
else
|
615
222
|
ObjC.msgSend(@object,"#{method}#{(['']+params[:names]).join(':')}:",*fixed_args)
|
616
223
|
self
|
@@ -646,30 +253,17 @@ module Cocoa
|
|
646
253
|
:void
|
647
254
|
when 'v'
|
648
255
|
:void
|
649
|
-
else
|
650
|
-
raise @@method_specs[method][:retval].inspect
|
651
|
-
end
|
652
|
-
end
|
653
|
-
|
654
|
-
def self.objc_type type,default='i'
|
655
|
-
case type
|
656
|
-
when nil
|
657
|
-
default
|
658
256
|
when '@'
|
659
|
-
|
660
|
-
when 'v'
|
661
|
-
type
|
662
|
-
when /^{([^=]*)=.*}$/
|
663
|
-
type
|
257
|
+
:pointer
|
664
258
|
else
|
665
|
-
raise
|
259
|
+
raise @@method_specs[method][:retval].inspect
|
666
260
|
end
|
667
261
|
end
|
668
262
|
|
669
263
|
def self.objc_argument_types method
|
670
264
|
#"@:^{CGRect={CGPoint=dd}{CGSize=dd}}@"
|
671
265
|
return 'v@:@' unless @@method_specs[method] # own method probably TODO: @v: + @ times argument count
|
672
|
-
objc_type(@@method_specs[method][:retval],'v')+'@:'+@@method_specs[method][:types].map{ |type| objc_type(type) }.join
|
266
|
+
ObjC.objc_type(@@method_specs[method][:retval],'v')+'@:'+@@method_specs[method][:types].map{ |type| ObjC.objc_type(type) }.join
|
673
267
|
end
|
674
268
|
|
675
269
|
def self.method_added(name)
|