Add appleKit.hs
This commit is contained in:
parent
891e9f498b
commit
9dedb2c34d
1 changed files with 57 additions and 0 deletions
57
appleKit.hs
Normal file
57
appleKit.hs
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
{-
|
||||||
|
|
||||||
|
install my lib: https://github.com/KonstantinDjairo/haskell-obj-c
|
||||||
|
|
||||||
|
then:
|
||||||
|
|
||||||
|
$ appleKit.hs -o hello \
|
||||||
|
-package haskell-obj-c \
|
||||||
|
-package libffi \
|
||||||
|
-framework AppKit
|
||||||
|
|
||||||
|
|
||||||
|
-}
|
||||||
|
|
||||||
|
|
||||||
|
import Foreign.C.String (withCString)
|
||||||
|
import Foreign.LibFFI (argPtr, retPtr, retVoid, retCULong)
|
||||||
|
import Foreign.Ptr (castPtr)
|
||||||
|
import ObjC.Runtime
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = withAutoreleasePool $ do
|
||||||
|
loadFramework "AppKit"
|
||||||
|
|
||||||
|
appClass <- getRequiredClass "NSApplication"
|
||||||
|
_ <- sendClassMsg appClass (mkSelector "sharedApplication")
|
||||||
|
(retPtr retVoid) []
|
||||||
|
|
||||||
|
alertClass <- getRequiredClass "NSAlert"
|
||||||
|
alertPtr <- sendClassMsg alertClass (mkSelector "new")
|
||||||
|
(retPtr retVoid) []
|
||||||
|
let alert = RawId (castPtr alertPtr)
|
||||||
|
|
||||||
|
stringClass <- getRequiredClass "NSString"
|
||||||
|
title <- makeString stringClass "Hello from Haskell"
|
||||||
|
detail <- makeString stringClass "RawId-only AppKit test."
|
||||||
|
|
||||||
|
let RawId titlePtr = title
|
||||||
|
RawId detailPtr = detail
|
||||||
|
|
||||||
|
_ <- sendRawMsg alert (mkSelector "setMessageText:")
|
||||||
|
retVoid [argPtr titlePtr]
|
||||||
|
|
||||||
|
_ <- sendRawMsg alert (mkSelector "setInformativeText:")
|
||||||
|
retVoid [argPtr detailPtr]
|
||||||
|
|
||||||
|
_ <- sendRawMsg alert (mkSelector "runModal")
|
||||||
|
retCULong []
|
||||||
|
|
||||||
|
pure ()
|
||||||
|
|
||||||
|
makeString :: Class -> String -> IO RawId
|
||||||
|
makeString cls s =
|
||||||
|
withCString s $ \cs -> do
|
||||||
|
ptr <- sendClassMsg cls (mkSelector "stringWithUTF8String:")
|
||||||
|
(retPtr retVoid) [argPtr cs]
|
||||||
|
pure (RawId (castPtr ptr))
|
||||||
Loading…
Reference in a new issue