summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorGraham Linden <graham@lindenlab.com>2013-09-09 12:43:10 -0700
committerGraham Linden <graham@lindenlab.com>2013-09-09 12:43:10 -0700
commit2df58f775fdd1c846ec125a9736d6dd39dab2811 (patch)
treecbf35ab02a6b22bf76fcf436d75243df906acbcc /indra/newview
parent38b1975b09c642682bfeb8d6d575ccfbf47ce7e4 (diff)
parent55ae6a7962cdc9a9d7d087fbc529d30db9c37013 (diff)
Merge viewer-release 3.6.6
Diffstat (limited to 'indra/newview')
-rwxr-xr-xindra/newview/CMakeLists.txt30
-rwxr-xr-xindra/newview/Info-SecondLife.plist30
-rw-r--r--indra/newview/SecondLife.nibbin0 -> 12348 bytes
-rwxr-xr-xindra/newview/SecondLife.nib/classes.nib4
-rwxr-xr-xindra/newview/SecondLife.nib/info.nib23
-rwxr-xr-xindra/newview/SecondLife.nib/objects.xib259
-rw-r--r--indra/newview/SecondLife.xib1136
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl1
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl1
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl1
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl5
-rwxr-xr-xindra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl1
-rwxr-xr-xindra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl1
-rw-r--r--indra/newview/llappdelegate-objc.mm144
-rwxr-xr-xindra/newview/llappviewer.cpp121
-rwxr-xr-xindra/newview/llappviewer.h3
-rwxr-xr-xindra/newview/llappviewermacosx.cpp229
-rwxr-xr-xindra/newview/lldirpicker.cpp142
-rwxr-xr-xindra/newview/lldirpicker.h13
-rwxr-xr-xindra/newview/llfilepicker.cpp510
-rwxr-xr-xindra/newview/llfilepicker.h16
-rw-r--r--indra/newview/llfilepicker_mac.h58
-rw-r--r--indra/newview/llfilepicker_mac.mm132
-rwxr-xr-xindra/newview/llfloaterhardwaresettings.cpp9
-rwxr-xr-xindra/newview/llviewerkeyboard.cpp1
-rwxr-xr-xindra/newview/llviewertexturelist.cpp14
-rwxr-xr-xindra/newview/llviewertexturelist.h2
-rwxr-xr-xindra/newview/macutil_Prefix.h1
29 files changed, 1904 insertions, 985 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e2ae7a5a9a..3a09bc530c 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1272,6 +1272,11 @@ set_source_files_properties(
if (DARWIN)
LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp)
+ LIST(APPEND viewer_SOURCE_FILES llfilepicker_mac.mm)
+ LIST(APPEND viewer_HEADER_FILES llfilepicker_mac.h)
+
+ # This should be compiled with the viewer.
+ LIST(APPEND viewer_SOURCE_FILES llappdelegate-objc.mm)
find_library(AGL_LIBRARY AGL)
find_library(APPKIT_LIBRARY AppKit)
@@ -1292,7 +1297,7 @@ if (DARWIN)
macview.r
gpu_table.txt
Info-SecondLife.plist
- SecondLife.nib/
+ SecondLife.xib/
# CMake doesn't seem to support Xcode language variants well just yet
English.lproj/InfoPlist.strings
English.lproj/language.txt
@@ -1972,20 +1977,25 @@ if (LINUX)
endif (LINUX)
if (DARWIN)
+ # These all get set with PROPERTIES
set(product "Second Life")
-
+ set(MACOSX_BUNDLE_INFO_STRING "Second Life Viewer")
+ set(MACOSX_BUNDLE_ICON_FILE "secondlife.icns")
+ set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.secondlife.indra.viewer")
+ set(MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}")
+ set(MACOSX_BUNDLE_BUNDLE_NAME "SecondLife")
+ set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}")
+ set(MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}")
+ set(MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007")
+ set(MACOSX_BUNDLE_NSMAIN_NIB_FILE "SecondLife.nib")
+ set(MACOSX_BUNDLE_NSPRINCIPAL_CLASS "NSApplication")
+
set_target_properties(
${VIEWER_BINARY_NAME}
PROPERTIES
OUTPUT_NAME "${product}"
- MACOSX_BUNDLE_INFO_STRING "Second Life Viewer"
- MACOSX_BUNDLE_ICON_FILE "secondlife.icns"
- MACOSX_BUNDLE_GUI_IDENTIFIER "com.secondlife.indra.viewer"
- MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"
- MACOSX_BUNDLE_BUNDLE_NAME "Second Life"
- MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}"
- MACOSX_BUNDLE_BUNDLE_VERSION "${VIEWER_SHORT_VERSION}${VIEWER_MACOSX_PHASE}${VIEWER_REVISION}"
- MACOSX_BUNDLE_COPYRIGHT "Copyright © Linden Research, Inc. 2007"
+ MACOSX_BUNDLE_INFO_PLIST
+ "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist"
)
configure_file(
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index a19844f11c..9b8136a827 100755
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -5,19 +5,33 @@
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
- <string>Second Life</string>
+ <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>${MACOSX_BUNDLE_INFO_STRING}</string>
<key>CFBundleIconFile</key>
- <string>secondlife.icns</string>
+ <string>${MACOSX_BUNDLE_ICON_FILE}</string>
<key>CFBundleIdentifier</key>
- <string>com.secondlife.indra.viewer</string>
+ <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
+ <key>CFBundleLongVersionString</key>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
<key>CFBundleName</key>
- <string>Second Life</string>
+ <string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleSignature</key>
<string>????</string>
+ <key>CFBundleVersion</key>
+ <string>${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}</string>
+ <key>CSResourcesFileMapped</key>
+ <true/>
+ <key>LSRequiresCarbon</key>
+ <true/>
+ <key>NSHumanReadableCopyright</key>
+ <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
@@ -59,9 +73,9 @@
<true/>
</dict>
</array>
- <key>CFBundleVersion</key>
- <string>${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}</string>
- <key>CSResourcesFileMapped</key>
- <true/>
+ <key>NSPrincipalClass</key>
+ <string>${MACOSX_BUNDLE_NSPRINCIPAL_CLASS}</string>
+ <key>NSMainNibFile</key>
+ <string>${MACOSX_BUNDLE_NSMAIN_NIB_FILE}</string>
</dict>
</plist>
diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib
new file mode 100644
index 0000000000..8b99b5a770
--- /dev/null
+++ b/indra/newview/SecondLife.nib
Binary files differ
diff --git a/indra/newview/SecondLife.nib/classes.nib b/indra/newview/SecondLife.nib/classes.nib
deleted file mode 100755
index ea58db1189..0000000000
--- a/indra/newview/SecondLife.nib/classes.nib
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-IBClasses = ();
-IBVersion = 1;
-}
diff --git a/indra/newview/SecondLife.nib/info.nib b/indra/newview/SecondLife.nib/info.nib
deleted file mode 100755
index 1b531de104..0000000000
--- a/indra/newview/SecondLife.nib/info.nib
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>IBDocumentLocation</key>
- <string>85 13 356 240 0 0 1280 1002 </string>
- <key>IBEditorPositions</key>
- <dict>
- <key>29</key>
- <string>27 314 247 44 0 0 1280 1002 </string>
- </dict>
- <key>IBFramework Version</key>
- <string>362.0</string>
- <key>IBOpenObjects</key>
- <array>
- <integer>191</integer>
- </array>
- <key>IBSystem Version</key>
- <string>7D24</string>
- <key>targetFramework</key>
- <string>IBCarbonFramework</string>
-</dict>
-</plist>
diff --git a/indra/newview/SecondLife.nib/objects.xib b/indra/newview/SecondLife.nib/objects.xib
deleted file mode 100755
index b7ff30f2b2..0000000000
--- a/indra/newview/SecondLife.nib/objects.xib
+++ /dev/null
@@ -1,259 +0,0 @@
-<?xml version="1.0" standalone="yes"?>
-<object class="NSIBObjectData">
- <string name="targetFramework">IBCarbonFramework</string>
- <object name="rootObject" class="NSCustomObject" id="1">
- <string name="customClass">NSApplication</string>
- </object>
- <array count="31" name="allObjects">
- <object class="IBCarbonMenu" id="29">
- <string name="title">SecondLife</string>
- <array count="4" name="items">
- <object class="IBCarbonMenuItem" id="182">
- <string name="title">Second Life</string>
- <object name="submenu" class="IBCarbonMenu" id="181">
- <string name="title">Second Life</string>
- <array count="1" name="items">
- <object class="IBCarbonMenuItem" id="183">
- <boolean name="disabled">TRUE</boolean>
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">About Second Life</string>
- <int name="keyEquivalentModifier">0</int>
- <ostype name="command">abou</ostype>
- </object>
- </array>
- <string name="name">_NSAppleMenu</string>
- </object>
- </object>
- <object class="IBCarbonMenuItem" id="127">
- <string name="title">File</string>
- <object name="submenu" class="IBCarbonMenu" id="131">
- <string name="title">File</string>
- </object>
- </object>
- <object class="IBCarbonMenuItem" id="152">
- <string name="title">Edit</string>
- <object name="submenu" class="IBCarbonMenu" id="147">
- <string name="title">Edit</string>
- <array count="10" name="items">
- <object class="IBCarbonMenuItem" id="141">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Undo</string>
- <string name="keyEquivalent">z</string>
- <ostype name="command">undo</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="146">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Redo</string>
- <string name="keyEquivalent">Z</string>
- <ostype name="command">redo</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="142">
- <boolean name="separator">TRUE</boolean>
- </object>
- <object class="IBCarbonMenuItem" id="143">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Cut</string>
- <string name="keyEquivalent">x</string>
- <ostype name="command">cut </ostype>
- </object>
- <object class="IBCarbonMenuItem" id="149">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Copy</string>
- <string name="keyEquivalent">c</string>
- <ostype name="command">copy</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="144">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Paste</string>
- <string name="keyEquivalent">v</string>
- <ostype name="command">past</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="151">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Delete</string>
- <ostype name="command">clea</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="148">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Select All</string>
- <string name="keyEquivalent">a</string>
- <ostype name="command">sall</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="188">
- <boolean name="separator">TRUE</boolean>
- </object>
- <object class="IBCarbonMenuItem" id="187">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Special Characters…</string>
- <ostype name="command">chrp</ostype>
- </object>
- </array>
- </object>
- </object>
- <object class="IBCarbonMenuItem" id="153">
- <string name="title">Window</string>
- <object name="submenu" class="IBCarbonMenu" id="154">
- <string name="title">Window</string>
- <array count="6" name="items">
- <object class="IBCarbonMenuItem" id="155">
- <boolean name="dynamic">TRUE</boolean>
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Minimize Window</string>
- <string name="keyEquivalent">m</string>
- <ostype name="command">mini</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="184">
- <boolean name="dynamic">TRUE</boolean>
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Minimize All Windows</string>
- <string name="keyEquivalent">m</string>
- <int name="keyEquivalentModifier">1572864</int>
- <ostype name="command">mina</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="186">
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Zoom</string>
- <ostype name="command">zoom</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="156">
- <boolean name="separator">TRUE</boolean>
- </object>
- <object class="IBCarbonMenuItem" id="157">
- <boolean name="dynamic">TRUE</boolean>
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Bring All to Front</string>
- <ostype name="command">bfrt</ostype>
- </object>
- <object class="IBCarbonMenuItem" id="185">
- <boolean name="dynamic">TRUE</boolean>
- <boolean name="updateSingleItem">TRUE</boolean>
- <string name="title">Arrange in Front</string>
- <int name="keyEquivalentModifier">1572864</int>
- <ostype name="command">frnt</ostype>
- </object>
- </array>
- <string name="name">_NSWindowsMenu</string>
- </object>
- </object>
- </array>
- <string name="name">_NSMainMenu</string>
- </object>
- <reference idRef="127"/>
- <reference idRef="131"/>
- <reference idRef="141"/>
- <reference idRef="142"/>
- <reference idRef="143"/>
- <reference idRef="144"/>
- <reference idRef="146"/>
- <reference idRef="147"/>
- <reference idRef="148"/>
- <reference idRef="149"/>
- <reference idRef="151"/>
- <reference idRef="152"/>
- <reference idRef="153"/>
- <reference idRef="154"/>
- <reference idRef="155"/>
- <reference idRef="156"/>
- <reference idRef="157"/>
- <reference idRef="181"/>
- <reference idRef="182"/>
- <reference idRef="183"/>
- <reference idRef="184"/>
- <reference idRef="185"/>
- <reference idRef="186"/>
- <reference idRef="187"/>
- <reference idRef="188"/>
- <object class="IBCarbonRootControl" id="190">
- <string name="bounds">0 0 482 694 </string>
- <string name="viewFrame">0 0 694 482 </string>
- <array count="2" name="subviews">
- <object class="IBCarbonButton" id="192">
- <string name="bounds">442 604 462 674 </string>
- <string name="viewFrame">604 442 70 20 </string>
- <string name="title">OK</string>
- <ostype name="command">ok </ostype>
- <object name="layoutInfo" class="IBCarbonHILayoutInfo">
- <int name="bindingBottomKind">2</int>
- <int name="bindingRightKind">2</int>
- </object>
- <int name="buttonType">1</int>
- </object>
- <object class="IBCarbonScrollView" id="201">
- <string name="bounds">20 20 422 674 </string>
- <string name="viewFrame">20 20 654 402 </string>
- <array count="1" name="subviews">
- <object class="IBCarbonTextView" id="200">
- <string name="bounds">20 20 422 659 </string>
- <string name="viewFrame">0 0 639 402 </string>
- <ostype name="controlSignature">text</ostype>
- <int name="fontStyle">5</int>
- <boolean name="readOnly">TRUE</boolean>
- </object>
- </array>
- <boolean name="scrollHorizontally">FALSE</boolean>
- </object>
- </array>
- </object>
- <object class="IBCarbonWindow" id="191">
- <string name="windowRect">84 72 566 766 </string>
- <string name="title">Release Notes</string>
- <reference name="rootControl" idRef="190"/>
- <boolean name="receiveUpdates">FALSE</boolean>
- <boolean name="hasCloseBox">FALSE</boolean>
- <boolean name="hasCollapseBox">FALSE</boolean>
- <boolean name="hasHorizontalZoom">FALSE</boolean>
- <boolean name="isResizable">FALSE</boolean>
- <boolean name="hasVerticalZoom">FALSE</boolean>
- <boolean name="liveResize">TRUE</boolean>
- <boolean name="compositing">TRUE</boolean>
- <int name="carbonWindowClass">4</int>
- <int name="windowPosition">1</int>
- <boolean name="isConstrained">FALSE</boolean>
- </object>
- <reference idRef="192"/>
- <reference idRef="200"/>
- <reference idRef="201"/>
- </array>
- <array count="31" name="allParents">
- <reference idRef="1"/>
- <reference idRef="29"/>
- <reference idRef="127"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="152"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="29"/>
- <reference idRef="29"/>
- <reference idRef="153"/>
- <reference idRef="154"/>
- <reference idRef="154"/>
- <reference idRef="154"/>
- <reference idRef="182"/>
- <reference idRef="29"/>
- <reference idRef="181"/>
- <reference idRef="154"/>
- <reference idRef="154"/>
- <reference idRef="154"/>
- <reference idRef="147"/>
- <reference idRef="147"/>
- <reference idRef="191"/>
- <reference idRef="1"/>
- <reference idRef="190"/>
- <reference idRef="201"/>
- <reference idRef="190"/>
- </array>
- <dictionary count="3" name="nameTable">
- <string>Files Owner</string>
- <reference idRef="1"/>
- <string>MenuBar</string>
- <reference idRef="29"/>
- <string>Release Notes</string>
- <reference idRef="191"/>
- </dictionary>
- <unsigned_int name="nextObjectID">202</unsigned_int>
-</object>
diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib
new file mode 100644
index 0000000000..370df6bf5f
--- /dev/null
+++ b/indra/newview/SecondLife.xib
@@ -0,0 +1,1136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
+ <data>
+ <int key="IBDocument.SystemTarget">1060</int>
+ <string key="IBDocument.SystemVersion">12E55</string>
+ <string key="IBDocument.InterfaceBuilderVersion">4457.6</string>
+ <string key="IBDocument.AppKitVersion">1187.39</string>
+ <string key="IBDocument.HIToolboxVersion">626.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="NS.object.0">4457.6</string>
+ </object>
+ <array key="IBDocument.IntegratedClassDependencies">
+ <string>NSCustomObject</string>
+ <string>NSMenu</string>
+ <string>NSMenuItem</string>
+ <string>NSScrollView</string>
+ <string>NSScroller</string>
+ <string>NSTextView</string>
+ <string>NSView</string>
+ <string>NSWindowTemplate</string>
+ </array>
+ <array key="IBDocument.PluginDependencies">
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </array>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+ <integer value="1" key="NS.object.0"/>
+ </object>
+ <array class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
+ <object class="NSCustomObject" id="1021">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSCustomObject" id="1014">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1050">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSMenu" id="649796088">
+ <string key="NSTitle">Main Menu</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="694149608">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Second Life</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <object class="NSCustomResource" key="NSOnImage" id="353210768">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="549394948">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="110575045">
+ <string key="NSTitle">Second Life</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="238522557">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">About Second Life</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="304266470">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="609285721">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Preferences…</string>
+ <string key="NSKeyEquiv">,</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="481834944">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="1046388886">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Services</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="752062318">
+ <string key="NSTitle">Services</string>
+ <array class="NSMutableArray" key="NSMenuItems"/>
+ <string key="NSName">_NSServicesMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="646227648">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="755159360">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Hide NewApplication</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="342932134">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Hide Others</string>
+ <string key="NSKeyEquiv">h</string>
+ <int key="NSKeyEquivModMask">1572864</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="908899353">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Show All</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="1056857174">
+ <reference key="NSMenu" ref="110575045"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="632727374">
+ <reference key="NSMenu" ref="110575045"/>
+ <string key="NSTitle">Quit Second Life</string>
+ <string key="NSKeyEquiv">q</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ </array>
+ <string key="NSName">_NSAppleMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="725688984">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Edit</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="701759256">
+ <string key="NSTitle">Edit</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="521487141">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Undo</string>
+ <string key="NSKeyEquiv">z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="668936019">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Redo</string>
+ <string key="NSKeyEquiv">Z</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="383018193">
+ <reference key="NSMenu" ref="701759256"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="984623395">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Cut</string>
+ <string key="NSKeyEquiv">x</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="656529582">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Copy</string>
+ <string key="NSKeyEquiv">c</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="1032676691">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Paste</string>
+ <string key="NSKeyEquiv">v</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="538907583">
+ <reference key="NSMenu" ref="701759256"/>
+ <string key="NSTitle">Select All</string>
+ <string key="NSKeyEquiv">a</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ </array>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="713487014">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Window</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ <string key="NSAction">submenuAction:</string>
+ <object class="NSMenu" key="NSSubmenu" id="835318025">
+ <string key="NSTitle">Window</string>
+ <array class="NSMutableArray" key="NSMenuItems">
+ <object class="NSMenuItem" id="1011231497">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Minimize</string>
+ <string key="NSKeyEquiv">m</string>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="575023229">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Zoom</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="86356408">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Enter Full Screen</string>
+ <string key="NSKeyEquiv">f</string>
+ <int key="NSKeyEquivModMask">1310720</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="299356726">
+ <reference key="NSMenu" ref="835318025"/>
+ <bool key="NSIsDisabled">YES</bool>
+ <bool key="NSIsSeparator">YES</bool>
+ <string key="NSTitle"/>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ <object class="NSMenuItem" id="625202149">
+ <reference key="NSMenu" ref="835318025"/>
+ <string key="NSTitle">Bring All to Front</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ </array>
+ <string key="NSName">_NSWindowsMenu</string>
+ </object>
+ </object>
+ <object class="NSMenuItem" id="391199113">
+ <reference key="NSMenu" ref="649796088"/>
+ <string key="NSTitle">Help</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="353210768"/>
+ <reference key="NSMixedImage" ref="549394948"/>
+ </object>
+ </array>
+ <string key="NSName">_NSMainMenu</string>
+ </object>
+ <object class="NSCustomObject" id="756173070">
+ <string key="NSClassName">LLAppDelegate</string>
+ </object>
+ <object class="NSWindowTemplate" id="110292814">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 240}, {1024, 600}}</string>
+ <int key="NSWTFlags">74974208</int>
+ <string key="NSWindowTitle">Second Life</string>
+ <string key="NSWindowClass">LLNSWindow</string>
+ <nil key="NSViewClass"/>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <object class="NSView" key="NSWindowView" id="305280978">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews"/>
+ <string key="NSFrameSize">{1024, 600}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <string key="NSReuseIdentifierKey">_NS:20</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
+ <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
+ <string key="NSFrameAutosaveName">Second Life</string>
+ <int key="NSWindowCollectionBehavior">128</int>
+ <bool key="NSWindowIsRestorable">YES</bool>
+ </object>
+ <object class="NSWindowTemplate" id="979091056">
+ <int key="NSWindowStyleMask">31</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{272, 176}, {938, 42}}</string>
+ <int key="NSWTFlags">-1535638528</int>
+ <string key="NSWindowTitle">Input Window</string>
+ <string key="NSWindowClass">LLUserInputWindow</string>
+ <nil key="NSViewClass"/>
+ <nil key="NSUserInterfaceItemIdentifier"/>
+ <object class="NSView" key="NSWindowView" id="1044753903">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSScrollView" id="238626476">
+ <reference key="NSNextResponder" ref="1044753903"/>
+ <int key="NSvFlags">256</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSClipView" id="871543330">
+ <reference key="NSNextResponder" ref="238626476"/>
+ <int key="NSvFlags">2322</int>
+ <array class="NSMutableArray" key="NSSubviews">
+ <object class="NSTextView" id="395788163">
+ <reference key="NSNextResponder" ref="871543330"/>
+ <int key="NSvFlags">2322</int>
+ <set class="NSMutableSet" key="NSDragTypes">
+ <string>Apple HTML pasteboard type</string>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>Apple URL pasteboard type</string>
+ <string>CorePasteboardFlavorType 0x6D6F6F76</string>
+ <string>NSColor pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NSStringPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT RTFD pasteboard type</string>
+ <string>NeXT Rich Text Format v1.0 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ <string>NeXT font pasteboard type</string>
+ <string>NeXT ruler pasteboard type</string>
+ <string>WebURLsWithTitlesPboardType</string>
+ <string>public.url</string>
+ </set>
+ <string key="NSFrameSize">{938, 42}</string>
+ <reference key="NSSuperview" ref="871543330"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="339833963"/>
+ <string key="NSReuseIdentifierKey">_NS:13</string>
+ <object class="NSTextContainer" key="NSTextContainer" id="648552009">
+ <object class="NSLayoutManager" key="NSLayoutManager">
+ <object class="NSTextStorage" key="NSTextStorage">
+ <object class="NSMutableString" key="NSString">
+ <characters key="NS.bytes"/>
+ </object>
+ <nil key="NSDelegate"/>
+ </object>
+ <array class="NSMutableArray" key="NSTextContainers">
+ <reference ref="648552009"/>
+ </array>
+ <int key="NSLMFlags">166</int>
+ <nil key="NSDelegate"/>
+ </object>
+ <reference key="NSTextView" ref="395788163"/>
+ <double key="NSWidth">938</double>
+ <int key="NSTCFlags">1</int>
+ </object>
+ <object class="NSTextViewSharedData" key="NSSharedData">
+ <int key="NSFlags">67121127</int>
+ <int key="NSTextCheckingTypes">0</int>
+ <nil key="NSMarkedAttributes"/>
+ <object class="NSColor" key="NSBackgroundColor" id="535647664">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ <dictionary key="NSSelectedAttributes">
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">selectedTextBackgroundColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">selectedTextColor</string>
+ <object class="NSColor" key="NSColor" id="835883401">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </dictionary>
+ <reference key="NSInsertionColor" ref="835883401"/>
+ <dictionary key="NSLinkAttributes">
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MCAwIDEAA</bytes>
+ </object>
+ <object class="NSCursor" key="NSCursor">
+ <string key="NSHotSpot">{8, -8}</string>
+ <int key="NSCursorType">13</int>
+ </object>
+ <integer value="1" key="NSUnderline"/>
+ </dictionary>
+ <nil key="NSDefaultParagraphStyle"/>
+ <nil key="NSTextFinder"/>
+ <int key="NSPreferredTextFinderStyle">1</int>
+ </object>
+ <int key="NSTVFlags">6</int>
+ <string key="NSMaxSize">{939, 10000000}</string>
+ <nil key="NSDelegate"/>
+ </object>
+ </array>
+ <string key="NSFrame">{{1, 1}, {938, 42}}</string>
+ <reference key="NSSuperview" ref="238626476"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="395788163"/>
+ <string key="NSReuseIdentifierKey">_NS:11</string>
+ <reference key="NSDocView" ref="395788163"/>
+ <reference key="NSBGColor" ref="535647664"/>
+ <object class="NSCursor" key="NSCursor">
+ <string key="NSHotSpot">{4, 5}</string>
+ <object class="NSImage" key="NSImage">
+ <int key="NSImageFlags">79691776</int>
+ <array key="NSReps">
+ <array>
+ <integer value="5"/>
+ <object class="NSURL">
+ <nil key="NS.base"/>
+ <string key="NS.relative">file://localhost/Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework/Resources/DVTIbeamCursor.tiff</string>
+ </object>
+ </array>
+ </array>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwAA</bytes>
+ </object>
+ </object>
+ </object>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="339833963">
+ <reference key="NSNextResponder" ref="238626476"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{923, 1}, {16, 42}}</string>
+ <reference key="NSSuperview" ref="238626476"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView"/>
+ <string key="NSReuseIdentifierKey">_NS:83</string>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <reference key="NSTarget" ref="238626476"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">0.96666666666666667</double>
+ </object>
+ <object class="NSScroller" id="1067057765">
+ <reference key="NSNextResponder" ref="238626476"/>
+ <int key="NSvFlags">-2147483392</int>
+ <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
+ <reference key="NSSuperview" ref="238626476"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="871543330"/>
+ <string key="NSReuseIdentifierKey">_NS:33</string>
+ <bool key="NSAllowsLogicalLayoutDirection">NO</bool>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="238626476"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1</double>
+ <double key="NSPercent">0.94565218687057495</double>
+ </object>
+ </array>
+ <string key="NSFrame">{{-1, -1}, {940, 44}}</string>
+ <reference key="NSSuperview" ref="1044753903"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="1067057765"/>
+ <string key="NSReuseIdentifierKey">_NS:9</string>
+ <int key="NSsFlags">133138</int>
+ <reference key="NSVScroller" ref="339833963"/>
+ <reference key="NSHScroller" ref="1067057765"/>
+ <reference key="NSContentView" ref="871543330"/>
+ <double key="NSMinMagnification">0.25</double>
+ <double key="NSMaxMagnification">4</double>
+ <double key="NSMagnification">1</double>
+ </object>
+ </array>
+ <string key="NSFrameSize">{938, 42}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <reference key="NSNextKeyView" ref="238626476"/>
+ <string key="NSReuseIdentifierKey">_NS:21</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
+ <string key="NSMaxSize">{10000000000000, 10000000000000}</string>
+ <bool key="NSWindowIsRestorable">YES</bool>
+ </object>
+ </array>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <array class="NSMutableArray" key="connectionRecords">
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">terminate:</string>
+ <reference key="source" ref="1050"/>
+ <reference key="destination" ref="632727374"/>
+ </object>
+ <int key="connectionID">823</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">orderFrontStandardAboutPanel:</string>
+ <reference key="source" ref="1021"/>
+ <reference key="destination" ref="238522557"/>
+ </object>
+ <int key="connectionID">142</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">delegate</string>
+ <reference key="source" ref="1021"/>
+ <reference key="destination" ref="756173070"/>
+ </object>
+ <int key="connectionID">845</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performMiniaturize:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="1011231497"/>
+ </object>
+ <int key="connectionID">37</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">arrangeInFront:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="625202149"/>
+ </object>
+ <int key="connectionID">39</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">performZoom:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="575023229"/>
+ </object>
+ <int key="connectionID">240</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hide:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="755159360"/>
+ </object>
+ <int key="connectionID">369</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">hideOtherApplications:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="342932134"/>
+ </object>
+ <int key="connectionID">370</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">unhideAllApplications:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="908899353"/>
+ </object>
+ <int key="connectionID">372</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cut:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="984623395"/>
+ </object>
+ <int key="connectionID">768</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">paste:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="1032676691"/>
+ </object>
+ <int key="connectionID">769</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">undo:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="521487141"/>
+ </object>
+ <int key="connectionID">776</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">copy:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="656529582"/>
+ </object>
+ <int key="connectionID">782</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">selectAll:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="538907583"/>
+ </object>
+ <int key="connectionID">785</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">toggleFullScreen:</string>
+ <reference key="source" ref="1014"/>
+ <reference key="destination" ref="86356408"/>
+ </object>
+ <int key="connectionID">842</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">window</string>
+ <reference key="source" ref="756173070"/>
+ <reference key="destination" ref="110292814"/>
+ </object>
+ <int key="connectionID">850</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">inputWindow</string>
+ <reference key="source" ref="756173070"/>
+ <reference key="destination" ref="979091056"/>
+ </object>
+ <int key="connectionID">953</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">inputView</string>
+ <reference key="source" ref="756173070"/>
+ <reference key="destination" ref="395788163"/>
+ </object>
+ <int key="connectionID">954</int>
+ </object>
+ </array>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <array key="orderedObjects">
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <array key="object" id="0"/>
+ <reference key="children" ref="1048"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1021"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1014"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1050"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">29</int>
+ <reference key="object" ref="649796088"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="713487014"/>
+ <reference ref="694149608"/>
+ <reference ref="391199113"/>
+ <reference ref="725688984"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Main Menu</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="713487014"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="835318025"/>
+ </array>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">56</int>
+ <reference key="object" ref="694149608"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="110575045"/>
+ </array>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">103</int>
+ <reference key="object" ref="391199113"/>
+ <array class="NSMutableArray" key="children"/>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">57</int>
+ <reference key="object" ref="110575045"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="238522557"/>
+ <reference ref="755159360"/>
+ <reference ref="908899353"/>
+ <reference ref="632727374"/>
+ <reference ref="646227648"/>
+ <reference ref="609285721"/>
+ <reference ref="481834944"/>
+ <reference ref="304266470"/>
+ <reference ref="1046388886"/>
+ <reference ref="1056857174"/>
+ <reference ref="342932134"/>
+ </array>
+ <reference key="parent" ref="694149608"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">58</int>
+ <reference key="object" ref="238522557"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">134</int>
+ <reference key="object" ref="755159360"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">150</int>
+ <reference key="object" ref="908899353"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="632727374"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">144</int>
+ <reference key="object" ref="646227648"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">129</int>
+ <reference key="object" ref="609285721"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">143</int>
+ <reference key="object" ref="481834944"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">236</int>
+ <reference key="object" ref="304266470"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">131</int>
+ <reference key="object" ref="1046388886"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="752062318"/>
+ </array>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">149</int>
+ <reference key="object" ref="1056857174"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">145</int>
+ <reference key="object" ref="342932134"/>
+ <reference key="parent" ref="110575045"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">130</int>
+ <reference key="object" ref="752062318"/>
+ <reference key="parent" ref="1046388886"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">24</int>
+ <reference key="object" ref="835318025"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="299356726"/>
+ <reference ref="625202149"/>
+ <reference ref="575023229"/>
+ <reference ref="1011231497"/>
+ <reference ref="86356408"/>
+ </array>
+ <reference key="parent" ref="713487014"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="299356726"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="625202149"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">239</int>
+ <reference key="object" ref="575023229"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="1011231497"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">711</int>
+ <reference key="object" ref="725688984"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="701759256"/>
+ </array>
+ <reference key="parent" ref="649796088"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">712</int>
+ <reference key="object" ref="701759256"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="521487141"/>
+ <reference ref="668936019"/>
+ <reference ref="383018193"/>
+ <reference ref="984623395"/>
+ <reference ref="656529582"/>
+ <reference ref="1032676691"/>
+ <reference ref="538907583"/>
+ </array>
+ <reference key="parent" ref="725688984"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">716</int>
+ <reference key="object" ref="984623395"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">717</int>
+ <reference key="object" ref="656529582"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">718</int>
+ <reference key="object" ref="1032676691"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">721</int>
+ <reference key="object" ref="538907583"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">824</int>
+ <reference key="object" ref="756173070"/>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">841</int>
+ <reference key="object" ref="86356408"/>
+ <reference key="parent" ref="835318025"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">828</int>
+ <reference key="object" ref="110292814"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="305280978"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">829</int>
+ <reference key="object" ref="305280978"/>
+ <array class="NSMutableArray" key="children"/>
+ <reference key="parent" ref="110292814"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">713</int>
+ <reference key="object" ref="521487141"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">714</int>
+ <reference key="object" ref="668936019"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">715</int>
+ <reference key="object" ref="383018193"/>
+ <reference key="parent" ref="701759256"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">941</int>
+ <reference key="object" ref="979091056"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="1044753903"/>
+ </array>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">942</int>
+ <reference key="object" ref="1044753903"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="238626476"/>
+ </array>
+ <reference key="parent" ref="979091056"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">943</int>
+ <reference key="object" ref="238626476"/>
+ <array class="NSMutableArray" key="children">
+ <reference ref="395788163"/>
+ <reference ref="1067057765"/>
+ <reference ref="339833963"/>
+ </array>
+ <reference key="parent" ref="1044753903"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">944</int>
+ <reference key="object" ref="395788163"/>
+ <reference key="parent" ref="238626476"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">945</int>
+ <reference key="object" ref="1067057765"/>
+ <reference key="parent" ref="238626476"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">946</int>
+ <reference key="object" ref="339833963"/>
+ <reference key="parent" ref="238626476"/>
+ </object>
+ </array>
+ </object>
+ <dictionary class="NSMutableDictionary" key="flattenedProperties">
+ <string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="103.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="134.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="136.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="143.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="144.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="145.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="149.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="150.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="236.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="239.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="56.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="57.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="58.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="711.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="712.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="713.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="714.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="715.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="716.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="717.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="718.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="721.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="824.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="828.IBNSWindowAutoPositionCentersHorizontal"/>
+ <boolean value="YES" key="828.IBNSWindowAutoPositionCentersVertical"/>
+ <string key="828.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="YES" key="828.NSWindowTemplate.visibleAtLaunch"/>
+ <string key="829.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="841.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="92.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="941.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <boolean value="NO" key="941.NSWindowTemplate.visibleAtLaunch"/>
+ <string key="942.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="943.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="944.CustomClassName">LLNonInlineTextView</string>
+ <string key="944.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="945.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string key="946.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+ <nil key="activeLocalization"/>
+ <dictionary class="NSMutableDictionary" key="localizations"/>
+ <nil key="sourceID"/>
+ <int key="maxID">954</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <array class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <object class="IBPartialClassDescription">
+ <string key="className">LLAppDelegate</string>
+ <string key="superclassName">NSObject</string>
+ <dictionary class="NSMutableDictionary" key="outlets">
+ <string key="inputView">LLNonInlineTextView</string>
+ <string key="inputWindow">NSWindow</string>
+ <string key="window">LLNSWindow</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+ <object class="IBToOneOutletInfo" key="inputView">
+ <string key="name">inputView</string>
+ <string key="candidateClassName">LLNonInlineTextView</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="inputWindow">
+ <string key="name">inputWindow</string>
+ <string key="candidateClassName">NSWindow</string>
+ </object>
+ <object class="IBToOneOutletInfo" key="window">
+ <string key="name">window</string>
+ <string key="candidateClassName">LLNSWindow</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/LLAppDelegate.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">LLNSWindow</string>
+ <string key="superclassName">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/LLNSWindow.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">LLNonInlineTextView</string>
+ <string key="superclassName">NSTextView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/LLNonInlineTextView.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">LLUserInputWindow</string>
+ <string key="superclassName">NSPanel</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/LLUserInputWindow.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSTextView</string>
+ <dictionary class="NSMutableDictionary" key="actions">
+ <string key="orderFrontSharingServicePicker:">id</string>
+ <string key="toggleQuickLookPreviewPanel:">id</string>
+ </dictionary>
+ <dictionary class="NSMutableDictionary" key="actionInfosByName">
+ <object class="IBActionInfo" key="orderFrontSharingServicePicker:">
+ <string key="name">orderFrontSharingServicePicker:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ <object class="IBActionInfo" key="toggleQuickLookPreviewPanel:">
+ <string key="name">toggleQuickLookPreviewPanel:</string>
+ <string key="candidateClassName">id</string>
+ </object>
+ </dictionary>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">./Classes/NSTextView.h</string>
+ </object>
+ </object>
+ </array>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <real value="1060" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="4600" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <dictionary class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <string key="NSMenuCheckmark">{11, 11}</string>
+ <string key="NSMenuMixedState">{10, 3}</string>
+ </dictionary>
+ </data>
+</archive>
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index d15b8b06fa..4f2c1d15f6 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.6.5
+3.6.6
diff --git a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
index 2cef8f2a5d..a2b4b3b8c8 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/fxaaF.glsl
@@ -24,6 +24,7 @@
*/
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
index 97bf49a605..0443b592e2 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl
@@ -32,6 +32,7 @@ out vec4 frag_color;
//class 1 -- no shadows
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 08583ad0f2..58875ff4ea 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -24,6 +24,7 @@
*/
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
index 1975b18652..28432dac9a 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl
@@ -22,8 +22,9 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-
+
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
@@ -31,6 +32,8 @@ out vec4 frag_color;
#define frag_color gl_FragColor
#endif
+//class 1 -- no shadows
+
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
uniform sampler2DRect depthMap;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
index 780df9ed1a..37179c7e14 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl
@@ -24,6 +24,7 @@
*/
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
index fc0e6b2388..9bdee15541 100755
--- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl
@@ -24,6 +24,7 @@
*/
#extension GL_ARB_texture_rectangle : enable
+#extension GL_ARB_shader_texture_lod : enable
#ifdef DEFINE_GL_FRAGCOLOR
out vec4 frag_color;
diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm
new file mode 100644
index 0000000000..30476b3d22
--- /dev/null
+++ b/indra/newview/llappdelegate-objc.mm
@@ -0,0 +1,144 @@
+/**
+ * @file llappdelegate-objc.mm
+ * @brief Class implementation for the Mac version's application delegate.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#import "llappdelegate-objc.h"
+#include "llwindowmacosx-objc.h"
+#include <Carbon/Carbon.h> // Used for Text Input Services ("Safe" API - it's supported)
+
+@implementation LLAppDelegate
+
+@synthesize window;
+@synthesize inputWindow;
+@synthesize inputView;
+@synthesize currentInputLanguage;
+
+- (void)dealloc
+{
+ [super dealloc];
+}
+
+- (void) applicationDidFinishLaunching:(NSNotification *)notification
+{
+ frameTimer = nil;
+
+ [self languageUpdated];
+
+ if (initViewer())
+ {
+ frameTimer = [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(mainLoop) userInfo:nil repeats:YES];
+ } else {
+ handleQuit();
+ }
+
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil];
+}
+
+- (void) applicationDidBecomeActive:(NSNotification *)notification
+{
+ callWindowFocus();
+}
+
+- (void) applicationDidResignActive:(NSNotification *)notification
+{
+ callWindowUnfocus();
+}
+
+- (NSApplicationDelegateReply) applicationShouldTerminate:(NSApplication *)sender
+{
+ if (!runMainLoop())
+ {
+ handleQuit();
+ return NSTerminateCancel;
+ } else {
+ [frameTimer release];
+ cleanupViewer();
+ return NSTerminateNow;
+ }
+}
+
+- (void) mainLoop
+{
+ bool appExiting = runMainLoop();
+ if (appExiting)
+ {
+ [frameTimer release];
+ [[NSApplication sharedApplication] terminate:self];
+ }
+}
+
+- (void) showInputWindow:(bool)show withEvent:(NSEvent*)textEvent
+{
+ if (![self romanScript])
+ {
+ if (show)
+ {
+ NSLog(@"Showing input window.");
+ [inputWindow makeKeyAndOrderFront:inputWindow];
+ if (textEvent != nil)
+ {
+ [[inputView inputContext] discardMarkedText];
+ [[inputView inputContext] handleEvent:textEvent];
+ }
+ } else {
+ NSLog(@"Hiding input window.");
+ [inputWindow orderOut:inputWindow];
+ [window makeKeyAndOrderFront:window];
+ }
+ }
+}
+
+// This will get called multiple times by NSNotificationCenter.
+// It will be called every time that the window focus changes, and every time that the input language gets changed.
+// The primary use case for this selector is to update our current input language when the user, for whatever reason, changes the input language.
+// This is the more elegant way of handling input language changes instead of checking every time we want to use the input window.
+
+- (void) languageUpdated
+{
+ TISInputSourceRef currentInput = TISCopyCurrentKeyboardInputSource();
+ CFArrayRef languages = (CFArrayRef)TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages);
+
+#if 0 // In the event of ever needing to add new language sources, change this to 1 and watch the terminal for "languages:"
+ NSLog(@"languages: %@", TISGetInputSourceProperty(currentInput, kTISPropertyInputSourceLanguages));
+#endif
+
+ // Typically the language we want is going to be the very first result in the array.
+ currentInputLanguage = (NSString*)CFArrayGetValueAtIndex(languages, 0);
+}
+
+- (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;
+ }
+
+ return true;
+}
+
+@end
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 003d82dd0e..02eb67bf80 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -723,6 +723,11 @@ bool LLAppViewer::init()
// we run the "program crashed last time" error handler below.
//
LLFastTimer::reset();
+
+
+#ifdef LL_DARWIN
+ mMainLoopInitialized = false;
+#endif
// initialize LLWearableType translation bridge.
// Memory will be cleaned up in ::cleanupClass()
@@ -1253,40 +1258,57 @@ LLFastTimer::DeclareTimer FTM_FRAME("Frame", true);
bool LLAppViewer::mainLoop()
{
- mMainloopTimeout = new LLWatchdogTimeout();
+#ifdef LL_DARWIN
+ if (!mMainLoopInitialized)
+#endif
+ {
+ mMainloopTimeout = new LLWatchdogTimeout();
+
+ //-------------------------------------------
+ // Run main loop until time to quit
+ //-------------------------------------------
+
+ // Create IO Pump to use for HTTP Requests.
+ gServicePump = new LLPumpIO(gAPRPoolp);
+ LLHTTPClient::setPump(*gServicePump);
+ LLCurl::setCAFile(gDirUtilp->getCAFile());
+
+ // Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
+
+ LLVoiceChannel::initClass();
+ LLVoiceClient::getInstance()->init(gServicePump);
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLFloaterIMContainer::onCurrentChannelChanged, _1), true);
+
+ joystick = LLViewerJoystick::getInstance();
+ joystick->setNeedsReset(true);
+
+#ifdef LL_DARWIN
+ // Ensure that this section of code never gets called again on OS X.
+ mMainLoopInitialized = true;
+#endif
+ }
+ // As we do not (yet) send data on the mainloop LLEventPump that varies
+ // with each frame, no need to instantiate a new LLSD event object each
+ // time. Obviously, if that changes, just instantiate the LLSD at the
+ // point of posting.
+
+ LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
+
+ LLSD newFrame;
- //-------------------------------------------
- // Run main loop until time to quit
- //-------------------------------------------
-
- // Create IO Pump to use for HTTP Requests.
- gServicePump = new LLPumpIO(gAPRPoolp);
- LLHTTPClient::setPump(*gServicePump);
- LLCurl::setCAFile(gDirUtilp->getCAFile());
-
- // Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
-
- LLVoiceChannel::initClass();
- LLVoiceClient::getInstance()->init(gServicePump);
- LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLFloaterIMContainer::onCurrentChannelChanged, _1), true);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
- LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
- joystick->setNeedsReset(true);
-
- LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
- // As we do not (yet) send data on the mainloop LLEventPump that varies
- // with each frame, no need to instantiate a new LLSD event object each
- // time. Obviously, if that changes, just instantiate the LLSD at the
- // point of posting.
- LLSD newFrame;
-
+
//LLPrivateMemoryPoolTester::getInstance()->run(false) ;
//LLPrivateMemoryPoolTester::getInstance()->run(true) ;
//LLPrivateMemoryPoolTester::destroy() ;
// Handle messages
+#ifdef LL_DARWIN
+ if (!LLApp::isExiting())
+#else
while (!LLApp::isExiting())
+#endif
{
LLFastTimer _(FTM_FRAME);
LLFastTimer::nextFrame();
@@ -1562,34 +1584,37 @@ bool LLAppViewer::mainLoop()
}
}
- // Save snapshot for next time, if we made it through initialization
- if (STATE_STARTED == LLStartUp::getStartupState())
+ if (LLApp::isExiting())
{
- try
- {
- saveFinalSnapshot();
- }
- catch(std::bad_alloc)
+ // Save snapshot for next time, if we made it through initialization
+ if (STATE_STARTED == LLStartUp::getStartupState())
{
- llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
-
- //stop memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance =
- LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
- if(mem_leak_instance)
+ try
{
- mem_leak_instance->stop() ;
- }
+ saveFinalSnapshot();
+ }
+ catch(std::bad_alloc)
+ {
+ llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
+
+ //stop memory leaking simulation
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ if(mem_leak_instance)
+ {
+ mem_leak_instance->stop() ;
+ }
+ }
}
+
+ delete gServicePump;
+
+ destroyMainloopTimeout();
+
+ llinfos << "Exiting main_loop" << llendflush;
}
-
- delete gServicePump;
-
- destroyMainloopTimeout();
-
- llinfos << "Exiting main_loop" << llendflush;
- return true;
+ return LLApp::isExiting();
}
void LLAppViewer::flushVFSIO()
@@ -2667,8 +2692,6 @@ bool LLAppViewer::initConfiguration()
//}
#if LL_DARWIN
- // Initialize apple menubar and various callbacks
- init_apple_menu(LLTrans::getString("APP_NAME").c_str());
#if __ppc__
// If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further.
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 3af360b529..3ae8a78845 100755
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -42,6 +42,7 @@ class LLImageDecodeThread;
class LLTextureFetch;
class LLWatchdogTimeout;
class LLUpdaterService;
+class LLViewerJoystick;
extern LLFastTimer::DeclareTimer FTM_FRAME;
@@ -255,6 +256,8 @@ private:
std::string mSerialNumber;
bool mPurgeCache;
bool mPurgeOnExit;
+ bool mMainLoopInitialized;
+ LLViewerJoystick* joystick;
bool mSavedFinalSnapshot;
bool mSavePerAccountSettings; // only save per account settings if login succeeded
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index c7b437598c..316c90d9d2 100755
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -30,7 +30,10 @@
#error "Use only with Mac OS X"
#endif
+#define LL_CARBON_CRASH_HANDLER 1
+
#include "llappviewermacosx.h"
+#include "llwindowmacosx-objc.h"
#include "llcommandlineparser.h"
#include "llviewernetwork.h"
@@ -38,7 +41,10 @@
#include "llmd5.h"
#include "llfloaterworldmap.h"
#include "llurldispatcher.h"
+#include <ApplicationServices/ApplicationServices.h>
+#ifdef LL_CARBON_CRASH_HANDLER
#include <Carbon/Carbon.h>
+#endif
#include "lldir.h"
#include <signal.h>
#include <CoreAudio/CoreAudio.h> // for systemwide mute
@@ -50,9 +56,9 @@ namespace
// They are not used immediately by the app.
int gArgC;
char** gArgV;
-
bool sCrashReporterIsRunning = false;
-
+ LLAppViewerMacOSX* gViewerAppPtr;
+#ifdef LL_CARBON_CRASH_HANDLER
OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
{
OSErr result = noErr;
@@ -61,9 +67,10 @@ namespace
return(result);
}
+#endif
}
-int main( int argc, char **argv )
+bool initViewer()
{
#if LL_SOLARIS && defined(__sparc)
asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
@@ -73,43 +80,60 @@ int main( int argc, char **argv )
if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1)
{
llwarns << "Could not change directory to "
- << gDirUtilp->getAppRODataDir() << ": " << strerror(errno)
- << llendl;
+ << gDirUtilp->getAppRODataDir() << ": " << strerror(errno)
+ << llendl;
}
-
- LLAppViewerMacOSX* viewer_app_ptr = new LLAppViewerMacOSX();
-
- viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
-
- // Store off the command line args for use later.
- gArgC = argc;
- gArgV = argv;
- bool ok = viewer_app_ptr->init();
+ gViewerAppPtr = new LLAppViewerMacOSX();
+
+ gViewerAppPtr->setErrorHandler(LLAppViewer::handleViewerCrash);
+
+
+
+ bool ok = gViewerAppPtr->init();
if(!ok)
{
llwarns << "Application init failed." << llendl;
- return -1;
}
+
+ return ok;
+}
- // Run the application main loop
- if(!LLApp::isQuitting())
+void handleQuit()
+{
+ LLAppViewer::instance()->userQuit();
+}
+
+bool runMainLoop()
+{
+ bool ret = LLApp::isQuitting();
+ if (!ret && gViewerAppPtr != NULL)
{
- viewer_app_ptr->mainLoop();
+ ret = gViewerAppPtr->mainLoop();
+ } else {
+ ret = true;
}
+
+ return ret;
+}
- if (!LLApp::isError())
+void cleanupViewer()
+{
+ if(!LLApp::isError())
{
- //
- // We don't want to do cleanup here if the error handler got called -
- // the assumption is that the error handler is responsible for doing
- // app cleanup if there was a problem.
- //
- viewer_app_ptr->cleanup();
+ gViewerAppPtr->cleanup();
}
- delete viewer_app_ptr;
- viewer_app_ptr = NULL;
- return 0;
+
+ delete gViewerAppPtr;
+ gViewerAppPtr = NULL;
+}
+
+int main( int argc, char **argv )
+{
+ // Store off the command line args for use later.
+ gArgC = argc;
+ gArgV = argv;
+ return createNSApp(argc, (const char**)argv);
}
LLAppViewerMacOSX::LLAppViewerMacOSX()
@@ -239,23 +263,24 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
return reset_count == 0;
}
-static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
- EventRef inEvent,
+#ifdef LL_CARBON_CRASH_HANDLER
+static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
+ EventRef inEvent,
void* inUserData)
{
ProcessSerialNumber psn;
- GetEventParameter(inEvent,
- kEventParamProcessID,
- typeProcessSerialNumber,
- NULL,
- sizeof(psn),
- NULL,
+ GetEventParameter(inEvent,
+ kEventParamProcessID,
+ typeProcessSerialNumber,
+ NULL,
+ sizeof(psn),
+ NULL,
&psn);
- if( GetEventKind(inEvent) == kEventAppTerminated )
+ if( GetEventKind(inEvent) == kEventAppTerminated )
{
- Boolean matching_psn = FALSE;
+ Boolean matching_psn = FALSE;
OSErr os_result = SameProcess(&psn, (ProcessSerialNumber*)inUserData, &matching_psn);
if(os_result >= 0 && matching_psn)
{
@@ -265,48 +290,58 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
}
return noErr;
}
+#endif
void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
{
- // This used to use fork&exec, but is switched to LSOpenApplication to
+#ifdef LL_CARBON_CRASH_HANDLER
+ // This used to use fork&exec, but is switched to LSOpenApplication to
// Make sure the crash reporter launches in front of the SL window.
std::string command_str;
//command_str = "open Second Life.app/Contents/Resources/mac-crash-logger.app";
command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger";
+ CFURLRef urlRef = CFURLCreateFromFileSystemRepresentation(NULL, (UInt8*)command_str.c_str(), strlen(command_str.c_str()), FALSE);
+
+ // FSRef apparently isn't deprecated.
+ // There's other funcitonality that depends on it existing as well that isn't deprecated.
+ // There doesn't seem to be much to directly verify what the status of FSRef is, outside of some documentation pointing at FSRef being valid, and other documentation pointing to everything in Files.h being deprecated.
+ // We'll assume it isn't for now, since all non-deprecated functions that use it seem to assume similar.
+
FSRef appRef;
- Boolean isDir = 0;
- OSStatus os_result = FSPathMakeRef((UInt8*)command_str.c_str(),
- &appRef,
- &isDir);
- if(os_result >= 0)
+ Boolean pathstatus = CFURLGetFSRef(urlRef, &appRef);
+
+ OSStatus os_result = noErr;
+
+ if(pathstatus == true)
{
LSApplicationParameters appParams;
memset(&appParams, 0, sizeof(appParams));
appParams.version = 0;
appParams.flags = kLSLaunchNoParams | kLSLaunchStartClassic;
+
appParams.application = &appRef;
if(reportFreeze)
{
- // Make sure freeze reporting launches the crash logger synchronously, lest
+ // Make sure freeze reporting launches the crash logger synchronously, lest
// Log files get changed by SL while the logger is running.
-
+
// *NOTE:Mani A better way - make a copy of the data that the crash reporter will send
// and let SL go about its business. This way makes the mac work like windows and linux
- // and is the smallest patch for the issue.
+ // and is the smallest patch for the issue.
sCrashReporterIsRunning = false;
ProcessSerialNumber o_psn;
-
+
static EventHandlerRef sCarbonEventsRef = NULL;
- static const EventTypeSpec kEvents[] =
+ static const EventTypeSpec kEvents[] =
{
{ kEventClassApplication, kEventAppTerminated }
};
// Install the handler to detect crash logger termination
- InstallEventHandler(GetApplicationEventTarget(),
+ InstallEventHandler(GetApplicationEventTarget(),
(EventHandlerUPP) CarbonEventHandler,
GetEventTypeCount(kEvents),
kEvents,
@@ -314,31 +349,31 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
&sCarbonEventsRef
);
- // Remove, temporarily the quit handler - which has *crash* behavior before
+ // Remove, temporarily the quit handler - which has *crash* behavior before
// the mainloop gets running!
- AERemoveEventHandler(kCoreEventClass,
- kAEQuitApplication,
+ AERemoveEventHandler(kCoreEventClass,
+ kAEQuitApplication,
NewAEEventHandlerUPP(AEQuitHandler),
false);
-
+
// Launch the crash reporter.
os_result = LSOpenApplication(&appParams, &o_psn);
if(os_result >= 0)
- {
+ {
sCrashReporterIsRunning = true;
}
-
+
while(sCrashReporterIsRunning)
{
RunApplicationEventLoop();
}
-
+
// Re-install the apps quit handler.
- AEInstallEventHandler(kCoreEventClass,
- kAEQuitApplication,
+ AEInstallEventHandler(kCoreEventClass,
+ kAEQuitApplication,
NewAEEventHandlerUPP(AEQuitHandler),
- 0,
+ 0,
false);
// Remove the crash reporter quit handler.
@@ -348,12 +383,12 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
{
appParams.flags |= kLSLaunchAsync;
clear_signals();
-
+
ProcessSerialNumber o_psn;
os_result = LSOpenApplication(&appParams, &o_psn);
}
-
}
+#endif
}
std::string LLAppViewerMacOSX::generateSerialNumber()
@@ -486,73 +521,3 @@ OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
return(result);
}
-
-OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata)
-{
- OSStatus result = eventNotHandledErr;
- OSStatus err;
- UInt32 evtClass = GetEventClass(event);
- UInt32 evtKind = GetEventKind(event);
- WindowRef window = (WindowRef)userdata;
-
- if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess))
- {
- HICommand cmd;
- err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd);
-
- if(err == noErr)
- {
- switch(cmd.commandID)
- {
- case kHICommandOK:
- QuitAppModalLoopForWindow(window);
- result = noErr;
- break;
-
- case kHICommandCancel:
- QuitAppModalLoopForWindow(window);
- result = userCanceledErr;
- break;
- }
- }
- }
-
- return(result);
-}
-
-void init_apple_menu(const char* product)
-{
- // Load up a proper menu bar.
- {
- OSStatus err;
- IBNibRef nib = NULL;
- // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
- err = CreateNibReference(CFSTR("SecondLife"), &nib);
-
- if(err == noErr)
- {
- // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
- SetMenuBarFromNib(nib, CFSTR("MenuBar"));
- }
-
- if(nib != NULL)
- {
- DisposeNibReference(nib);
- }
- }
-
- // Install a handler for 'gurl' AppleEvents. This is how secondlife:// URLs get passed to the viewer.
-
- if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr)
- {
- // Couldn't install AppleEvent handler. This error shouldn't be fatal.
- llinfos << "Couldn't install 'GURL' AppleEvent handler. Continuing..." << llendl;
- }
-
- // Install a handler for 'quit' AppleEvents. This makes quitting the application from the dock work.
- if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr)
- {
- // Couldn't install AppleEvent handler. This error shouldn't be fatal.
- llinfos << "Couldn't install Quit AppleEvent handler. Continuing..." << llendl;
- }
-}
diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp
index d7d9f82910..4c4424edc4 100755
--- a/indra/newview/lldirpicker.cpp
+++ b/indra/newview/lldirpicker.cpp
@@ -37,7 +37,7 @@
#include "llwindow.h" // beforeDialog()
#include "llviewercontrol.h"
-#if LL_LINUX || LL_SOLARIS
+#if LL_LINUX || LL_SOLARIS || LL_DARWIN
# include "llfilepicker.h"
#endif
@@ -147,152 +147,36 @@ std::string LLDirPicker::getDirName()
#elif LL_DARWIN
LLDirPicker::LLDirPicker() :
- mFileName(NULL),
- mLocked(false)
+mFileName(NULL),
+mLocked(false)
{
+ mFilePicker = new LLFilePicker();
reset();
-
- memset(&mNavOptions, 0, sizeof(mNavOptions));
- OSStatus error = NavGetDefaultDialogCreationOptions(&mNavOptions);
- if (error == noErr)
- {
- mNavOptions.modality = kWindowModalityAppModal;
- }
}
LLDirPicker::~LLDirPicker()
{
- // nothing
+ delete mFilePicker;
}
-//static
-pascal void LLDirPicker::doNavCallbackEvent(NavEventCallbackMessage callBackSelector,
- NavCBRecPtr callBackParms, void* callBackUD)
+void LLDirPicker::reset()
{
- switch(callBackSelector)
- {
- case kNavCBStart:
- {
- if (!sInstance.mFileName) break;
-
- OSStatus error = noErr;
- AEDesc theLocation = {typeNull, NULL};
- FSSpec outFSSpec;
-
- //Convert string to a FSSpec
- FSRef myFSRef;
-
- const char* filename=sInstance.mFileName->c_str();
-
- error = FSPathMakeRef ((UInt8*)filename, &myFSRef, NULL);
-
- if (error != noErr) break;
-
- error = FSGetCatalogInfo (&myFSRef, kFSCatInfoNone, NULL, NULL, &outFSSpec, NULL);
-
- if (error != noErr) break;
-
- error = AECreateDesc(typeFSS, &outFSSpec, sizeof(FSSpec), &theLocation);
-
- if (error != noErr) break;
-
- error = NavCustomControl(callBackParms->context,
- kNavCtlSetLocation, (void*)&theLocation);
-
- }
- }
+ if (mFilePicker)
+ mFilePicker->reset();
}
-OSStatus LLDirPicker::doNavChooseDialog()
-{
- OSStatus error = noErr;
- NavDialogRef navRef = NULL;
- NavReplyRecord navReply;
-
- memset(&navReply, 0, sizeof(navReply));
-
- // NOTE: we are passing the address of a local variable here.
- // This is fine, because the object this call creates will exist for less than the lifetime of this function.
- // (It is destroyed by NavDialogDispose() below.)
-
- error = NavCreateChooseFolderDialog(&mNavOptions, &doNavCallbackEvent, NULL, NULL, &navRef);
-
- gViewerWindow->getWindow()->beforeDialog();
-
- if (error == noErr)
- error = NavDialogRun(navRef);
-
- gViewerWindow->getWindow()->afterDialog();
-
- if (error == noErr)
- error = NavDialogGetReply(navRef, &navReply);
-
- if (navRef)
- NavDialogDispose(navRef);
-
- if (error == noErr && navReply.validRecord)
- {
- FSRef fsRef;
- AEKeyword theAEKeyword;
- DescType typeCode;
- Size actualSize = 0;
- char path[LL_MAX_PATH]; /*Flawfinder: ignore*/
-
- memset(&fsRef, 0, sizeof(fsRef));
- error = AEGetNthPtr(&navReply.selection, 1, typeFSRef, &theAEKeyword, &typeCode, &fsRef, sizeof(fsRef), &actualSize);
-
- if (error == noErr)
- error = FSRefMakePath(&fsRef, (UInt8*) path, sizeof(path));
-
- if (error == noErr)
- mDir = path;
- }
-
- return error;
-}
+//static
BOOL LLDirPicker::getDir(std::string* filename)
{
- if( mLocked ) return FALSE;
- BOOL success = FALSE;
- OSStatus error = noErr;
-
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- mFileName = filename;
-
-// mNavOptions.saveFileName
-
- // Modal, so pause agent
- send_agent_pause();
- {
- error = doNavChooseDialog();
- }
- send_agent_resume();
- if (error == noErr)
- {
- if (mDir.length() > 0)
- success = true;
- }
-
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- return success;
+ LLFilePicker::ELoadFilter filter=LLFilePicker::FFLOAD_DIRECTORY;
+
+ return mFilePicker->getOpenFile(filter, true);
}
std::string LLDirPicker::getDirName()
{
- return mDir;
-}
-
-void LLDirPicker::reset()
-{
- mLocked = false;
- mDir.clear();
+ return mFilePicker->getFirstFile();
}
#elif LL_LINUX || LL_SOLARIS
diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h
index 682f9d6476..9cc62431ef 100755
--- a/indra/newview/lldirpicker.h
+++ b/indra/newview/lldirpicker.h
@@ -34,11 +34,10 @@
#include "stdtypes.h"
#if LL_DARWIN
-#include <Carbon/Carbon.h>
// AssertMacros.h does bad things.
-#include "fix_macros.h"
#undef verify
+#undef check
#undef require
#include <vector>
@@ -77,15 +76,7 @@ private:
void buildDirname( void );
bool check_local_file_access_enabled();
-#if LL_DARWIN
- NavDialogCreationOptions mNavOptions;
- static pascal void doNavCallbackEvent(NavEventCallbackMessage callBackSelector,
- NavCBRecPtr callBackParms, void* callBackUD);
- OSStatus doNavChooseDialog();
-
-#endif
-
-#if LL_LINUX || LL_SOLARIS
+#if LL_LINUX || LL_SOLARIS || LL_DARWIN
// On Linux we just implement LLDirPicker on top of LLFilePicker
LLFilePicker *mFilePicker;
#endif
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index d13f85baa2..b26d520557 100755
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -62,6 +62,11 @@ LLFilePicker LLFilePicker::sInstance;
#define DICTIONARY_FILTER L"Dictionary files (*.dic; *.xcu)\0*.dic;*.xcu\0"
#endif
+#ifdef LL_DARWIN
+#include "llfilepicker_mac.h"
+//#include <boost/algorithm/string/predicate.hpp>
+#endif
+
//
// Implementation
//
@@ -94,14 +99,6 @@ LLFilePicker::LLFilePicker()
mFilesW[0] = '\0';
#endif
-#if LL_DARWIN
- memset(&mNavOptions, 0, sizeof(mNavOptions));
- OSStatus error = NavGetDefaultDialogCreationOptions(&mNavOptions);
- if (error == noErr)
- {
- mNavOptions.modality = kWindowModalityAppModal;
- }
-#endif
}
LLFilePicker::~LLFilePicker()
@@ -546,369 +543,197 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
#elif LL_DARWIN
-Boolean LLFilePicker::navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode)
+std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode)
{
- Boolean result = true;
- ELoadFilter filter = *((ELoadFilter*) callBackUD);
- OSStatus error = noErr;
-
- if (filterMode == kNavFilteringBrowserList && filter != FFLOAD_ALL && (theItem->descriptorType == typeFSRef || theItem->descriptorType == typeFSS))
- {
- // navInfo is only valid for typeFSRef and typeFSS
- NavFileOrFolderInfo *navInfo = (NavFileOrFolderInfo*) info;
- if (!navInfo->isFolder)
- {
- AEDesc desc;
- error = AECoerceDesc(theItem, typeFSRef, &desc);
- if (error == noErr)
- {
- FSRef fileRef;
- error = AEGetDescData(&desc, &fileRef, sizeof(fileRef));
- if (error == noErr)
- {
- LSItemInfoRecord fileInfo;
- error = LSCopyItemInfoForRef(&fileRef, kLSRequestExtension | kLSRequestTypeCreator, &fileInfo);
- if (error == noErr)
- {
- if (filter == FFLOAD_IMAGE)
- {
- if (fileInfo.filetype != 'JPEG' && fileInfo.filetype != 'JPG ' &&
- fileInfo.filetype != 'BMP ' && fileInfo.filetype != 'TGA ' &&
- fileInfo.filetype != 'BMPf' && fileInfo.filetype != 'TPIC' &&
- fileInfo.filetype != 'PNG ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("jpeg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
- CFStringCompare(fileInfo.extension, CFSTR("jpg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
- CFStringCompare(fileInfo.extension, CFSTR("bmp"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
- CFStringCompare(fileInfo.extension, CFSTR("tga"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
- CFStringCompare(fileInfo.extension, CFSTR("png"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
- else if (filter == FFLOAD_WAV)
- {
- if (fileInfo.filetype != 'WAVE' && fileInfo.filetype != 'WAV ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("wave"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
- CFStringCompare(fileInfo.extension, CFSTR("wav"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
- else if (filter == FFLOAD_ANIM)
- {
- if (fileInfo.filetype != 'BVH ' &&
- fileInfo.filetype != 'ANIM' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("bvh"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) &&
- fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("anim"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
- else if (filter == FFLOAD_COLLADA)
- {
- if (fileInfo.filetype != 'DAE ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dae"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
+ std::vector<std::string> *allowedv = new std::vector< std::string >;
+ switch(filter)
+ {
+ case FFLOAD_ALL:
+ allowedv->push_back("wav");
+ allowedv->push_back("bvh");
+ allowedv->push_back("anim");
+ allowedv->push_back("dae");
+ allowedv->push_back("raw");
+ allowedv->push_back("lsl");
+ allowedv->push_back("dic");
+ allowedv->push_back("xcu");
+ case FFLOAD_IMAGE:
+ allowedv->push_back("jpg");
+ allowedv->push_back("jpeg");
+ allowedv->push_back("bmp");
+ allowedv->push_back("tga");
+ allowedv->push_back("bmpf");
+ allowedv->push_back("tpic");
+ allowedv->push_back("png");
+ break;
+ case FFLOAD_WAV:
+ allowedv->push_back("wav");
+ break;
+ case FFLOAD_ANIM:
+ allowedv->push_back("bvh");
+ allowedv->push_back("anim");
+ break;
+ case FFLOAD_COLLADA:
+ allowedv->push_back("dae");
+ break;
#ifdef _CORY_TESTING
- else if (filter == FFLOAD_GEOMETRY)
- {
- if (fileInfo.filetype != 'SLG ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("slg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
+ case FFLOAD_GEOMETRY:
+ allowedv->push_back("slg");
+ break;
#endif
- else if (filter == FFLOAD_SLOBJECT)
- {
- llwarns << "*** navOpenFilterProc: FFLOAD_SLOBJECT NOT IMPLEMENTED ***" << llendl;
- }
- else if (filter == FFLOAD_RAW)
- {
- if (fileInfo.filetype != '\?\?\?\?' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("raw"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
- )
- {
- result = false;
- }
- }
- else if (filter == FFLOAD_SCRIPT)
- {
- if (fileInfo.filetype != 'LSL ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("lsl"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) )
- {
- result = false;
- }
- }
- else if (filter == FFLOAD_DICTIONARY)
- {
- if (fileInfo.filetype != 'DIC ' &&
- fileInfo.filetype != 'XCU ' &&
- (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("dic"), kCFCompareCaseInsensitive) != kCFCompareEqualTo) &&
- fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("xcu"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)))
- {
- result = false;
- }
- }
-
- if (fileInfo.extension)
- {
- CFRelease(fileInfo.extension);
- }
- }
- }
- AEDisposeDesc(&desc);
- }
- }
- }
- return result;
+ case FFLOAD_RAW:
+ allowedv->push_back("raw");
+ break;
+ case FFLOAD_SCRIPT:
+ allowedv->push_back("lsl");
+ break;
+ case FFLOAD_DICTIONARY:
+ allowedv->push_back("dic");
+ allowedv->push_back("xcu");
+ break;
+ case FFLOAD_DIRECTORY:
+ break;
+ default:
+ llwarns << "Unsupported format." << llendl;
+ }
+
+ return allowedv;
}
-OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter)
+bool LLFilePicker::doNavChooseDialog(ELoadFilter filter)
{
- OSStatus error = noErr;
- NavDialogRef navRef = NULL;
- NavReplyRecord navReply;
-
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
- return FALSE;
+ return false;
}
-
- memset(&navReply, 0, sizeof(navReply));
-
- // NOTE: we are passing the address of a local variable here.
- // This is fine, because the object this call creates will exist for less than the lifetime of this function.
- // (It is destroyed by NavDialogDispose() below.)
- error = NavCreateChooseFileDialog(&mNavOptions, NULL, NULL, NULL, navOpenFilterProc, (void*)(&filter), &navRef);
-
+
gViewerWindow->getWindow()->beforeDialog();
-
- if (error == noErr)
- error = NavDialogRun(navRef);
+
+ std::vector<std::string> *allowed_types=navOpenFilterProc(filter);
+
+ std::vector<std::string> *filev = doLoadDialog(allowed_types,
+ mPickOptions);
gViewerWindow->getWindow()->afterDialog();
- if (error == noErr)
- error = NavDialogGetReply(navRef, &navReply);
- if (navRef)
- NavDialogDispose(navRef);
-
- if (error == noErr && navReply.validRecord)
- {
- SInt32 count = 0;
- SInt32 index;
-
- // AE indexes are 1 based...
- error = AECountItems(&navReply.selection, &count);
- for (index = 1; index <= count; index++)
- {
- FSRef fsRef;
- AEKeyword theAEKeyword;
- DescType typeCode;
- Size actualSize = 0;
- char path[MAX_PATH]; /*Flawfinder: ignore*/
-
- memset(&fsRef, 0, sizeof(fsRef));
- error = AEGetNthPtr(&navReply.selection, index, typeFSRef, &theAEKeyword, &typeCode, &fsRef, sizeof(fsRef), &actualSize);
-
- if (error == noErr)
- error = FSRefMakePath(&fsRef, (UInt8*) path, sizeof(path));
-
- if (error == noErr)
- mFiles.push_back(std::string(path));
- }
- }
+ if (filev && filev->size() > 0)
+ {
+ mFiles.insert(mFiles.end(), filev->begin(), filev->end());
+ return true;
+ }
- return error;
+ return false;
}
-OSStatus LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filename)
+bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filename)
{
- OSStatus error = noErr;
- NavDialogRef navRef = NULL;
- NavReplyRecord navReply;
-
- memset(&navReply, 0, sizeof(navReply));
// Setup the type, creator, and extension
- OSType type, creator;
- CFStringRef extension = NULL;
+ std::string extension, type, creator;
+
switch (filter)
{
case FFSAVE_WAV:
- type = 'WAVE';
- creator = 'TVOD';
- extension = CFSTR(".wav");
+ type = "WAVE";
+ creator = "TVOD";
+ extension = "wav";
break;
case FFSAVE_TGA:
- type = 'TPIC';
- creator = 'prvw';
- extension = CFSTR(".tga");
+ type = "TPIC";
+ creator = "prvw";
+ extension = "tga";
break;
case FFSAVE_BMP:
- type = 'BMPf';
- creator = 'prvw';
- extension = CFSTR(".bmp");
+ type = "BMPf";
+ creator = "prvw";
+ extension = "bmp";
break;
case FFSAVE_JPEG:
- type = 'JPEG';
- creator = 'prvw';
- extension = CFSTR(".jpeg");
+ type = "JPEG";
+ creator = "prvw";
+ extension = "jpeg";
break;
case FFSAVE_PNG:
- type = 'PNG ';
- creator = 'prvw';
- extension = CFSTR(".png");
+ type = "PNG ";
+ creator = "prvw";
+ extension = "png";
break;
case FFSAVE_AVI:
- type = '\?\?\?\?';
- creator = '\?\?\?\?';
- extension = CFSTR(".mov");
+ type = "\?\?\?\?";
+ creator = "\?\?\?\?";
+ extension = "mov";
break;
case FFSAVE_ANIM:
- type = '\?\?\?\?';
- creator = '\?\?\?\?';
- extension = CFSTR(".xaf");
+ type = "\?\?\?\?";
+ creator = "\?\?\?\?";
+ extension = "xaf";
break;
#ifdef _CORY_TESTING
case FFSAVE_GEOMETRY:
- type = '\?\?\?\?';
- creator = '\?\?\?\?';
- extension = CFSTR(".slg");
+ type = "\?\?\?\?";
+ creator = "\?\?\?\?";
+ extension = "slg";
break;
#endif
case FFSAVE_RAW:
- type = '\?\?\?\?';
- creator = '\?\?\?\?';
- extension = CFSTR(".raw");
+ type = "\?\?\?\?";
+ creator = "\?\?\?\?";
+ extension = "raw";
break;
case FFSAVE_J2C:
- type = '\?\?\?\?';
- creator = 'prvw';
- extension = CFSTR(".j2c");
+ type = "\?\?\?\?";
+ creator = "prvw";
+ extension = "j2c";
break;
case FFSAVE_SCRIPT:
- type = 'LSL ';
- creator = '\?\?\?\?';
- extension = CFSTR(".lsl");
+ type = "LSL ";
+ creator = "\?\?\?\?";
+ extension = "lsl";
break;
case FFSAVE_ALL:
default:
- type = '\?\?\?\?';
- creator = '\?\?\?\?';
- extension = CFSTR("");
+ type = "\?\?\?\?";
+ creator = "\?\?\?\?";
+ extension = "";
break;
}
- // Create the dialog
- error = NavCreatePutFileDialog(&mNavOptions, type, creator, NULL, NULL, &navRef);
- if (error == noErr)
- {
- CFStringRef nameString = NULL;
- bool hasExtension = true;
-
- // Create a CFString of the initial file name
- if (!filename.empty())
- nameString = CFStringCreateWithCString(NULL, filename.c_str(), kCFStringEncodingUTF8);
- else
- nameString = CFSTR("Untitled");
-
- // Add the extension if one was not provided
- if (nameString && !CFStringHasSuffix(nameString, extension))
- {
- CFStringRef tempString = nameString;
- hasExtension = false;
- nameString = CFStringCreateWithFormat(NULL, NULL, CFSTR("%@%@"), tempString, extension);
- CFRelease(tempString);
- }
-
- // Set the name in the dialog
- if (nameString)
- {
- error = NavDialogSetSaveFileName(navRef, nameString);
- CFRelease(nameString);
- }
- else
- {
- error = paramErr;
- }
- }
-
+ std::string namestring = filename;
+ if (namestring.empty()) namestring="Untitled";
+
+// if (! boost::algorithm::ends_with(namestring, extension) )
+// {
+// namestring = namestring + "." + extension;
+//
+// }
+
gViewerWindow->getWindow()->beforeDialog();
// Run the dialog
- if (error == noErr)
- error = NavDialogRun(navRef);
+ std::string* filev = doSaveDialog(&namestring,
+ &type,
+ &creator,
+ &extension,
+ mPickOptions);
gViewerWindow->getWindow()->afterDialog();
- if (error == noErr)
- error = NavDialogGetReply(navRef, &navReply);
-
- if (navRef)
- NavDialogDispose(navRef);
-
- if (error == noErr && navReply.validRecord)
+ if ( filev && !filev->empty() )
{
- SInt32 count = 0;
-
- // AE indexes are 1 based...
- error = AECountItems(&navReply.selection, &count);
- if (count > 0)
- {
- // Get the FSRef to the containing folder
- FSRef fsRef;
- AEKeyword theAEKeyword;
- DescType typeCode;
- Size actualSize = 0;
-
- memset(&fsRef, 0, sizeof(fsRef));
- error = AEGetNthPtr(&navReply.selection, 1, typeFSRef, &theAEKeyword, &typeCode, &fsRef, sizeof(fsRef), &actualSize);
-
- if (error == noErr)
- {
- char path[PATH_MAX]; /*Flawfinder: ignore*/
- char newFileName[SINGLE_FILENAME_BUFFER_SIZE]; /*Flawfinder: ignore*/
-
- error = FSRefMakePath(&fsRef, (UInt8*)path, PATH_MAX);
- if (error == noErr)
- {
- if (CFStringGetCString(navReply.saveFileName, newFileName, sizeof(newFileName), kCFStringEncodingUTF8))
- {
- mFiles.push_back(std::string(path) + "/" + std::string(newFileName));
- }
- else
- {
- error = paramErr;
- }
- }
- else
- {
- error = paramErr;
- }
- }
- }
- }
+ mFiles.push_back(*filev);
+ return true;
+ }
- return error;
+ return false;
}
BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
@@ -924,16 +749,21 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
return FALSE;
}
- OSStatus error = noErr;
-
reset();
- mNavOptions.optionFlags &= ~kNavAllowMultipleFiles;
+ mPickOptions &= ~F_MULTIPLE;
+ mPickOptions |= F_FILE;
+
+ if (filter == FFLOAD_DIRECTORY) //This should only be called from lldirpicker.
+ {
+
+ mPickOptions |= ( F_NAV_SUPPORT | F_DIRECTORY );
+ mPickOptions &= ~F_FILE;
+ }
if(filter == FFLOAD_ALL) // allow application bundles etc. to be traversed; important for DEV-16869, but generally useful
{
- // mNavOptions.optionFlags |= kNavAllowOpenPackages;
- mNavOptions.optionFlags |= kNavSupportPackages;
+ mPickOptions &= F_NAV_SUPPORT;
}
if (blocking)
@@ -942,14 +772,13 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
send_agent_pause();
}
+
+ success = doNavChooseDialog(filter);
+
+ if (success)
{
- error = doNavChooseDialog(filter);
- }
-
- if (error == noErr)
- {
- if (getFileCount())
- success = true;
+ if (!getFileCount())
+ success = false;
}
if (blocking)
@@ -975,21 +804,22 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
return FALSE;
}
- OSStatus error = noErr;
-
reset();
-
- mNavOptions.optionFlags |= kNavAllowMultipleFiles;
+
+ mPickOptions |= F_FILE;
+
+ mPickOptions |= F_MULTIPLE;
// Modal, so pause agent
send_agent_pause();
+
+ success = doNavChooseDialog(filter);
+
+ send_agent_resume();
+
+ if (success)
{
- error = doNavChooseDialog(filter);
- }
- send_agent_resume();
- if (error == noErr)
- {
- if (getFileCount())
- success = true;
+ if (!getFileCount())
+ success = false;
if (getFileCount() > 1)
mLocked = true;
}
@@ -1001,37 +831,37 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
{
+
if( mLocked )
- return FALSE;
- BOOL success = FALSE;
- OSStatus error = noErr;
+ return false;
+ BOOL success = false;
// if local file browsing is turned off, return without opening dialog
if ( check_local_file_access_enabled() == false )
{
- return FALSE;
+ return false;
}
reset();
- mNavOptions.optionFlags &= ~kNavAllowMultipleFiles;
+ mPickOptions &= ~F_MULTIPLE;
// Modal, so pause agent
send_agent_pause();
+
+ success = doNavSaveDialog(filter, filename);
+
+ if (success)
{
- error = doNavSaveDialog(filter, filename);
- }
- send_agent_resume();
- if (error == noErr)
- {
- if (getFileCount())
- success = true;
+ if (!getFileCount())
+ success = false;
}
// Account for the fact that the app has been stalled.
LLFrameTimer::updateFrameTime();
return success;
}
+//END LL_DARWIN
#elif LL_LINUX || LL_SOLARIS
@@ -1537,4 +1367,4 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
return FALSE;
}
-#endif
+#endif // LL_LINUX || LL_SOLARIS
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 4f602f63f1..0d279f73f3 100755
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -39,8 +39,8 @@
#include <Carbon/Carbon.h>
// AssertMacros.h does bad things.
-#include "fix_macros.h"
#undef verify
+#undef check
#undef require
#include <vector>
@@ -85,7 +85,8 @@ public:
FFLOAD_MODEL = 9,
FFLOAD_COLLADA = 10,
FFLOAD_SCRIPT = 11,
- FFLOAD_DICTIONARY = 12
+ FFLOAD_DICTIONARY = 12,
+ FFLOAD_DIRECTORY = 13 //To call from lldirpicker.
};
enum ESaveFilter
@@ -158,15 +159,14 @@ private:
#endif
#if LL_DARWIN
- NavDialogCreationOptions mNavOptions;
+ S32 mPickOptions;
std::vector<std::string> mFileVector;
UInt32 mFileIndex;
- OSStatus doNavChooseDialog(ELoadFilter filter);
- OSStatus doNavSaveDialog(ESaveFilter filter, const std::string& filename);
- void getFilePath(SInt32 index);
- void getFileName(SInt32 index);
- static Boolean navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode);
+ bool doNavChooseDialog(ELoadFilter filter);
+ bool doNavSaveDialog(ESaveFilter filter, const std::string& filename);
+ //static Boolean navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode);
+ 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
new file mode 100644
index 0000000000..e0b7e2e8ce
--- /dev/null
+++ b/indra/newview/llfilepicker_mac.h
@@ -0,0 +1,58 @@
+/**
+ * @file llfilepicker_mac.h
+ * @brief OS-specific file picker
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+// OS specific file selection dialog. This is implemented as a
+// singleton class, so call the instance() method to get the working
+// instance. When you call getMultipleOpenFile(), it locks the picker
+// until you iterate to the end of the list of selected files with
+// getNextFile() or call reset().
+
+#ifndef LL_LLFILEPICKER_MAC_H
+#define LL_LLFILEPICKER_MAC_H
+
+#if LL_DARWIN
+
+#include <string>
+#include <vector>
+
+//void modelessPicker();
+std::vector<std::string>* doLoadDialog(const std::vector<std::string>* allowed_types,
+ unsigned int flags);
+std::string* doSaveDialog(const std::string* file,
+ const std::string* type,
+ const std::string* creator,
+ const std::string* extension,
+ unsigned int flags);
+enum {
+ F_FILE = 0x00000001,
+ F_DIRECTORY = 0x00000002,
+ F_MULTIPLE = 0x00000004,
+ F_NAV_SUPPORT=0x00000008
+};
+
+#endif
+
+#endif
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
new file mode 100644
index 0000000000..2a84226e0a
--- /dev/null
+++ b/indra/newview/llfilepicker_mac.mm
@@ -0,0 +1,132 @@
+/**
+ * @file llfilepicker_mac.cpp
+ * @brief OS-specific file picker
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifdef LL_DARWIN
+#import <Cocoa/Cocoa.h>
+#include <iostream>
+#include "llfilepicker_mac.h"
+
+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];
+
+ 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];
+
+ if (count > 0)
+ {
+ outfiles = new std::vector<std::string>;
+ }
+
+ for (i=0; i<count; i++) {
+ NSString *aFile = [[filesToOpen objectAtIndex:i] path];
+ std::string *afilestr = new std::string([aFile UTF8String]);
+ outfiles->push_back(*afilestr);
+ }
+ }
+ return outfiles;
+}
+
+
+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 = [[NSArray alloc] initWithObjects:extensionns,nil];
+
+ //[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 setDirectoryURL: url];
+ if([panel runModal] ==
+ NSFileHandlingPanelOKButton)
+ {
+ NSURL* url = [panel URL];
+ NSString* p = [url path];
+ outfile = new std::string( [p UTF8String] );
+ // write the file
+ }
+ return outfile;
+}
+
+#endif
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index 116bd241c4..792a2a5d25 100755
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -89,8 +89,10 @@ void LLFloaterHardwareSettings::refresh()
void LLFloaterHardwareSettings::refreshEnabledState()
{
+ F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
+
S32 min_tex_mem = LLViewerTextureList::getMinVideoRamSetting();
- S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting();
+ S32 max_tex_mem = LLViewerTextureList::getMaxVideoRamSetting(false, mem_multiplier);
getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMinValue(min_tex_mem);
getChild<LLSliderCtrl>("GraphicsCardTextureMemory")->setMaxValue(max_tex_mem);
@@ -149,12 +151,17 @@ BOOL LLFloaterHardwareSettings::postBuild()
{
childSetAction("OK", onBtnOK, this);
+// Don't do this on Mac as their braindead GL versioning
+// sets this when 8x and 16x are indeed available
+//
+#if !LL_DARWIN
if (gGLManager.mIsIntel || gGLManager.mGLVersion < 3.f)
{ //remove FSAA settings above "4x"
LLComboBox* combo = getChild<LLComboBox>("fsaa");
combo->remove("8x");
combo->remove("16x");
}
+#endif
refresh();
center();
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 4ecdc31e21..47a8a04b63 100755
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -676,6 +676,7 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL
if(mKeysSkippedByUI.find(translated_key) != mKeysSkippedByUI.end())
{
mKeyHandledByUI[translated_key] = FALSE;
+ LL_INFOS("Keyboard Handling") << "Key wasn't handled by UI!" << LL_ENDL;
}
else
{
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index d9f3548a29..2de31cae98 100755
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -1237,7 +1237,7 @@ S32 LLViewerTextureList::getMinVideoRamSetting()
//static
// Returns max setting for TextureMemory (in MB)
-S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
+S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_multiplier)
{
S32 max_texmem;
if (gGLManager.mVRAM != 0)
@@ -1281,7 +1281,10 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended)
max_texmem = llmin(max_texmem, (S32)(system_ram/2));
else
max_texmem = llmin(max_texmem, (S32)(system_ram));
-
+
+ // limit the texture memory to a multiple of the default if we've found some cards to behave poorly otherwise
+ max_texmem = llmin(max_texmem, (S32) (mem_multiplier * (F32) max_texmem));
+
max_texmem = llclamp(max_texmem, getMinVideoRamSetting(), MAX_VIDEO_RAM_IN_MEGA_BYTES);
return max_texmem;
@@ -1294,7 +1297,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem)
// Initialize the image pipeline VRAM settings
S32 cur_mem = gSavedSettings.getS32("TextureMemory");
F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple");
- S32 default_mem = getMaxVideoRamSetting(true); // recommended default
+ S32 default_mem = getMaxVideoRamSetting(true, mem_multiplier); // recommended default
if (mem == 0)
{
mem = cur_mem > 0 ? cur_mem : default_mem;
@@ -1304,10 +1307,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem)
mem = default_mem;
}
- // limit the texture memory to a multiple of the default if we've found some cards to behave poorly otherwise
- mem = llmin(mem, (S32) (mem_multiplier * (F32) default_mem));
-
- mem = llclamp(mem, getMinVideoRamSetting(), getMaxVideoRamSetting());
+ mem = llclamp(mem, getMinVideoRamSetting(), getMaxVideoRamSetting(false, mem_multiplier));
if (mem != cur_mem)
{
gSavedSettings.setS32("TextureMemory", mem);
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 136042620d..26dc6dcbe2 100755
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -114,7 +114,7 @@ public:
void setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level);
static S32 getMinVideoRamSetting();
- static S32 getMaxVideoRamSetting(bool get_recommended = false);
+ static S32 getMaxVideoRamSetting(bool get_recommended, float mem_multiplier);
private:
void updateImagesDecodePriorities();
diff --git a/indra/newview/macutil_Prefix.h b/indra/newview/macutil_Prefix.h
index b54a764a62..b8df961cac 100755
--- a/indra/newview/macutil_Prefix.h
+++ b/indra/newview/macutil_Prefix.h
@@ -32,7 +32,6 @@
*
*/
-#include <Carbon/Carbon.h>
#include "fix_macros.h"
#undef verify