diff options
| author | Andrey Lihatskiy <alihatskiy@productengine.com> | 2022-11-02 18:50:18 +0200 | 
|---|---|---|
| committer | Andrey Lihatskiy <alihatskiy@productengine.com> | 2022-11-02 18:50:18 +0200 | 
| commit | 67ce0e77d786b21c40e12b242e4646cfe6915e26 (patch) | |
| tree | 5d02b1c7c14bdb4785c11c6979133c0c17cb88b1 | |
| parent | 21079869fce41940316e8a76719597d0dca0e17c (diff) | |
| parent | 0c36fed11056511872afae14a39a88f5e46be0fc (diff) | |
Merge remote-tracking branch 'RyeMutt/viewer/mac-fixes' into DRTVWR-570-maint-Q
| -rwxr-xr-x | doc/contributions.txt | 1 | ||||
| -rw-r--r-- | indra/llfilesystem/lldir_mac.cpp | 32 | ||||
| -rw-r--r-- | indra/llfilesystem/lldir_utils_objc.h | 10 | ||||
| -rw-r--r-- | indra/llfilesystem/lldir_utils_objc.mm | 82 | ||||
| -rw-r--r-- | indra/llimage/llpngwrapper.cpp | 5 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx-objc.h | 2 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx-objc.mm | 136 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.cpp | 14 | ||||
| -rw-r--r-- | indra/llwindow/llwindowmacosx.h | 1 | ||||
| -rw-r--r-- | indra/newview/llappdelegate-objc.mm | 15 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/llfilepicker.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llfilepicker.h | 2 | ||||
| -rw-r--r-- | indra/newview/llfilepicker_mac.h | 4 | ||||
| -rw-r--r-- | indra/newview/llfilepicker_mac.mm | 157 | 
15 files changed, 242 insertions, 234 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 2686be3e3d..6bd8cd916b 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -1393,6 +1393,7 @@ Sovereign Engineer      SL-18412      SL-18497      SL-18525 +    SL-18534  SpacedOut Frye  	VWR-34  	VWR-45 diff --git a/indra/llfilesystem/lldir_mac.cpp b/indra/llfilesystem/lldir_mac.cpp index 3bc4ee844e..9ad8e274b6 100644 --- a/indra/llfilesystem/lldir_mac.cpp +++ b/indra/llfilesystem/lldir_mac.cpp @@ -66,16 +66,16 @@ LLDir_Mac::LLDir_Mac()      const std::string     secondLifeString = "SecondLife"; -    std::string *executablepathstr = getSystemExecutableFolder(); +    std::string executablepathstr = getSystemExecutableFolder();      //NOTE:  LLINFOS/LLERRS will not output to log here.  The streams are not initialized. -	if (executablepathstr) +	if (!executablepathstr.empty())  	{  		// mExecutablePathAndName -		mExecutablePathAndName = *executablepathstr; +		mExecutablePathAndName = executablepathstr; -        boost::filesystem::path executablepath(*executablepathstr); +        boost::filesystem::path executablepath(executablepathstr);  # ifndef BOOST_SYSTEM_NO_DEPRECATED  #endif @@ -83,8 +83,8 @@ LLDir_Mac::LLDir_Mac()          mExecutableDir = executablepath.parent_path().string();  		// mAppRODataDir -        std::string *resourcepath = getSystemResourceFolder(); -        mAppRODataDir = *resourcepath; +        std::string resourcepath = getSystemResourceFolder(); +        mAppRODataDir = resourcepath;  		// *NOTE: When running in a dev tree, use the copy of  		// skins in indra/newview/ rather than in the application bundle.  This @@ -110,11 +110,11 @@ LLDir_Mac::LLDir_Mac()  		}  		// mOSUserDir -        std::string *appdir = getSystemApplicationSupportFolder(); +        std::string appdir = getSystemApplicationSupportFolder();          std::string rootdir;          //Create root directory -        if (CreateDirectory(*appdir, secondLifeString, &rootdir)) +        if (CreateDirectory(appdir, secondLifeString, &rootdir))          {              // Save the full path to the folder @@ -128,12 +128,10 @@ LLDir_Mac::LLDir_Mac()          }  		//mOSCacheDir -        std::string *cachedir =  getSystemCacheFolder(); - -        if (cachedir) -		 +        std::string cachedir =  getSystemCacheFolder(); +        if (!cachedir.empty())  		{ -            mOSCacheDir = *cachedir; +            mOSCacheDir = cachedir;              //TODO:  This changes from ~/Library/Cache/Secondlife to ~/Library/Cache/com.app.secondlife/Secondlife.  Last dir level could go away.              CreateDirectory(mOSCacheDir, secondLifeString, NULL);  		} @@ -143,12 +141,10 @@ LLDir_Mac::LLDir_Mac()  		// mTempDir          //Aura 120920 boost::filesystem::temp_directory_path() not yet implemented on mac. :( -        std::string *tmpdir = getSystemTempFolder(); -        if (tmpdir) +        std::string tmpdir = getSystemTempFolder(); +        if (!tmpdir.empty())          { -             -            CreateDirectory(*tmpdir, secondLifeString, &mTempDir); -            if (tmpdir) delete tmpdir; +            CreateDirectory(tmpdir, secondLifeString, &mTempDir);          }  		mWorkingDir = getCurPath(); diff --git a/indra/llfilesystem/lldir_utils_objc.h b/indra/llfilesystem/lldir_utils_objc.h index 12019c4284..59dbeb4aec 100644 --- a/indra/llfilesystem/lldir_utils_objc.h +++ b/indra/llfilesystem/lldir_utils_objc.h @@ -33,11 +33,11 @@  #include <iostream> -std::string* getSystemTempFolder(); -std::string* getSystemCacheFolder(); -std::string* getSystemApplicationSupportFolder(); -std::string* getSystemResourceFolder(); -std::string* getSystemExecutableFolder(); +std::string getSystemTempFolder(); +std::string getSystemCacheFolder(); +std::string getSystemApplicationSupportFolder(); +std::string getSystemResourceFolder(); +std::string getSystemExecutableFolder();  #endif // LL_LLDIR_UTILS_OBJC_H diff --git a/indra/llfilesystem/lldir_utils_objc.mm b/indra/llfilesystem/lldir_utils_objc.mm index da55a2f897..20540fb93c 100644 --- a/indra/llfilesystem/lldir_utils_objc.mm +++ b/indra/llfilesystem/lldir_utils_objc.mm @@ -30,75 +30,75 @@  #include "lldir_utils_objc.h"  #import <Cocoa/Cocoa.h> -std::string* getSystemTempFolder() +std::string getSystemTempFolder()  { -    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -    NSString * tempDir = NSTemporaryDirectory(); -    if (tempDir == nil) -        tempDir = @"/tmp"; -    std::string *result = ( new std::string([tempDir UTF8String]) ); -    [pool release]; +    std::string result; +    @autoreleasepool { +        NSString * tempDir = NSTemporaryDirectory(); +        if (tempDir == nil) +            tempDir = @"/tmp"; +        result = std::string([tempDir UTF8String]); +    }      return result;  }  //findSystemDirectory scoped exclusively to this file.  -std::string* findSystemDirectory(NSSearchPathDirectory searchPathDirectory, +std::string findSystemDirectory(NSSearchPathDirectory searchPathDirectory,                                     NSSearchPathDomainMask domainMask)  { -    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -     -    std::string *result = nil; -    NSString *path = nil; -     -    // Search for the path -    NSArray* paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory, -                                                         domainMask, -                                                         YES); -    if ([paths count]) -    { -        path = [paths objectAtIndex:0]; -        //HACK:  Always attempt to create directory, ignore errors. -        NSError *error = nil; - -        [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; - +    std::string result; +    @autoreleasepool { +        NSString *path = nil; -        result = new std::string([path UTF8String]);         +        // Search for the path +        NSArray* paths = NSSearchPathForDirectoriesInDomains(searchPathDirectory, +                                                             domainMask, +                                                             YES); +        if ([paths count]) +        { +            path = [paths objectAtIndex:0]; +            //HACK:  Always attempt to create directory, ignore errors. +            NSError *error = nil; +             +            [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; +             +             +            result = std::string([path UTF8String]); +        }      } -    [pool release];      return result;  } -std::string* getSystemExecutableFolder() +std::string getSystemExecutableFolder()  { -    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - -    NSString *bundlePath = [[NSBundle mainBundle] executablePath]; -    std::string *result = (new std::string([bundlePath UTF8String]));   -    [pool release]; +    std::string result; +    @autoreleasepool { +        NSString *bundlePath = [[NSBundle mainBundle] executablePath]; +        result = std::string([bundlePath UTF8String]); +    }      return result;  } -std::string* getSystemResourceFolder() +std::string getSystemResourceFolder()  { -    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - -    NSString *bundlePath = [[NSBundle mainBundle] resourcePath]; -    std::string *result = (new std::string([bundlePath UTF8String])); -    [pool release]; +    std::string result; +    @autoreleasepool { +        NSString *bundlePath = [[NSBundle mainBundle] resourcePath]; +        result = std::string([bundlePath UTF8String]); +    }      return result;  } -std::string* getSystemCacheFolder() +std::string getSystemCacheFolder()  {      return findSystemDirectory (NSCachesDirectory,                                  NSUserDomainMask);  } -std::string* getSystemApplicationSupportFolder() +std::string getSystemApplicationSupportFolder()  {      return findSystemDirectory (NSApplicationSupportDirectory,                                  NSUserDomainMask); diff --git a/indra/llimage/llpngwrapper.cpp b/indra/llimage/llpngwrapper.cpp index f7dc6272cf..cad7c00042 100644 --- a/indra/llimage/llpngwrapper.cpp +++ b/indra/llimage/llpngwrapper.cpp @@ -257,12 +257,7 @@ void LLPngWrapper::normalizeImage()  		png_set_strip_16(mReadPngPtr);  	} -#if LL_DARWIN -	const F64 SCREEN_GAMMA = 1.8; -#else  	const F64 SCREEN_GAMMA = 2.2; -#endif -  	if (png_get_gAMA(mReadPngPtr, mReadInfoPtr, &mGamma))  	{  		png_set_gamma(mReadPngPtr, SCREEN_GAMMA, mGamma); diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 43edc0110d..77024d3a9c 100644 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -83,7 +83,7 @@ int createNSApp(int argc, const char **argv);  void setupCocoa();  bool pasteBoardAvailable();  bool copyToPBoard(const unsigned short *str, unsigned int len); -const unsigned short *copyFromPBoard(); +unsigned short *copyFromPBoard();  CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY);  short releaseImageCursor(CursorRef ref);  short setImageCursor(CursorRef ref); diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 5ec9b017cf..57c3d86295 100644 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -49,14 +49,12 @@ void setupCocoa()  	if(!inited)  	{ -		NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -		 -		// The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents. -		// ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr' -		// when init'ing the Cocoa App window. -		[[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; -		 -		[pool release]; +        @autoreleasepool { +            // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents. +            // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr' +            // when init'ing the Cocoa App window. +            [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; +        }  		inited = true;  	} @@ -64,13 +62,13 @@ void setupCocoa()  bool copyToPBoard(const unsigned short *str, unsigned int len)  { -	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; -	NSPasteboard *pboard = [NSPasteboard generalPasteboard]; -	[pboard clearContents]; -	 -	NSArray *contentsToPaste = [[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil]; -	[pool release]; -	return [pboard writeObjects:contentsToPaste]; +    @autoreleasepool { +        NSPasteboard *pboard = [NSPasteboard generalPasteboard]; +        [pboard clearContents]; +         +        NSArray *contentsToPaste = [[[NSArray alloc] initWithObjects:[NSString stringWithCharacters:str length:len], nil] autorelease]; +        return [pboard writeObjects:contentsToPaste]; +    }  }  bool pasteBoardAvailable() @@ -79,39 +77,39 @@ bool pasteBoardAvailable()  	return [[NSPasteboard generalPasteboard] canReadObjectForClasses:classArray options:[NSDictionary dictionary]];  } -const unsigned short *copyFromPBoard() +unsigned short *copyFromPBoard()  { -	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; -	NSPasteboard *pboard = [NSPasteboard generalPasteboard]; -	NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; -	NSString *str = NULL; -	BOOL ok = [pboard canReadObjectForClasses:classArray options:[NSDictionary dictionary]]; -	if (ok) -	{ -		NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]]; -		str = [objToPaste objectAtIndex:0]; -	} -	unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar)); -	[str getCharacters:temp]; -	[pool release]; -	return temp; +    @autoreleasepool { +        NSPasteboard *pboard = [NSPasteboard generalPasteboard]; +        NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; +        NSString *str = NULL; +        BOOL ok = [pboard canReadObjectForClasses:classArray options:[NSDictionary dictionary]]; +        if (ok) +        { +            NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]]; +            str = [objToPaste objectAtIndex:0]; +        } +        NSUInteger str_len = [str length]; +        unichar* temp = (unichar*)calloc(str_len+1, sizeof(unichar)); +        [str getCharacters:temp range:NSMakeRange(0, str_len)]; +        return temp; +    }  }  CursorRef createImageCursor(const char *fullpath, int hotspotX, int hotspotY)  { -	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - -	// extra retain on the NSCursor since we want it to live for the lifetime of the app. -	NSCursor *cursor = -	[[[NSCursor alloc] -	  initWithImage: -	  [[[NSImage alloc] initWithContentsOfFile: -		[NSString stringWithUTF8String:fullpath] -		]autorelease] -	  hotSpot:NSMakePoint(hotspotX, hotspotY) -	  ]retain]; -	 -	[pool release]; +    NSCursor *cursor = nil; +    @autoreleasepool { +        // extra retain on the NSCursor since we want it to live for the lifetime of the app. +        cursor = +        [[[NSCursor alloc] +          initWithImage: +              [[[NSImage alloc] initWithContentsOfFile: +                    [NSString stringWithUTF8String:fullpath] +               ] autorelease] +          hotSpot:NSMakePoint(hotspotX, hotspotY) +         ] retain]; +    }  	return (CursorRef)cursor;  } @@ -178,10 +176,10 @@ OSErr releaseImageCursor(CursorRef ref)  {  	if( ref != NULL )  	{ -		NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -		NSCursor *cursor = (NSCursor*)ref; -		[cursor release]; -		[pool release]; +        @autoreleasepool { +            NSCursor *cursor = (NSCursor*)ref; +            [cursor autorelease]; +        }  	}  	else  	{ @@ -195,10 +193,10 @@ OSErr setImageCursor(CursorRef ref)  {  	if( ref != NULL )  	{ -		NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; -		NSCursor *cursor = (NSCursor*)ref; -		[cursor set]; -		[pool release]; +        @autoreleasepool { +            NSCursor *cursor = (NSCursor*)ref; +            [cursor set]; +        }  	}  	else  	{ @@ -419,24 +417,26 @@ void requestUserAttention()  long showAlert(std::string text, std::string title, int type)  { -    NSAlert *alert = [[NSAlert alloc] init]; -     -    [alert setMessageText:[NSString stringWithCString:title.c_str() encoding:[NSString defaultCStringEncoding]]]; -    [alert setInformativeText:[NSString stringWithCString:text.c_str() encoding:[NSString defaultCStringEncoding]]]; -    if (type == 0) -    { -        [alert addButtonWithTitle:@"Okay"]; -    } else if (type == 1) -    { -        [alert addButtonWithTitle:@"Okay"]; -        [alert addButtonWithTitle:@"Cancel"]; -    } else if (type == 2) -    { -        [alert addButtonWithTitle:@"Yes"]; -        [alert addButtonWithTitle:@"No"]; +    long ret = 0; +    @autoreleasepool { +        NSAlert *alert = [[[NSAlert alloc] init] autorelease]; +         +        [alert setMessageText:[NSString stringWithCString:title.c_str() encoding:[NSString defaultCStringEncoding]]]; +        [alert setInformativeText:[NSString stringWithCString:text.c_str() encoding:[NSString defaultCStringEncoding]]]; +        if (type == 0) +        { +            [alert addButtonWithTitle:@"Okay"]; +        } else if (type == 1) +        { +            [alert addButtonWithTitle:@"Okay"]; +            [alert addButtonWithTitle:@"Cancel"]; +        } else if (type == 2) +        { +            [alert addButtonWithTitle:@"Yes"]; +            [alert addButtonWithTitle:@"No"]; +        } +        ret = [alert runModal];      } -    long ret = [alert runModal]; -    [alert dealloc];      if (ret == NSAlertFirstButtonReturn)      { diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index c29131d60b..f924b17090 100644 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -668,11 +668,11 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits  		if (cgl_err != kCGLNoError )  		{ -			LL_DEBUGS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL; +			LL_INFOS("GLInit") << "Multi-threaded OpenGL not available." << LL_ENDL;  		}  		else  		{ -			LL_DEBUGS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL; +            LL_INFOS("GLInit") << "Multi-threaded OpenGL enabled." << LL_ENDL;  		}  	}  	makeFirstResponder(mWindow, mGLView); @@ -1246,8 +1246,11 @@ BOOL LLWindowMacOSX::isClipboardTextAvailable()  }  BOOL LLWindowMacOSX::pasteTextFromClipboard(LLWString &dst) -{	 -	llutf16string str(copyFromPBoard()); +{ +    unsigned short* pboard_data = copyFromPBoard(); // must free returned data +	llutf16string str(pboard_data); +    free(pboard_data); +  	dst = utf16str_to_wstring(str);  	if (dst != L"")  	{ @@ -1280,7 +1283,7 @@ LLWindow::LLWindowResolution* LLWindowMacOSX::getSupportedResolutions(S32 &num_r  {  	if (!mSupportedResolutions)  	{ -		CFArrayRef modes = CGDisplayAvailableModes(mDisplay); +		CFArrayRef modes = CGDisplayCopyAllDisplayModes(mDisplay, nullptr);  		if(modes != NULL)  		{ @@ -1319,6 +1322,7 @@ LLWindow::LLWindowResolution* LLWindowMacOSX::getSupportedResolutions(S32 &num_r  					}  				}  			} +            CFRelease(modes);  		}  	} diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h index b0f339e1db..851c860017 100644 --- a/indra/llwindow/llwindowmacosx.h +++ b/indra/llwindow/llwindowmacosx.h @@ -228,6 +228,7 @@ protected:  	BOOL		mLanguageTextInputAllowed;  	LLPreeditor*	mPreeditor; +public:  	static BOOL	sUseMultGL;  	friend class LLWindowManager; diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 5214f4b838..1090888c1c 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -46,6 +46,7 @@  - (void)dealloc  { +    [currentInputLanguage release];      [super dealloc];  } @@ -199,12 +200,14 @@  - (bool) romanScript  { -	// How to add support for new languages with the input window: -	// Simply append this array with the language code (ja for japanese, ko for korean, zh for chinese, etc.) -	NSArray *nonRomanScript = [[NSArray alloc] initWithObjects:@"ja", @"ko", @"zh-Hant", @"zh-Hans", nil]; -	if ([nonRomanScript containsObject:currentInputLanguage]) -    { -        return false; +    @autoreleasepool { +        // How to add support for new languages with the input window: +        // Simply append this array with the language code (ja for japanese, ko for korean, zh for chinese, etc.) +        NSArray* nonRomanScript = @[@"ja", @"ko", @"zh-Hant", @"zh-Hans"]; +        if ([nonRomanScript containsObject:currentInputLanguage]) +        { +            return false; +        }      }      return true; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4f3e0b08e4..5d509fa4ff 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -135,6 +135,10 @@  #include "vlc/libvlc_version.h"  #endif // LL_LINUX +#if LL_DARWIN +#include "llwindowmacosx.h" +#endif +  // Third party library includes  #include <boost/bind.hpp>  #include <boost/foreach.hpp> @@ -560,6 +564,7 @@ static void settings_to_globals()      LLWorldMapView::setScaleSetting(gSavedSettings.getF32("MapScale"));  #if LL_DARWIN +    LLWindowMacOSX::sUseMultGL = gSavedSettings.getBOOL("RenderAppleUseMultGL");  	gHiDPISupport = gSavedSettings.getBOOL("RenderHiDPI");  #endif  } diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 3669fb1eeb..e3a695fc79 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -586,9 +586,9 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename,  #elif LL_DARWIN -std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode) +std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadFilter filter) //(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode)  { -    std::vector<std::string> *allowedv = new std::vector< std::string >; +    std::unique_ptr<std::vector<std::string>> allowedv(new std::vector< std::string >);      switch(filter)      {          case FFLOAD_ALL: @@ -661,9 +661,9 @@ bool	LLFilePicker::doNavChooseDialog(ELoadFilter filter)  	gViewerWindow->getWindow()->beforeDialog(); -    std::vector<std::string> *allowed_types=navOpenFilterProc(filter); +    std::unique_ptr<std::vector<std::string>> allowed_types = navOpenFilterProc(filter); -    std::vector<std::string> *filev  = doLoadDialog(allowed_types,  +    std::unique_ptr<std::vector<std::string>> filev  = doLoadDialog(allowed_types.get(),                                                      mPickOptions);  	gViewerWindow->getWindow()->afterDialog(); @@ -780,7 +780,7 @@ bool	LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena  	gViewerWindow->getWindow()->beforeDialog();  	// Run the dialog -    std::string* filev = doSaveDialog(&namestring,  +    std::unique_ptr<std::string> filev = doSaveDialog(&namestring,                    &type,                   &creator,                   &extension, diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index 04ba4416d7..73baeca1c0 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -167,7 +167,7 @@ private:  	bool doNavChooseDialog(ELoadFilter filter);  	bool doNavSaveDialog(ESaveFilter filter, const std::string& filename); -    std::vector<std::string>* navOpenFilterProc(ELoadFilter filter); +    std::unique_ptr<std::vector<std::string>> navOpenFilterProc(ELoadFilter filter);  #endif  #if LL_GTK diff --git a/indra/newview/llfilepicker_mac.h b/indra/newview/llfilepicker_mac.h index e0b7e2e8ce..b2fb371afe 100644 --- a/indra/newview/llfilepicker_mac.h +++ b/indra/newview/llfilepicker_mac.h @@ -39,9 +39,9 @@  #include <vector>  //void modelessPicker(); -std::vector<std::string>* doLoadDialog(const std::vector<std::string>* allowed_types,  +std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::string>* allowed_types,                   unsigned int flags); -std::string* doSaveDialog(const std::string* file,  +std::unique_ptr<std::string> doSaveDialog(const std::string* file,                     const std::string* type,                    const std::string* creator,                    const std::string* extension, diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 1438e4dc0a..0ae5fc3f77 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -29,104 +29,107 @@  #include <iostream>  #include "llfilepicker_mac.h" -std::vector<std::string>* doLoadDialog(const std::vector<std::string>* allowed_types,  +std::unique_ptr<std::vector<std::string>> doLoadDialog(const std::vector<std::string>* allowed_types,                   unsigned int flags)  { -    int i, result; -     -    //Aura TODO:  We could init a small window and release it at the end of this routine -    //for a modeless interface. -     -    NSOpenPanel *panel = [NSOpenPanel openPanel]; -    //NSString *fileName = nil; -    NSMutableArray *fileTypes = nil; -     -     -    if ( allowed_types && !allowed_types->empty())  -    { -        fileTypes = [[NSMutableArray alloc] init]; +    std::unique_ptr<std::vector<std::string>> outfiles; + +    @autoreleasepool { +        int i, result; +        //Aura TODO:  We could init a small window and release it at the end of this routine +        //for a modeless interface. +         +        NSOpenPanel *panel = [NSOpenPanel openPanel]; +        //NSString *fileName = nil; +        NSMutableArray *fileTypes = nil; -        for (i=0;i<allowed_types->size();++i) +        if ( allowed_types && !allowed_types->empty())          { -            [fileTypes addObject:  -             [NSString stringWithCString:(*allowed_types)[i].c_str()  -                                encoding:[NSString defaultCStringEncoding]]]; +            fileTypes = [[[NSMutableArray alloc] init] autorelease]; +             +            for (i=0;i<allowed_types->size();++i) +            { +                [fileTypes addObject: +                 [NSString stringWithCString:(*allowed_types)[i].c_str() +                                    encoding:[NSString defaultCStringEncoding]]]; +            }          } -    } -    //[panel setMessage:@"Import one or more files or directories."]; -    [panel setAllowsMultipleSelection: ( (flags & F_MULTIPLE)?true:false ) ]; -    [panel setCanChooseDirectories: ( (flags & F_DIRECTORY)?true:false ) ]; -    [panel setCanCreateDirectories: true]; -    [panel setResolvesAliases: true]; -    [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )]; -    [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; -     -    std::vector<std::string>* outfiles = NULL;  -     -    if (fileTypes) -    { -        [panel setAllowedFileTypes:fileTypes]; -        result = [panel runModal]; -    } -    else  -    { -        // I suggest it's better to open the last path and let this default to home dir as necessary -        // for consistency with other OS X apps -        // -        //[panel setDirectoryURL: fileURLWithPath(NSHomeDirectory()) ]; -        result = [panel runModal]; -    } -     -    if (result == NSOKButton)  -    { -        NSArray *filesToOpen = [panel URLs]; -        int i, count = [filesToOpen count]; +        //[panel setMessage:@"Import one or more files or directories."]; +        [panel setAllowsMultipleSelection: ( (flags & F_MULTIPLE)?true:false ) ]; +        [panel setCanChooseDirectories: ( (flags & F_DIRECTORY)?true:false ) ]; +        [panel setCanCreateDirectories: true]; +        [panel setResolvesAliases: true]; +        [panel setCanChooseFiles: ( (flags & F_FILE)?true:false )]; +        [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; -        if (count > 0) +        if (fileTypes) +        { +            [panel setAllowedFileTypes:fileTypes]; +            result = [panel runModal]; +        } +        else          { -            outfiles = new std::vector<std::string>; +            // I suggest it's better to open the last path and let this default to home dir as necessary +            // for consistency with other OS X apps +            // +            //[panel setDirectoryURL: fileURLWithPath(NSHomeDirectory()) ]; +            result = [panel runModal];          } -        for (i=0; i<count; i++) { -            NSString *aFile = [[filesToOpen objectAtIndex:i] path]; -            std::string *afilestr = new std::string([aFile UTF8String]); -            outfiles->push_back(*afilestr); +        if (result == NSOKButton) +        { +            NSArray *filesToOpen = [panel URLs]; +            int i, count = [filesToOpen count]; +             +            if (count > 0) +            { +                outfiles.reset(new std::vector<std::string>); +            } +             +            for (i=0; i<count; i++) { +                NSString *aFile = [[filesToOpen objectAtIndex:i] path]; +                std::string afilestr = std::string([aFile UTF8String]); +                outfiles->push_back(afilestr); +            }          }      } +      return outfiles;  } -std::string* doSaveDialog(const std::string* file,  +std::unique_ptr<std::string> doSaveDialog(const std::string* file,                    const std::string* type,                    const std::string* creator,                    const std::string* extension,                    unsigned int flags)  { -    NSSavePanel *panel = [NSSavePanel savePanel];  -     -    NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; -    NSArray *fileType = [extensionns componentsSeparatedByString:@","]; -     -    //[panel setMessage:@"Save Image File"];  -    [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; -    [panel setCanSelectHiddenExtension:true];  -    [panel setAllowedFileTypes:fileType]; -    NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; -     -    std::string *outfile = NULL; -    NSURL* url = [NSURL fileURLWithPath:fileName]; -    [panel setNameFieldStringValue: fileName]; -    [panel setDirectoryURL: url]; -    if([panel runModal] ==  -       NSFileHandlingPanelOKButton)  -    { -        NSURL* url = [panel URL]; -        NSString* p = [url path]; -        outfile = new std::string( [p UTF8String] ); -        // write the file  -    }  +    std::unique_ptr<std::string> outfile; +    @autoreleasepool { +        NSSavePanel *panel = [NSSavePanel savePanel]; +         +        NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]]; +        NSArray *fileType = [extensionns componentsSeparatedByString:@","]; +         +        //[panel setMessage:@"Save Image File"]; +        [panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ]; +        [panel setCanSelectHiddenExtension:true]; +        [panel setAllowedFileTypes:fileType]; +        NSString *fileName = [NSString stringWithCString:file->c_str() encoding:[NSString defaultCStringEncoding]]; +         +        NSURL* url = [NSURL fileURLWithPath:fileName]; +        [panel setNameFieldStringValue: fileName]; +        [panel setDirectoryURL: url]; +        if([panel runModal] == +           NSFileHandlingPanelOKButton) +        { +            NSURL* url = [panel URL]; +            NSString* p = [url path]; +            outfile.reset(new std::string([p UTF8String])); +            // write the file +        } +    }      return outfile;  } | 
