diff --git a/extra/cocoa/cocoa.factor b/extra/cocoa/cocoa.factor index 907d75fd84..744d577c0d 100755 --- a/extra/cocoa/cocoa.factor +++ b/extra/cocoa/cocoa.factor @@ -61,6 +61,7 @@ SYMBOL: super-sent-messages "NSOpenGLView" "NSOpenPanel" "NSPasteboard" + "NSPropertyListSerialization" "NSResponder" "NSSavePanel" "NSScreen" diff --git a/extra/cocoa/plists/plists.factor b/extra/cocoa/plists/plists.factor index 139e0840e1..bb73b8fac3 100644 --- a/extra/cocoa/plists/plists.factor +++ b/extra/cocoa/plists/plists.factor @@ -3,7 +3,7 @@ USING: strings arrays hashtables assocs sequences cocoa.messages cocoa.classes cocoa.application cocoa kernel namespaces io.backend math cocoa.enumeration byte-arrays -combinators alien.c-types ; +combinators alien.c-types core-foundation ; IN: cocoa.plists GENERIC: >plist ( value -- plist ) @@ -24,8 +24,8 @@ M: sequence >plist [ >plist ] map ; : write-plist ( assoc path -- ) - >r >plist - r> normalize-path 0 -> writeToFile:atomically: + [ >plist ] [ normalize-path ] bi* 0 + -> writeToFile:atomically: [ "write-plist failed" throw ] unless ; DEFER: plist> @@ -57,3 +57,13 @@ DEFER: plist> { [ dup NSDictionary -> isKindOfClass: c-bool> ] [ (plist-NSDictionary>) ] } [ ] } cond ; + +: (read-plist) ( NSData -- id ) + NSPropertyListSerialization swap kCFPropertyListImmutable f f + [ -> propertyListFromData:mutabilityOption:format:errorDescription: ] keep + *void* [ -> release "read-plist failed" throw ] when* ; + +: read-plist ( path -- assoc ) + normalize-path + NSData swap -> dataWithContentsOfFile: + [ (read-plist) plist> ] [ "read-plist failed" throw ] if* ; diff --git a/extra/core-foundation/core-foundation.factor b/extra/core-foundation/core-foundation.factor index c511a24320..5c3ccf6c80 100644 --- a/extra/core-foundation/core-foundation.factor +++ b/extra/core-foundation/core-foundation.factor @@ -43,6 +43,11 @@ TYPEDEF: int CFNumberType : kCFNumberCGFloatType 16 ; inline : kCFNumberMaxType 16 ; inline +TYPEDEF: int CFPropertyListMutabilityOptions +: kCFPropertyListImmutable 0 ; inline +: kCFPropertyListMutableContainers 1 ; inline +: kCFPropertyListMutableContainersAndLeaves 2 ; inline + FUNCTION: CFArrayRef CFArrayCreateMutable ( CFAllocatorRef allocator, CFIndex capacity, void* callbacks ) ; FUNCTION: void* CFArrayGetValueAtIndex ( CFArrayRef array, CFIndex idx ) ; diff --git a/extra/game-input/backend/iokit/iokit.factor b/extra/game-input/backend/iokit/iokit.factor index 1c778c6bb9..10e3220b3d 100644 --- a/extra/game-input/backend/iokit/iokit.factor +++ b/extra/game-input/backend/iokit/iokit.factor @@ -119,17 +119,20 @@ SINGLETON: iokit-game-input-backend : hat-switch? ( {usage-page,usage} -- ? ) { 1 HEX: 39 } = ; +: pov-values + { + pov-up pov-up-right pov-right pov-down-right + pov-down pov-down-left pov-left pov-up-left + pov-neutral + } ; + : button-value ( value -- f/(0,1] ) IOHIDValueGetIntegerValue dup zero? [ drop f ] when ; ! XXX calibration : axis-value ( value -- [-1,1] ) kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue ; -: slider-value ( value -- [0,1] ) - kIOHIDValueScaleTypeCalibrated IOHIDValueGetScaledValue - 1.0 + 0.5 * ; : pov-value ( value -- pov-direction ) - ! XXX - IOHIDValueGetIntegerValue ; + IOHIDValueGetIntegerValue pov-values ?nth [ pov-neutral ] unless* ; : record-controller ( controller-state value -- ) dup IOHIDValueGetElement element-usage { @@ -140,7 +143,7 @@ SINGLETON: iokit-game-input-backend { [ dup rx-axis? ] [ drop axis-value >>rx drop ] } { [ dup ry-axis? ] [ drop axis-value >>ry drop ] } { [ dup rz-axis? ] [ drop axis-value >>rz drop ] } - { [ dup slider? ] [ drop slider-value >>slider drop ] } + { [ dup slider? ] [ drop axis-value >>slider drop ] } { [ dup hat-switch? ] [ drop pov-value >>pov drop ] } [ 3drop ] } cond ; diff --git a/extra/game-input/game-input.factor b/extra/game-input/game-input.factor index a2884b0746..85a1e2e454 100644 --- a/extra/game-input/game-input.factor +++ b/extra/game-input/game-input.factor @@ -17,8 +17,8 @@ M: controller-state clone SYMBOLS: pov-neutral - pov-up pov-up-left pov-left pov-down-left - pov-down pov-down-right pov-right pov-up-right ; + pov-up pov-up-right pov-right pov-down-right + pov-down pov-down-left pov-left pov-up-left ; HOOK: get-controllers game-input-backend ( -- sequence )