I'm playing around with calling some objective-c code in the Mac system 
frameworks, because there are a lot of useful goodies in there.  I'm 
generally having more success than I deserve.  Thanks to some code that I 
saw in Tk.jl, I am able to send messages to objects, using various 
frameworks, and get the right results most of the time. The problem I've 
run into is with messages that take a structure as an argument. For 
example, if I try to make a window, I define these types (as defined in the 
Foundation framework, IIRC).

immutable NSPoint
    x::Cdouble
    y::Cdouble
end

immutable NSSize
    w::Cdouble
    h::Cdouble
end

immutable NSRect
    point::NSPoint
    sz::NSSize
end
string(r::NSRect) = "{$(r.point.x), $(r.point.y)}, {$(r.sz.w), $(r.sz.h)}"
NSRect(x, y, w, h) = NSRect(NSPoint(x, y), NSSize(w, h))

Then I create the window like so using something like (based on a comment 
from stevenj 
here<https://groups.google.com/forum/?fromgroups=#!searchin/julia-users/ccall$20struct/julia-users/kBNNGbHhJm8/ZD65gDweOrAJ>
):

window = ccall(:objc_msgSend, Ptr{Void}, (Ptr{Void}, Ptr{Void}, NSRect, Uint64, 
Uint64, Int),

oms(ogc("NSWindow"), "alloc"), msg, NSRect(0, 0, 200, 200), 11, 2, true)

# `oms(obj, msg, type)` sends a message to object
# `ogc(class)` gets a pointer to an objective-c class


Unfortunately, querying the window size gives me garbage:

@show oms(window, "frame", NSRect) # expect ((0, 0,), (200, 200))
oms(window,"frame",NSRect) => 
NSRect(NSPoint(1.390671161566996e-309,5.432309224866e-312),NSSize(NaN,NaN))


Changing the origin or the dimensions of the rectangle has no effect on the 
output, so I can't even sort out if it's an alignment issue.


So, a fairly open-ended question, does anyone have any tips for getting 
this to work? I've been following issue 
3466<https://github.com/JuliaLang/julia/pull/3466>, 
does that mean that this is hopeless (for the moment)?

Reply via email to