From 7d056e26703a2536c9b9fc91d52a031866ebd1f8 Mon Sep 17 00:00:00 2001 From: hogliux Date: Mon, 14 May 2018 15:33:16 +0100 Subject: [PATCH] Tidied up some macOS ObjC conversion methods --- .../juce_core/native/juce_osx_ObjCHelpers.h | 55 ++++++------------- .../native/juce_mac_NSViewComponentPeer.mm | 4 +- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/modules/juce_core/native/juce_osx_ObjCHelpers.h b/modules/juce_core/native/juce_osx_ObjCHelpers.h index 1f0174af6a..1efe548e94 100644 --- a/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ b/modules/juce_core/native/juce_osx_ObjCHelpers.h @@ -145,29 +145,14 @@ static NSArray* varArrayToNSArray (const var& varToParse) return array; } -static var nsArrayToVar (NSArray* array); +static var nsObjectToVar (NSObject* array); static var nsDictionaryToVar (NSDictionary* dictionary) { DynamicObject::Ptr dynamicObject = new DynamicObject(); for (NSString* key in dictionary) - { - const auto keyString = nsStringToJuce (key); - - id value = dictionary[key]; - - if ([value isKindOfClass: [NSString class]]) - dynamicObject->setProperty (keyString, nsStringToJuce ((NSString*) value)); - else if ([value isKindOfClass: [NSNumber class]]) - dynamicObject->setProperty (keyString, nsStringToJuce ([(NSNumber*) value stringValue])); - else if ([value isKindOfClass: [NSDictionary class]]) - dynamicObject->setProperty (keyString, nsDictionaryToVar ((NSDictionary*) value)); - else if ([value isKindOfClass: [NSArray class]]) - dynamicObject->setProperty (keyString, nsArrayToVar ((NSArray*) value)); - else - jassertfalse; // Unsupported yet, add here! - } + dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key])); return var (dynamicObject.get()); } @@ -177,20 +162,24 @@ static var nsArrayToVar (NSArray* array) Array resultArray; for (id value in array) + resultArray.add (nsObjectToVar (value)); + + return var (resultArray); +} + +static var nsObjectToVar (NSObject* obj) +{ + if ([obj isKindOfClass: [NSString class]]) return nsStringToJuce ((NSString*) obj); + else if ([obj isKindOfClass: [NSNumber class]]) return nsStringToJuce ([(NSNumber*) obj stringValue]); + else if ([obj isKindOfClass: [NSDictionary class]]) return nsDictionaryToVar ((NSDictionary*) obj); + else if ([obj isKindOfClass: [NSArray class]]) return nsArrayToVar ((NSArray*) obj); + else { - if ([value isKindOfClass: [NSString class]]) - resultArray.add (var (nsStringToJuce ((NSString*) value))); - else if ([value isKindOfClass: [NSNumber class]]) - resultArray.add (var (nsStringToJuce ([(NSNumber*) value stringValue]))); - else if ([value isKindOfClass: [NSDictionary class]]) - resultArray.add (nsDictionaryToVar ((NSDictionary*) value)); - else if ([value isKindOfClass: [NSArray class]]) - resultArray.add (nsArrayToVar ((NSArray*) value)); - else - jassertfalse; // Unsupported yet, add here! + // Unsupported yet, add here! + jassertfalse; } - return var (resultArray); + return {}; } #if JUCE_MAC @@ -226,16 +215,6 @@ static inline MsgSendFPRetFn getMsgSendFPRetFn() noexcept { return (MsgSendFPR #endif #endif -//============================================================================== -template -struct NSObjectRetainer -{ - inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; } - inline ~NSObjectRetainer() { [object release]; } - - ObjectType* object; -}; - //============================================================================== struct NSObjectDeleter { diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 520cb77b80..39a61b4bf9 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -780,7 +780,7 @@ public: { // (need to retain this in case a modal loop runs in handleKeyEvent and // our event object gets lost) - const NSObjectRetainer r (ev); + const std::unique_ptr r ([ev retain]); updateKeysDown (ev, true); bool used = handleKeyEvent (ev, true); @@ -810,7 +810,7 @@ public: void redirectModKeyChange (NSEvent* ev) { // (need to retain this in case a modal loop runs and our event object gets lost) - const NSObjectRetainer r (ev); + const std::unique_ptr r ([ev retain]); keysCurrentlyDown.clear(); handleKeyUpOrDown (true);