summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x.hgtags1
-rw-r--r--indra/cmake/FMODEX.cmake2
-rwxr-xr-xindra/llaudio/llaudiodecodemgr.cpp17
-rwxr-xr-xindra/llaudio/llaudioengine.cpp66
-rwxr-xr-xindra/llcommon/llinitparam.h16
-rwxr-xr-xindra/llmessage/llregionflags.h2
-rwxr-xr-xindra/llprimitive/llmodel.cpp22
-rwxr-xr-xindra/llui/llfolderview.cpp14
-rwxr-xr-xindra/llui/llfolderview.h2
-rwxr-xr-xindra/llui/llfolderviewmodel.h33
-rwxr-xr-xindra/llui/lltexteditor.cpp3
-rw-r--r--indra/llwindow/llopenglview-objc.h3
-rw-r--r--indra/llwindow/llopenglview-objc.mm21
-rwxr-xr-xindra/llwindow/llwindow.h2
-rwxr-xr-xindra/llwindow/llwindowmacosx-objc.h1
-rwxr-xr-xindra/llwindow/llwindowmacosx-objc.mm7
-rwxr-xr-xindra/llwindow/llwindowmacosx.h5
-rwxr-xr-xindra/lscript/lscript_compile/indra.l3
-rwxr-xr-xindra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/SecondLife.nibbin12348 -> 12345 bytes
-rw-r--r--indra/newview/SecondLife.xib2
-rw-r--r--indra/newview/VIEWER_VERSION.txt2
-rwxr-xr-xindra/newview/app_settings/keys.xml13
-rwxr-xr-xindra/newview/app_settings/keywords.ini756
-rwxr-xr-xindra/newview/app_settings/settings.xml34
-rwxr-xr-xindra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl2
-rwxr-xr-xindra/newview/character/avatar_lad.xml4
-rwxr-xr-xindra/newview/gpu_table.txt3
-rwxr-xr-xindra/newview/installers/windows/installer_template.nsi23
-rwxr-xr-xindra/newview/llappviewer.cpp7
-rwxr-xr-xindra/newview/llchannelmanager.cpp50
-rw-r--r--indra/newview/llconversationmodel.h3
-rwxr-xr-xindra/newview/lldeferredsounds.cpp5
-rwxr-xr-xindra/newview/lldrawpoolavatar.cpp12
-rwxr-xr-xindra/newview/llface.cpp2
-rwxr-xr-xindra/newview/llfilepicker.cpp5
-rw-r--r--indra/newview/llfilepicker_mac.mm2
-rwxr-xr-xindra/newview/llfloaterconversationpreview.cpp104
-rwxr-xr-xindra/newview/llfloaterconversationpreview.h11
-rwxr-xr-xindra/newview/llfloaterimcontainer.cpp7
-rw-r--r--indra/newview/llfloaterimsession.cpp2
-rwxr-xr-xindra/newview/llfloaterland.cpp43
-rwxr-xr-xindra/newview/llfloaterland.h1
-rwxr-xr-xindra/newview/llfloaterregioninfo.cpp10
-rwxr-xr-xindra/newview/llfloaterregioninfo.h1
-rwxr-xr-xindra/newview/llfloatersnapshot.cpp35
-rwxr-xr-xindra/newview/llfloatersnapshot.h1
-rwxr-xr-xindra/newview/llfolderviewmodelinventory.h4
-rwxr-xr-xindra/newview/llgesturemgr.cpp62
-rwxr-xr-xindra/newview/llgiveinventory.cpp2
-rwxr-xr-xindra/newview/llglsandbox.cpp3
-rwxr-xr-xindra/newview/llgroupmgr.cpp5
-rwxr-xr-xindra/newview/llgroupmgr.h2
-rwxr-xr-xindra/newview/llinventoryfilter.cpp10
-rwxr-xr-xindra/newview/llinventorypanel.cpp3
-rwxr-xr-xindra/newview/lllogchat.cpp353
-rwxr-xr-xindra/newview/lllogchat.h64
-rwxr-xr-xindra/newview/llmanipscale.cpp6
-rwxr-xr-xindra/newview/llpanelgroup.cpp18
-rwxr-xr-xindra/newview/llpanellandmarks.cpp5
-rwxr-xr-xindra/newview/llpanellandmarks.h2
-rwxr-xr-xindra/newview/llpanelnearbymedia.cpp9
-rwxr-xr-xindra/newview/llpanelobjectinventory.cpp46
-rwxr-xr-xindra/newview/llpanelobjectinventory.h3
-rwxr-xr-xindra/newview/llplacesfolderview.cpp11
-rwxr-xr-xindra/newview/llplacesfolderview.h2
-rwxr-xr-xindra/newview/llpreviewscript.cpp24
-rwxr-xr-xindra/newview/llpreviewsound.cpp4
-rwxr-xr-xindra/newview/llpreviewtexture.cpp68
-rwxr-xr-xindra/newview/llpreviewtexture.h2
-rwxr-xr-xindra/newview/llsidepanelinventory.cpp4
-rw-r--r--indra/newview/llsnapshotlivepreview.cpp28
-rw-r--r--indra/newview/llsnapshotlivepreview.h4
-rwxr-xr-xindra/newview/llstartup.cpp9
-rwxr-xr-xindra/newview/lltexturectrl.cpp2
-rwxr-xr-xindra/newview/lltooldraganddrop.cpp23
-rwxr-xr-xindra/newview/llurldispatcher.cpp43
-rwxr-xr-xindra/newview/llvieweraudio.cpp76
-rwxr-xr-xindra/newview/llviewermedia.cpp4
-rwxr-xr-xindra/newview/llviewermenu.cpp40
-rwxr-xr-xindra/newview/llviewermenufile.cpp4
-rwxr-xr-xindra/newview/llviewermessage.cpp19
-rwxr-xr-xindra/newview/llviewerobject.cpp10
-rwxr-xr-xindra/newview/llviewerregion.h2
-rwxr-xr-xindra/newview/llviewertexteditor.cpp4
-rwxr-xr-xindra/newview/llviewerwindow.cpp7
-rwxr-xr-xindra/newview/llwebsharing.cpp603
-rwxr-xr-xindra/newview/llwebsharing.h224
-rwxr-xr-xindra/newview/skins/default/xui/da/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/de/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_places.xml2
-rwxr-xr-xindra/newview/skins/default/xui/en/floater_preview_texture.xml24
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_login.xml68
-rwxr-xr-xindra/newview/skins/default/xui/en/menu_viewer.xml60
-rwxr-xr-xindra/newview/skins/default/xui/en/notifications.xml27
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_places.xml3
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_region_debug.xml10
-rwxr-xr-xindra/newview/skins/default/xui/en/panel_region_general.xml27
-rwxr-xr-xindra/newview/skins/default/xui/en/strings.xml1
-rwxr-xr-xindra/newview/skins/default/xui/es/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/fr/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/it/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ja/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/pl/strings.xml1
-rwxr-xr-xindra/newview/skins/default/xui/pt/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/ru/strings.xml3
-rwxr-xr-xindra/newview/skins/default/xui/tr/strings.xml3
107 files changed, 2087 insertions, 1339 deletions
diff --git a/.hgtags b/.hgtags
index c36ce93d0e..0f990fc3b9 100755
--- a/.hgtags
+++ b/.hgtags
@@ -480,3 +480,4 @@ d076568ff7883b41c149e6afb421f39c29dbfe2b 3.7.4-release
fc066b82343fca51f9c1b8eda0abc6bee9bb4503 3.7.5-release
d029faf69f20a23007f32420a1ac6a3b89a6d441 3.7.6-release
83959480cb986522d07b151a0c778ab7f920d41b 3.7.7-release
+bba9b3722eea08949e4ff69591f736bf0f808434 3.7.8-release
diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake
index 4981bfb7a6..720933d1b7 100644
--- a/indra/cmake/FMODEX.cmake
+++ b/indra/cmake/FMODEX.cmake
@@ -39,7 +39,7 @@ if (FMODEX)
optimized fmodex)
endif (WINDOWS)
set(FMODEX_LIBRARIES ${FMODEX_LIBRARY})
- set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/)
+ set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex)
endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR)
endif (USESYSTEMLIBS)
endif (FMODEX)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index 27add74b26..20a7afc748 100755
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -572,9 +572,14 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
// We had an error when decoding, abort.
LL_WARNS("AudioEngine") << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << LL_ENDL;
mCurrentDecodep->flushBadFile();
- LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
- adp->setHasValidData(false);
- adp->setHasCompletedDecode(true);
+
+ if (gAudiop)
+ {
+ LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
+ adp->setHasValidData(false);
+ adp->setHasCompletedDecode(true);
+ }
+
mCurrentDecodep = NULL;
done = TRUE;
}
@@ -586,7 +591,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
}
else if (mCurrentDecodep)
{
- if (mCurrentDecodep->finishDecode())
+ if (gAudiop && mCurrentDecodep->finishDecode())
{
// We finished!
LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID());
@@ -628,7 +633,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs)
LLUUID uuid;
uuid = mDecodeQueue.front();
mDecodeQueue.pop_front();
- if (gAudiop->hasDecodedFile(uuid))
+ if (!gAudiop || gAudiop->hasDecodedFile(uuid))
{
// This file has already been decoded, don't decode it again.
continue;
@@ -674,7 +679,7 @@ void LLAudioDecodeMgr::processQueue(const F32 num_secs)
BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid)
{
- if (gAudiop->hasDecodedFile(uuid))
+ if (gAudiop && gAudiop->hasDecodedFile(uuid))
{
// Already have a decoded version, don't need to decode it.
LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " has decoded file already" << LL_ENDL;
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index 5fc5e2ac46..f49028aad5 100755
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -674,8 +674,8 @@ void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp)
bool LLAudioEngine::preloadSound(const LLUUID &uuid)
{
LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL;
-
- gAudiop->getAudioData(uuid); // We don't care about the return value, this is just to make sure
+
+ getAudioData(uuid); // We don't care about the return value, this is just to make sure
// that we have an entry, which will mean that the audio engine knows about this
if (gAudioDecodeMgrp->addDecodeRequest(uuid))
@@ -828,7 +828,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i
source_id.generate();
LLAudioSource *asp = new LLAudioSource(source_id, owner_id, gain, type);
- gAudiop->addAudioSource(asp);
+ addAudioSource(asp);
if (pos_global.isExactlyZero())
{
asp->setAmbient(true);
@@ -1212,8 +1212,8 @@ void LLAudioEngine::startNextTransfer()
if (asset_id.notNull())
{
LL_INFOS() << "Getting asset data for: " << asset_id << LL_ENDL;
- gAudiop->mCurrentTransfer = asset_id;
- gAudiop->mCurrentTransferTimer.reset();
+ mCurrentTransfer = asset_id;
+ mCurrentTransferTimer.reset();
gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND,
assetCallback, NULL);
}
@@ -1227,6 +1227,12 @@ void LLAudioEngine::startNextTransfer()
// static
void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status)
{
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
+
if (result_code)
{
LL_INFOS() << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL;
@@ -1351,7 +1357,12 @@ void LLAudioSource::updatePriority()
// Priority is based on distance
LLVector3 dist_vec;
dist_vec.setVec(getPositionGlobal());
- dist_vec -= gAudiop->getListenerPos();
+
+ if (gAudiop)
+ {
+ dist_vec -= gAudiop->getListenerPos();
+ }
+
F32 dist_squared = llmax(1.f, dist_vec.magVecSquared());
mPriority = mGain / dist_squared;
@@ -1369,6 +1380,11 @@ bool LLAudioSource::setupChannel()
return false;
}
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return false;
+ }
if (!mChannelp)
{
@@ -1412,6 +1428,12 @@ bool LLAudioSource::play(const LLUUID &audio_uuid)
// Reset our age timeout if someone attempts to play the source.
mAgeTimer.reset();
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return false;
+ }
+
LLAudioData *adp = gAudiop->getAudioData(audio_uuid);
addAudioData(adp);
@@ -1519,6 +1541,13 @@ void LLAudioSource::addAudioData(LLAudioData *adp, const bool set_current)
{
// Only handle a single piece of audio data associated with a source right now,
// until I implement prefetch.
+
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
+
if (set_current)
{
if (!mCurrentDatap)
@@ -1689,6 +1718,12 @@ void LLAudioChannel::setSource(LLAudioSource *sourcep)
bool LLAudioChannel::updateBuffer()
{
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return false;
+ }
+
if (!mCurrentSourcep)
{
// This channel isn't associated with any source, nothing
@@ -1697,10 +1732,7 @@ bool LLAudioChannel::updateBuffer()
}
// Initialize the channel's gain setting for this sound.
- if(gAudiop)
- {
- setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
- }
+ setSecondaryGain(gAudiop->getSecondaryGain(mCurrentSourcep->getType()));
LLAudioBuffer *bufferp = mCurrentSourcep->getCurrentBuffer();
if (bufferp == mCurrentBufferp)
@@ -1757,8 +1789,14 @@ LLAudioData::LLAudioData(const LLUUID &uuid) :
// This is a null sound.
return;
}
+
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
- if (gAudiop && gAudiop->hasDecodedFile(uuid))
+ if (gAudiop->hasDecodedFile(uuid))
{
// Already have a decoded version, don't need to decode it.
setHasLocalData(true);
@@ -1781,6 +1819,12 @@ bool LLAudioData::load()
LL_INFOS() << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL;
return true;
}
+
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return false;
+ }
mBufferp = gAudiop->getFreeBuffer();
if (!mBufferp)
diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h
index 880cd0a370..2532566319 100755
--- a/indra/llcommon/llinitparam.h
+++ b/indra/llcommon/llinitparam.h
@@ -502,10 +502,10 @@ namespace LLInitParam
{
return found_it->second(*this, (void*)&param);
}
-
+
return false;
}
-
+
template <typename T> bool readValue(T& param, typename boost::enable_if<boost::is_enum<T> >::type* dummy = 0)
{
parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T));
@@ -522,20 +522,20 @@ namespace LLInitParam
bool parsed = found_it->second(*this, (void*)&int_value);
param = (T)int_value;
return parsed;
- }
}
- return false;
}
+ return false;
+ }
template <typename T> bool writeValue(const T& param, name_stack_t& name_stack)
- {
+ {
parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T));
if (found_it != mParserWriteFuncs->end())
- {
+ {
return found_it->second(*this, (const void*)&param, name_stack);
- }
- return false;
}
+ return false;
+ }
// dispatch inspection to registered inspection functions, for each parameter in a param block
template <typename T> bool inspectValue(name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values)
diff --git a/indra/llmessage/llregionflags.h b/indra/llmessage/llregionflags.h
index 1cf940918b..40d7b04a90 100755
--- a/indra/llmessage/llregionflags.h
+++ b/indra/llmessage/llregionflags.h
@@ -76,6 +76,8 @@ const U64 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
const U64 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
+const U64 REGION_FLAGS_BLOCK_FLYOVER = (1 << 27);
+
const U64 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
const U64 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp
index c8e4d1018b..57a698b98f 100755
--- a/indra/llprimitive/llmodel.cpp
+++ b/indra/llprimitive/llmodel.cpp
@@ -170,6 +170,11 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
return LLModel::BAD_ELEMENT;
}
+ if (!pos_source)
+ {
+ llwarns << "Unable to process mesh without position data; invalid model; invalid model." << llendl;
+ return LLModel::BAD_ELEMENT;
+ }
domPRef p = tri->getP();
domListOfUInts& idx = p->getValue();
@@ -179,19 +184,22 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
domListOfFloats& tc = tc_source ? tc_source->getFloat_array()->getValue() : dummy ;
domListOfFloats& n = norm_source ? norm_source->getFloat_array()->getValue() : dummy ;
- if (pos_source)
- {
- face.mExtents[0].set(v[0], v[1], v[2]);
- face.mExtents[1].set(v[0], v[1], v[2]);
- }
-
LLVolumeFace::VertexMapData::PointMap point_map;
-
+
U32 index_count = idx.getCount();
U32 vertex_count = pos_source ? v.getCount() : 0;
U32 tc_count = tc_source ? tc.getCount() : 0;
U32 norm_count = norm_source ? n.getCount() : 0;
+ if (vertex_count == 0)
+ {
+ llwarns << "Unable to process mesh with empty position array; invalid model." << llendl;
+ return LLModel::BAD_ELEMENT;
+ }
+
+ face.mExtents[0].set(v[0], v[1], v[2]);
+ face.mExtents[1].set(v[0], v[1], v[2]);
+
for (U32 i = 0; i < index_count; i += idx_stride)
{
LLVolumeFace::VertexData cv;
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 53f2e15ed0..b92e298348 100755
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -629,6 +629,8 @@ bool LLFolderView::startDrag()
void LLFolderView::commitRename( const LLSD& data )
{
finishRenamingItem();
+ arrange( NULL, NULL );
+
}
void LLFolderView::draw()
@@ -1606,19 +1608,21 @@ void LLFolderView::update()
return;
}
- if (getFolderViewModel()->getFilter().isModified() && getFolderViewModel()->getFilter().isNotDefault())
+ LLFolderViewFilter& filter_object = getFolderViewModel()->getFilter();
+
+ if (filter_object.isModified() && filter_object.isNotDefault())
{
mNeedsAutoSelect = TRUE;
}
// Filter to determine visibility before arranging
- filter(getFolderViewModel()->getFilter());
+ filter(filter_object);
// Clear the modified setting on the filter only if the filter finished after running the filter process
// Note: if the filter count has timed out, that means the filter halted before completing the entire set of items
- if (getFolderViewModel()->getFilter().isModified() && (!getFolderViewModel()->getFilter().isTimedOut()))
+ if (filter_object.isModified() && (!filter_object.isTimedOut()))
{
- getFolderViewModel()->getFilter().clearModified();
+ filter_object.clearModified();
}
// automatically show matching items, and select first one if we had a selection
@@ -1637,7 +1641,7 @@ void LLFolderView::update()
// Open filtered folders for folder views with mAutoSelectOverride=TRUE.
// Used by LLPlacesFolderView.
- if (getFolderViewModel()->getFilter().showAllResults())
+ if (filter_object.showAllResults())
{
// these are named variables to get around gcc not binding non-const references to rvalues
// and functor application is inherently non-const to allow for stateful functors
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index f188fdd0dc..08e0a6220a 100755
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -235,7 +235,7 @@ public:
virtual S32 notify(const LLSD& info) ;
bool useLabelSuffix() { return mUseLabelSuffix; }
- void updateMenu();
+ virtual void updateMenu();
// Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.
LLHandle<LLFolderView> getHandle() const { return getDerivedHandle<LLFolderView>(); }
diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h
index c665dce509..8d98363c5f 100755
--- a/indra/llui/llfolderviewmodel.h
+++ b/indra/llui/llfolderviewmodel.h
@@ -393,27 +393,36 @@ template <typename SORT_TYPE, typename ITEM_TYPE, typename FOLDER_TYPE, typename
class LLFolderViewModel : public LLFolderViewModelCommon
{
public:
- LLFolderViewModel(){}
- virtual ~LLFolderViewModel() {}
-
typedef SORT_TYPE SortType;
typedef ITEM_TYPE ItemType;
typedef FOLDER_TYPE FolderType;
typedef FILTER_TYPE FilterType;
- virtual SortType& getSorter() { return mSorter; }
- virtual const SortType& getSorter() const { return mSorter; }
- virtual void setSorter(const SortType& sorter) { mSorter = sorter; requestSortAll(); }
+ LLFolderViewModel(SortType* sorter, FilterType* filter)
+ : mSorter(sorter),
+ mFilter(filter)
+ {}
- virtual FilterType& getFilter() { return mFilter; }
- virtual const FilterType& getFilter() const { return mFilter; }
- virtual void setFilter(const FilterType& filter) { mFilter = filter; }
+ virtual ~LLFolderViewModel()
+ {
+ delete mSorter;
+ mSorter = NULL;
+ delete mFilter;
+ mFilter = NULL;
+ }
+
+ virtual SortType& getSorter() { return *mSorter; }
+ virtual const SortType& getSorter() const { return *mSorter; }
+ virtual void setSorter(const SortType& sorter) { mSorter = new SortType(sorter); requestSortAll(); }
+
+ virtual FilterType& getFilter() { return *mFilter; }
+ virtual const FilterType& getFilter() const { return *mFilter; }
+ virtual void setFilter(const FilterType& filter) { mFilter = new FilterType(filter); }
// By default, we assume the content is available. If a network fetch mechanism is implemented for the model,
// this method needs to be overloaded and return the relevant fetch status.
virtual bool contentsReady() { return true; }
-
struct ViewModelCompare
{
ViewModelCompare(const SortType& sorter)
@@ -445,8 +454,8 @@ public:
}
protected:
- SortType mSorter;
- FilterType mFilter;
+ SortType* mSorter;
+ FilterType* mFilter;
};
#endif // LLFOLDERVIEWMODEL_H
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 268c830a75..686fb80817 100755
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -2263,7 +2263,8 @@ void LLTextEditor::autoIndent()
S32 i;
LLWString text = getWText();
- while( ' ' == text[line_start] )
+ S32 offset = getLineOffsetFromDocIndex(mCursorPos);
+ while(( ' ' == text[line_start] ) && (space_count < offset))
{
space_count++;
line_start++;
diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h
index 1e0e47cd02..f1fab3b2c6 100644
--- a/indra/llwindow/llopenglview-objc.h
+++ b/indra/llwindow/llopenglview-objc.h
@@ -42,6 +42,7 @@
unsigned int mMarkedTextLength;
bool mMarkedTextAllowed;
bool mSimulatedRightClick;
+ bool mOldResize;
}
- (id) initWithSamples:(NSUInteger)samples;
- (id) initWithSamples:(NSUInteger)samples andVsync:(BOOL)vsync;
@@ -49,6 +50,8 @@
- (void)commitCurrentPreedit;
+- (void) setOldResize:(bool)oldresize;
+
// rebuildContext
// Destroys and recreates a context with the view's internal format set via setPixelFormat;
// Use this in event of needing to rebuild a context for whatever reason, without needing to assign a new pixel format.
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index b393a3796d..017ea3769c 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -94,8 +94,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
// Force a high quality update after live resizing
- (void) viewDidEndLiveResize
{
- NSSize size = [self frame].size;
- callResize(size.width, size.height);
+ if (mOldResize) //Maint-3135
+ {
+ NSSize size = [self frame].size;
+ callResize(size.width, size.height);
+ }
}
- (unsigned long)getVramSize
@@ -124,10 +127,18 @@ attributedStringInfo getSegments(NSAttributedString *str)
object:[self window]];
}
+- (void)setOldResize:(bool)oldresize
+{
+ mOldResize = oldresize;
+}
+
- (void)windowResized:(NSNotification *)notification;
{
- //NSSize size = [self frame].size;
- //callResize(size.width, size.height);
+ if (!mOldResize) //Maint-3288
+ {
+ NSSize size = [self frame].size;
+ callResize(size.width, size.height);
+ }
}
- (void)dealloc
@@ -204,6 +215,8 @@ attributedStringInfo getSegments(NSAttributedString *str)
[glContext setValues:(const GLint*)0 forParameter:NSOpenGLCPSwapInterval];
}
+ mOldResize = false;
+
return self;
}
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index ee1b0bbffb..0a30f4c807 100755
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -124,7 +124,7 @@ public:
virtual void swapBuffers() = 0;
virtual void bringToFront() = 0;
virtual void focusClient() { }; // this may not have meaning or be required on other platforms, therefore, it's not abstract
-
+ virtual void setOldResize(bool oldresize) { };
// handy coordinate space conversion routines
// NB: screen to window and vice verse won't work on width/height coordinate pairs,
// as the conversion must take into account left AND right border widths, etc.
diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h
index 81b25601a9..d64525fbdd 100755
--- a/indra/llwindow/llwindowmacosx-objc.h
+++ b/indra/llwindow/llwindowmacosx-objc.h
@@ -74,6 +74,7 @@ void showNSCursor();
void hideNSCursorTillMove(bool hide);
void requestUserAttention();
long showAlert(std::string title, std::string text, int type);
+void setResizeMode(bool oldresize, void* glview);
NSWindowRef createNSWindow(int x, int y, int width, int height);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 0768d0352e..1a21bf8430 100755
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -91,7 +91,7 @@ const unsigned short *copyFromPBoard()
NSArray *objToPaste = [pboard readObjectsForClasses:classArray options:[NSDictionary dictionary]];
str = [objToPaste objectAtIndex:0];
}
- unichar* temp = (unichar*)calloc([str length], sizeof(unichar));
+ unichar* temp = (unichar*)calloc([str length]+1, sizeof(unichar));
[str getCharacters:temp];
[pool release];
return temp;
@@ -222,6 +222,11 @@ GLViewRef createOpenGLView(NSWindowRef window, unsigned int samples, bool vsync)
return glview;
}
+void setResizeMode(bool oldresize, void* glview)
+{
+ [(LLOpenGLView *)glview setOldResize:oldresize];
+}
+
void glSwapBuffers(void* context)
{
[(NSOpenGLContext*)context flushBuffer];
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 6a6b39e674..825fd05c5f 100755
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -152,7 +152,10 @@ protected:
BOOL resetDisplayResolution();
BOOL shouldPostQuit() { return mPostQuit; }
-
+
+ //Satisfy MAINT-3135 and MAINT-3288 with a flag.
+ /*virtual */ void setOldResize(bool oldresize) {setResizeMode(oldresize, mGLView); }
+
protected:
//
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 2afa12fe9a..7772c95609 100755
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -647,7 +647,8 @@ int yyerror(const char *fmt, ...);
"REGION_FLAG_SANDBOX" { count(); yylval.ival = REGION_FLAGS_SANDBOX; return(INTEGER_CONSTANT); }
"REGION_FLAG_DISABLE_COLLISIONS" { count(); yylval.ival = REGION_FLAGS_SKIP_COLLISIONS; return(INTEGER_CONSTANT); }
"REGION_FLAG_DISABLE_PHYSICS" { count(); yylval.ival = REGION_FLAGS_SKIP_PHYSICS; return(INTEGER_CONSTANT); }
-"REGION_FLAG_BLOCK_FLY" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLY" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLY; return(INTEGER_CONSTANT); }
+"REGION_FLAG_BLOCK_FLYOVER" { count(); yylval.ival = REGION_FLAGS_BLOCK_FLYOVER; return(INTEGER_CONSTANT); }
"REGION_FLAG_ALLOW_DIRECT_TELEPORT" { count(); yylval.ival = REGION_FLAGS_ALLOW_DIRECT_TELEPORT; return(INTEGER_CONSTANT); }
"REGION_FLAG_RESTRICT_PUSHOBJECT" { count(); yylval.ival = REGION_FLAGS_RESTRICT_PUSHOBJECT; return(INTEGER_CONSTANT); }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 1877db6280..a42a204b82 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -665,7 +665,6 @@ set(viewer_SOURCE_FILES
llwearablelist.cpp
llweb.cpp
llwebprofile.cpp
- llwebsharing.cpp
llwind.cpp
llwindowlistener.cpp
llwlanimator.cpp
@@ -1250,7 +1249,6 @@ set(viewer_HEADER_FILES
llwearablelist.h
llweb.h
llwebprofile.h
- llwebsharing.h
llwind.h
llwindowlistener.h
llwlanimator.h
diff --git a/indra/newview/SecondLife.nib b/indra/newview/SecondLife.nib
index 8b99b5a770..c4ddca50dc 100644
--- a/indra/newview/SecondLife.nib
+++ b/indra/newview/SecondLife.nib
Binary files differ
diff --git a/indra/newview/SecondLife.xib b/indra/newview/SecondLife.xib
index 370df6bf5f..ef25c648a7 100644
--- a/indra/newview/SecondLife.xib
+++ b/indra/newview/SecondLife.xib
@@ -120,7 +120,7 @@
</object>
<object class="NSMenuItem" id="755159360">
<reference key="NSMenu" ref="110575045"/>
- <string key="NSTitle">Hide NewApplication</string>
+ <string key="NSTitle">Hide Second Life</string>
<string key="NSKeyEquiv">h</string>
<int key="NSKeyEquivModMask">1048576</int>
<int key="NSMnemonicLoc">2147483647</int>
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index a0fc9e07cb..c77a7de85c 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-3.7.8
+3.7.9
diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml
index 6e3673e7d9..a8037fec05 100755
--- a/indra/newview/app_settings/keys.xml
+++ b/indra/newview/app_settings/keys.xml
@@ -293,11 +293,24 @@
<!--these are for passing controls when sitting on vehicles-->
<binding key="A" mask="SHIFT" command="slide_left"/>
<binding key="D" mask="SHIFT" command="slide_right"/>
+ <binding key="W" mask="SHIFT" command="move_forward_sitting"/>
+ <binding key="S" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="E" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="C" mask="SHIFT" command="spin_under_sitting"/>
+
<binding key="LEFT" mask="SHIFT" command="slide_left"/>
<binding key="RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="UP" mask="SHIFT" command="move_forward_sitting"/>
+ <binding key="DOWN" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="PGUP" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="PGDN" mask="SHIFT" command="spin_under_sitting"/>
<binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/>
<binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/>
+ <binding key="PAD_UP" mask="SHIFT" command="move_forward_sitting"/>
+ <binding key="PAD_DOWN" mask="SHIFT" command="move_backward_sitting"/>
+ <binding key="PAD_PGUP" mask="SHIFT" command="spin_over_sitting"/>
+ <binding key="PAD_PGDN" mask="SHIFT" command="spin_under_sitting"/>
<binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/>
<binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
new file mode 100755
index 0000000000..17c70ef1c5
--- /dev/null
+++ b/indra/newview/app_settings/keywords.ini
@@ -0,0 +1,756 @@
+llkeywords version 2
+
+# sections
+[word .5, .1, .3]
+default Name of default state that all scripts must have
+state Keyword to indicate state block or state transition
+
+# data types
+[word .1, .3, .1]
+integer Integer type
+float Floating-point type
+string String type
+key Key type. Use NULL_KEY to test for empty keys
+vector Vector type of 3 floats. Used to represent 3D motion, Euler angles, and color.:Access components by .x, .y. or .z
+rotation Rotation type of 4 floats. Used to represent rotation.:Access components by .x, .y., .z, or .w
+list List of various data types
+
+# events
+[word 0, .3, .5]
+state_entry state_entry():Triggered on any state transition and startup
+state_exit state_exit():Triggered on any state transition
+touch_start touch_start(integer num_detected):Triggered by the start of agent clicking on task
+touch touch(integer num_detected):Triggered while agent is clicking on task
+touch_end touch_end(integer num_detected):Triggered when agent stops clicking on task
+collision_start collision_start(integer num_detected):Triggered when task starts colliding with another task
+collision collision(integer num_detected):Triggered while task is colliding with another task
+collision_end collision_end(integer num_detected):Triggered when task stops colliding with another task
+land_collision_start land_collision_start(vector pos):Triggered when task starts colliding with land
+land_collision land_collision(vector pos):Triggered when task is colliding with land
+land_collision_end land_collision_end(vector pos):Triggered when task stops colliding with land
+timer timer():Result of the llSetTimerEvent library function call
+listen listen(integer channel, string name, key id, string message):Result of the llListen library function call
+sensor sensor(integer num_detected):Result of the llSensor library function call
+no_sensor no_sensor():Result of the llSensor library function call
+control control(key id, integer level, integer edge):Result of llTakeControls library function call
+at_target at_target(integer tnum, vector targetpos, vector ourpos):Result of llTarget library function call
+not_at_target not_at_target():Result of llTarget library function call
+at_rot_target at_rot_target(integer tnum, rotation targetrot, rotation ourrot):Result of LLRotTarget library function call
+not_at_rot_target not_at_rot_target():Result of LLRotTarget library function call
+money money(key id, integer amount):Triggered when L$ is given to task
+email email(string time, string address, string subj, string message, integer num_left):Triggered when task receives email
+run_time_permissions run_time_permissions(integer perm):Triggered when an agent grants run time permissions to task
+attach attach(key id):Triggered when task attaches or detaches from agent
+dataserver dataserver(key queryid, string data):Triggered when task receives asynchronous data
+moving_start moving_start():Triggered when task begins moving
+moving_end moving_end():Triggered when task stops moving
+on_rez on_rez(integer start_param):Triggered when task is rezzed in from inventory or another task
+object_rez object_rez(key id):Triggered when task rezzes in another task
+link_message link_message(integer sender_num, integer num, string str, key id):Triggered when task receives a link message via LLMessageLinked library function call
+changed changed( integer change ):Triggered various event change the task:(test change with CHANGED_INVENTORY, CHANGED_COLOR, CHANGED_SHAPE, CHANGED_SCALE, CHANGED_TEXTURE, CHANGED_LINK, CHANGED_ALLOWED_DROP, CHANGED_OWNER, CHANGED_REGION, CHANGED_TELEPORT, CHANGED_REGION_START, CHANGED_MEDIA)
+remote_data remote_data(integer event_type, key channel, key message_id, string sender,integer idata, string sdata):Triggered by various XML-RPC calls (event_type will be one of REMOTE_DATA_CHANNEL, REMOTE_DATA_REQUEST, REMOTE_DATA_REPLY)
+http_response http_response(key request_id, integer status, list metadata, string body):Triggered when task receives a response to one of its llHTTPRequests
+http_request http_request(key id, string method, string body):Triggered when task receives an http request against a public URL
+
+# integer constants
+[word .1, .1, .5]
+TRUE Integer constant for Boolean operations
+FALSE Integer constant for Boolean operations
+STATUS_PHYSICS Passed in the llSetStatus library function. If TRUE, object moves physically
+STATUS_PHANTOM Passed in the llSetStatus library function. If TRUE, object doesn't collide with other objects
+STATUS_ROTATE_X Passed in the llSetStatus library function. If FALSE, object doesn't rotate around local X axis
+STATUS_ROTATE_Y Passed in the llSetStatus library function. If FALSE, object doesn't rotate around local Y axis
+STATUS_ROTATE_Z Passed in the llSetStatus library function. If FALSE, object doesn't rotate around local Z axis
+STATUS_SANDBOX Passed in the llSetStatus library function. If TRUE, object can't cross region boundaries or move more than 10 meters from its start location
+STATUS_BLOCK_GRAB Passed in the llSetStatus library function. If TRUE, root prim of linkset (or unlinked prim) can't be grabbed and physically dragged
+STATUS_DIE_AT_EDGE Passed in the llSetStatus library function. If TRUE, objects that reach the edge of the world just die:rather than teleporting back to the owner
+STATUS_RETURN_AT_EDGE Passed in the llSetStatus library function. If TRUE, script rezzed objects that reach the edge of the world:are returned rather than killed:STATUS_RETURN_AT_EDGE trumps STATUS_DIE_AT_EDGE if both are set
+STATUS_CAST_SHADOWS Passed in the llSetStatus library function. If TRUE, object casts shadows on other objects
+STATUS_BLOCK_GRAB_OBJECT Passed in the llSetStatus library function. If TRUE, no prims in linkset can be grabbed or physically dragged
+
+AGENT Passed in llSensor library function to look for other Agents
+ACTIVE Passed in llSensor library function to look for moving objects
+PASSIVE Passed in llSensor library function to look for objects that aren't moving
+SCRIPTED Passed in llSensor library function to look for scripted objects
+CONTROL_FWD Passed to llTakeControls library function and used control event handler to test for agent forward control
+CONTROL_BACK Passed to llTakeControls library function and used control event handler to test for agent back control
+CONTROL_LEFT Passed to llTakeControls library function and used control event handler to test for agent left control
+CONTROL_RIGHT Passed to llTakeControls library function and used control event handler to test for agent right control
+CONTROL_ROT_LEFT Passed to llTakeControls library function and used control event handler to test for agent rotate left control
+CONTROL_ROT_RIGHT Passed to llTakeControls library function and used control event handler to test for agent rotate right control
+CONTROL_UP Passed to llTakeControls library function and used control event handler to test for agent up control
+CONTROL_DOWN Passed to llTakeControls library function and used control event handler to test for agent down control
+CONTROL_LBUTTON Passed to llTakeControls library function and used control event handler to test for agent left button control
+CONTROL_ML_LBUTTON Passed to llTakeControls library function and used control event handler to test for agent left button control with the agent in mouse look
+PERMISSION_DEBIT Passed to llRequestPermissions library function to request permission to take L$ from agent's account
+PERMISSION_TAKE_CONTROLS Passed to llRequestPermissions library function to request permission to take agent's controls
+# PERMISSION_REMAP_CONTROLS Passed to llRequestPermissions library function to request permission to remap agent's controls (not implemented yet)
+PERMISSION_TRIGGER_ANIMATION Passed to llRequestPermissions library function to request permission to trigger animation on agent
+PERMISSION_ATTACH Passed to llRequestPermissions library function to request permission to attach/detach from agent
+# PERMISSION_RELEASE_OWNERSHIP Passed to llRequestPermissions library function to request permission to release ownership (not implemented)
+PERMISSION_CHANGE_LINKS Passed to llRequestPermissions library function to request permission to change links
+# PERMISSION_CHANGE_JOINTS Passed to llRequestPermissions library function to request permission to change joints (not implemented)
+# PERMISSION_CHANGE_PERMISSIONS Passed to llRequestPermissions library function to request permission to change permissions
+PERMISSION_TRACK_CAMERA Passed to llRequestPermissions library function to request permission to track agent's camera
+PERMISSION_CONTROL_CAMERA Passed to llRequestPermissions library function to request permission to change agent's camera
+PERMISSION_TELEPORT Passed to llRequestPermissions library function to request permission to teleport agent
+PERMISSION_SILENT_ESTATE_MANAGEMENT Passed to llRequestPermissions library function to request permission to silently modify estate access lists
+PERMISSION_OVERRIDE_ANIMATIONS Passed to llRequestPermissions library function to request permission to override animations on agent
+PERMISSION_RETURN_OBJECTS Passed to llRequestPermissions library function to request permission to return objects
+
+DEBUG_CHANNEL Chat channel reserved for debug and error messages from scripts
+PUBLIC_CHANNEL Chat channel that broadcasts to all nearby users
+
+AGENT_FLYING Returned by llGetAgentInfo if the Agent is flying
+AGENT_ATTACHMENTS Returned by llGetAgentInfo if the Agent has attachments
+AGENT_SCRIPTED Returned by llGetAgentInfo if the Agent has scripted attachments
+AGENT_SITTING Returned by llGetAgentInfo if the Agent is sitting
+AGENT_ON_OBJECT Returned by llGetAgentInfo if the Agent is sitting on an object
+AGENT_MOUSELOOK Returned by llGetAgentInfo if the Agent is in mouselook
+AGENT_AWAY Returned by llGetAgentInfo if the Agent is in away mode
+AGENT_WALKING Returned by llGetAgentInfo if the Agent is walking
+AGENT_IN_AIR Returned by llGetAgentInfo if the Agent is in the air
+AGENT_TYPING Returned by llGetAgentInfo if the Agent is typing
+AGENT_CROUCHING Returned by llGetAgentInfo if the Agent is crouching
+AGENT_BUSY Returned by llGetAgentInfo if the Agent is busy
+AGENT_ALWAYS_RUN Returned by llGetAgentInfo if the Agent has 'Always Run' enabled
+AGENT_AUTOPILOT Returned by llGetAgentInfo if the Agent is under autopilot control
+
+PSYS_PART_FLAGS
+PSYS_PART_START_COLOR
+PSYS_PART_START_ALPHA
+PSYS_PART_START_SCALE
+PSYS_PART_END_COLOR
+PSYS_PART_END_ALPHA
+PSYS_PART_END_SCALE
+PSYS_PART_MAX_AGE
+
+PSYS_PART_BOUNCE_MASK
+PSYS_PART_WIND_MASK
+PSYS_PART_INTERP_COLOR_MASK
+PSYS_PART_INTERP_SCALE_MASK
+PSYS_PART_FOLLOW_SRC_MASK
+PSYS_PART_FOLLOW_VELOCITY_MASK
+PSYS_PART_TARGET_POS_MASK
+PSYS_PART_EMISSIVE_MASK
+PSYS_PART_TARGET_LINEAR_MASK
+PSYS_PART_RIBBON_MASK
+
+PSYS_SRC_PATTERN
+PSYS_SRC_INNERANGLE Deprecated -- Use PSYS_SRC_ANGLE_BEGIN
+PSYS_SRC_OUTERANGLE Deprecated -- Use PSYS_SRC_ANGLE_END
+PSYS_SRC_ANGLE_BEGIN
+PSYS_SRC_ANGLE_END
+PSYS_SRC_BURST_RATE
+PSYS_SRC_BURST_PART_COUNT
+PSYS_SRC_BURST_RADIUS
+PSYS_SRC_BURST_SPEED_MIN
+PSYS_SRC_BURST_SPEED_MAX
+PSYS_SRC_MAX_AGE
+PSYS_SRC_ACCEL
+PSYS_SRC_TEXTURE
+PSYS_SRC_TARGET_KEY
+PSYS_SRC_OMEGA
+PSYS_PART_BLEND_FUNC_SOURCE
+PSYS_PART_BLEND_FUNC_DEST
+PSYS_PART_START_GLOW
+PSYS_PART_END_GLOW
+
+PSYS_SRC_PATTERN_DROP
+PSYS_SRC_PATTERN_EXPLODE
+PSYS_SRC_PATTERN_ANGLE
+PSYS_SRC_PATTERN_ANGLE_CONE
+PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY
+PSYS_PART_BF_ONE
+PSYS_PART_BF_ZERO
+PSYS_PART_BF_DEST_COLOR
+PSYS_PART_BF_SOURCE_COLOR
+PSYS_PART_BF_ONE_MINUS_DEST_COLOR
+PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR
+PSYS_PART_BF_SOURCE_ALPHA
+PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA
+
+OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type
+OBJECT_NAME Used with llGetObjectDetails to get an object's name
+OBJECT_DESC Used with llGetObjectDetails to get an object's description
+OBJECT_POS Used with llGetObjectDetails to get an object's position
+OBJECT_ROT Used with llGetObjectDetails to get an object's rotation
+OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity
+OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned
+OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key
+OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key
+OBJECT_RUNNING_SCRIPT_COUNT Used with llGetObjectDetails to get the number of running scripts in an object
+OBJECT_TOTAL_SCRIPT_COUNT Used with llGetObjectDetails to get the total number of scripts in an object
+OBJECT_SCRIPT_MEMORY Used with llGetObjectDetails to get the total amount of script memory in an object
+OBJECT_SCRIPT_TIME Used with llGetObjectDetails to get the average script time used by an object
+OBJECT_PRIM_EQUIVALENCE Used with llGetObjectDetails to get the prim equivalence of an object
+OBJECT_SERVER_COST Used with llGetObjectDetails to get the server cost of an object
+OBJECT_STREAMING_COST Used with llGetObjectDetails to get the streaming (download) cost of an object
+OBJECT_PHYSICS_COST Used with llGetObjectDetails to get the physics cost of an object
+OBJECT_CHARACTER_TIME Used with llGetObjectDetails to get the pathfinding time (seconds) for an object
+OBJECT_ROOT Used with llGetObjectDetails to get root ID of an object
+OBJECT_ATTACHED_POINT Used with llGetObjectDetails to get attachent point where an object is attached
+OBJECT_PATHFINDING_TYPE Used with llGetObjectDetails to get the pathfinding setting of an object
+OBJECT_PHYSICS Used with llGetObjectDetails to determine if the object is physical or not
+OBJECT_PHANTOM Used with llGetObjectDetails to determine if the object is phantom or not
+OBJECT_TEMP_ON_REZ Used with llGetObjectDetails to determine if the object is temporary or not
+OBJECT_RENDER_WEIGHT Used with llGetObjectDetails to return an avatar's rendering weight
+
+
+# some vehicle params
+VEHICLE_TYPE_NONE
+VEHICLE_TYPE_SLED
+VEHICLE_TYPE_CAR
+VEHICLE_TYPE_BOAT
+VEHICLE_TYPE_AIRPLANE
+VEHICLE_TYPE_BALLOON
+
+VEHICLE_REFERENCE_FRAME Rotation of vehicle axes relative to local frame
+
+VEHICLE_LINEAR_FRICTION_TIMESCALE A vector of timescales for exponential decay of linear velocity along the three vehicle axes
+VEHICLE_ANGULAR_FRICTION_TIMESCALE A vector of timescales for exponential decay of angular velocity about the three vehicle axes
+VEHICLE_LINEAR_MOTOR_DIRECTION The linear velocity that the vehicle will try to achieve
+VEHICLE_LINEAR_MOTOR_OFFSET An offset from the center of mass of the vehicle where the linear motor is applied
+VEHICLE_ANGULAR_MOTOR_DIRECTION The angular velocity that the vehicle will try to achieve
+
+VEHICLE_HOVER_HEIGHT The height the vehicle will try to hover
+VEHICLE_HOVER_EFFICIENCY A slider between 0 (bouncy) and 1 (critically damped) hover behavior
+VEHICLE_HOVER_TIMESCALE The period of time for the vehicle to achieve its hover height
+VEHICLE_BUOYANCY A slider between 0 (no anti-gravity) and 1 (full anti-gravity)
+
+VEHICLE_LINEAR_DEFLECTION_EFFICIENCY A slider between 0 (no deflection) and 1 (maximum strength)
+VEHICLE_LINEAR_DEFLECTION_TIMESCALE The exponential timescale for the vehicle to redirect its velocity to be along its x-axis
+
+VEHICLE_LINEAR_MOTOR_TIMESCALE The exponential timescale for the vehicle to achive its full linear motor velocity
+VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE The exponential timescale for the linear motor's effectiveness to decay toward zero
+
+VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY A slider between 0 (no deflection) and 1 (maximum strength)
+VEHICLE_ANGULAR_DEFLECTION_TIMESCALE The exponential timescale for the vehicle to achieve full angular deflection
+
+VEHICLE_ANGULAR_MOTOR_TIMESCALE The exponential timescale for the vehicle to achive its full angular motor velocity
+VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE The exponential timescale for the angular motor's effectiveness to decay toward zero
+
+VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY A slider between 0 (bouncy) and 1 (critically damped) attraction of vehicle z-axis to world z-axis (vertical)
+VEHICLE_VERTICAL_ATTRACTION_TIMESCALE The exponential timescale for the vehicle to align its z-axis to the world z-axis (vertical)
+
+VEHICLE_BANKING_EFFICIENCY A slider between -1 (leans out of turns), 0 (no banking), and +1 (leans into turns)
+VEHICLE_BANKING_MIX A slider between 0 (static banking) and 1 (dynamic banking)
+VEHICLE_BANKING_TIMESCALE The exponential timescale for the banking behavior to take full effect
+
+VEHICLE_FLAG_NO_DEFLECTION_UP Prevents linear deflection along world-z axis
+VEHICLE_FLAG_LIMIT_ROLL_ONLY Removes vertical attraction for changes in vehicle pitch
+VEHICLE_FLAG_HOVER_WATER_ONLY Hover only pays attention to water level
+VEHICLE_FLAG_HOVER_TERRAIN_ONLY Hover only pays attention to terrain height
+VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT Hover only pays attention to global height
+VEHICLE_FLAG_HOVER_UP_ONLY Hover only pushes up
+VEHICLE_FLAG_LIMIT_MOTOR_UP Prevents ground vehicles from motoring into the sky
+VEHICLE_FLAG_MOUSELOOK_STEER Makes vehicle try to turn toward mouselook direction
+VEHICLE_FLAG_MOUSELOOK_BANK Makes vehicle try to turn toward mouselook direction assuming banking is enabled
+VEHICLE_FLAG_CAMERA_DECOUPLED Causes the camera look-at axis to NOT move when the vehicle rotates
+
+CAMERA_PITCH (-45 to 80) (Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance. Analogous to 'incidence'.")
+CAMERA_FOCUS_OFFSET (-10 to 10) A vector that adjusts the position of the camera focus position relative to the subject
+CAMERA_POSITION_LAG (0.0 to 3.0) How much the camera lags as it tries to move towards its 'ideal' position
+CAMERA_FOCUS_LAG (0.0 to 3.0) How much the camera lags as it tries to aim towards the subject
+CAMERA_DISTANCE (0.5 to 10) Sets how far away the camera wants to be from its subject
+CAMERA_BEHINDNESS_ANGLE (0 to 180) Sets the angle in degrees within which the camera is not constrained by changes in subject rotation
+CAMERA_BEHINDNESS_LAG (0.0 to 3.0) Sets how strongly the camera is forced to stay behind the target if outside of behindness angle
+CAMERA_POSITION_THRESHOLD (0.0 to 4.0) Sets the radius of a sphere around the camera's ideal position within which it is not affected by subject motion
+CAMERA_FOCUS_THRESHOLD (0.0 to 4.0) Sets the radius of a sphere around the camera's subject position within which its focus is not affected by subject motion
+CAMERA_ACTIVE (0 or 1) Turns on or off scripted control of the camera
+CAMERA_POSITION Sets the position of the camera
+CAMERA_FOCUS Sets the focus (target position) of the camera
+CAMERA_POSITION_LOCKED (0 or 1) Locks the camera position so it will not move
+CAMERA_FOCUS_LOCKED (0 or 1) Locks the camera focus so it will not move
+
+INVENTORY_TEXTURE Passed to task inventory library functions to reference textures
+INVENTORY_SOUND Passed to task inventory library functions to reference sounds
+INVENTORY_OBJECT Passed to task inventory library functions to reference objects
+INVENTORY_SCRIPT Passed to task inventory library functions to reference scripts
+INVENTORY_LANDMARK Passed to task inventory library functions to reference landmarks
+INVENTORY_CLOTHING Passed to task inventory library functions to reference clothing
+INVENTORY_NOTECARD Passed to task inventory library functions to reference notecards
+INVENTORY_BODYPART Passed to task inventory library functions to reference body parts
+INVENTORY_ANIMATION Passed to task inventory library functions to reference animations
+INVENTORY_GESTURE Passed to task inventory library functions to reference gestures
+INVENTORY_ALL Passed to task inventory library functions to reference all inventory items
+INVENTORY_NONE Returned by llGetInventoryType when no item is found
+
+ATTACH_CHEST Passed to llAttachToAvatar to attach task to chest
+ATTACH_HEAD Passed to llAttachToAvatar to attach task to head
+ATTACH_LSHOULDER Passed to llAttachToAvatar to attach task to left shoulder
+ATTACH_RSHOULDER Passed to llAttachToAvatar to attach task to right shoulder
+ATTACH_LHAND Passed to llAttachToAvatar to attach task to left hand
+ATTACH_RHAND Passed to llAttachToAvatar to attach task to right hand
+ATTACH_LFOOT Passed to llAttachToAvatar to attach task to left foot
+ATTACH_RFOOT Passed to llAttachToAvatar to attach task to right foot
+ATTACH_BACK Passed to llAttachToAvatar to attach task to back
+ATTACH_PELVIS Passed to llAttachToAvatar to attach task to pelvis
+ATTACH_MOUTH Passed to llAttachToAvatar to attach task to mouth
+ATTACH_CHIN Passed to llAttachToAvatar to attach task to chin
+ATTACH_LEAR Passed to llAttachToAvatar to attach task to left ear
+ATTACH_REAR Passed to llAttachToAvatar to attach task to right ear
+ATTACH_LEYE Passed to llAttachToAvatar to attach task to left eye
+ATTACH_REYE Passed to llAttachToAvatar to attach task to right eye
+ATTACH_NOSE Passed to llAttachToAvatar to attach task to nose
+ATTACH_RUARM Passed to llAttachToAvatar to attach task to right upper arm
+ATTACH_RLARM Passed to llAttachToAvatar to attach task to right lower arm
+ATTACH_LUARM Passed to llAttachToAvatar to attach task to left upper arm
+ATTACH_LLARM Passed to llAttachToAvatar to attach task to left lower arm
+ATTACH_RHIP Passed to llAttachToAvatar to attach task to right hip
+ATTACH_RULEG Passed to llAttachToAvatar to attach task to right upper leg
+ATTACH_RLLEG Passed to llAttachToAvatar to attach task to right lower leg
+ATTACH_LHIP Passed to llAttachToAvatar to attach task to left hip
+ATTACH_LULEG Passed to llAttachToAvatar to attach task to left upper leg
+ATTACH_LLLEG Passed to llAttachToAvatar to attach task to left lower leg
+ATTACH_BELLY Passed to llAttachToAvatar to attach task to belly
+ATTACH_LEFT_PEC Passed to llAttachToAvatar to attach task to left pectoral
+ATTACH_RIGHT_PEC Passed to llAttachToAvatar to attach task to right pectoral
+ATTACH_NECK Passed to llAttachToAvatar to attach task to neck
+ATTACH_AVATAR_CENTER Passed to llAttachToAvatar to attach task to avatar center
+LAND_LEVEL Passed to llModifyLand to level terrain
+LAND_RAISE Passed to llModifyLand to raise terrain
+LAND_LOWER Passed to llModifyLand to lower terrain
+LAND_SMOOTH Passed to llModifyLand to smooth terrain
+LAND_NOISE Passed to llModifyLand to randomize terrain
+LAND_REVERT Passed to llModifyLand to revert terrain toward original state
+LAND_SMALL_BRUSH Passed to llModifyLand to modify small land areas
+LAND_MEDIUM_BRUSH Passed to llModifyLand to modify medium land areas
+LAND_LARGE_BRUSH Passed to llModifyLand to modify large land areas
+
+DATA_PAYINFO Passed to llRequestAgentData to get payment status of an agent
+DATA_ONLINE Passed to llRequestAgentData to determine if agent is online
+DATA_NAME Passed to llRequestAgentData to get full agent name
+DATA_BORN Passed to llRequestAgentData to get born on date as a string
+DATA_RATING Passed to llRequestAgentData to get a comma separated sting of integer ratings
+DATA_SIM_POS Passed to llRequestSimulatorData to get a string (cast to vector) of a simulator's global position
+DATA_SIM_STATUS Passed to llRequestSimulatorData to get the status of a simulator
+DATA_SIM_RATING Passed to llRequestSimulatorData to get the rating of a simulator
+
+PAYMENT_INFO_ON_FILE Used with llRequestAgentData to tell if Agent is of "Payment Info On File" status
+PAYMENT_INFO_USED Used with llRequestAgentData to tell if Agent is of "Payment Info Used" status
+
+ANIM_ON Enable texture animation
+LOOP Loop when animating textures
+REVERSE Animate in the reverse direction
+PING_PONG Animate forward, then reverse
+SMOOTH Textures slides, instead of stepping
+ROTATE Rotates the texture, instead of using frames
+SCALE Scales the texture, instead of using frames
+
+ALL_SIDES Passed to various texture and color library functions to modify all sides
+
+LINK_SET Passed to various link functions to modify all blocks in the object
+LINK_ROOT Passed to various link functions to modify only the root block (no effect on single block objects)
+LINK_ALL_OTHERS Passed to various link functions to modify all other blocks in the object
+LINK_ALL_CHILDREN Passed to various link functions to modify all child blocks in the object
+LINK_THIS Passed to various link functions to modify only the calling block
+
+CHANGED_INVENTORY Parameter of changed event handler used to indicate change to task's inventory
+CHANGED_COLOR Parameter of changed event handler used to indicate change to task's color
+CHANGED_SHAPE Parameter of changed event handler used to indicate change to task's shape parameters
+CHANGED_SCALE Parameter of changed event handler used to indicate change to task's scale
+CHANGED_TEXTURE Parameter of changed event handler used to indicate change to task's texture
+CHANGED_LINK Parameter of changed event handler used to indicate change to task's link status
+CHANGED_ALLOWED_DROP Parameter of changed event handler used to indicate a user dropped an inventory item:onto task that was allowed only by llAllowInventoryDrop function call
+CHANGED_OWNER Parameter of changed event handler used to indicate change to task's owner ONLY when an object is sold as original or deeded to group
+CHANGED_REGION Parameter of changed event handler used to indicate the region has changed
+CHANGED_TELEPORT Parameter of changed event handler used to indicate teleport has completed
+CHANGED_REGION_START Parameter of changed event handler used to indicate the region has been restarted
+CHANGED_MEDIA Parameter of changed event handler used to indicate that media has changed on a face of the task
+
+TYPE_INTEGER Indicates that the list entry is holding an integer
+TYPE_FLOAT Indicates that the list entry is holding an float
+TYPE_STRING Indicates that the list entry is holding an string
+TYPE_KEY Indicates that the list entry is holding an key
+TYPE_VECTOR Indicates that the list entry is holding an vector
+TYPE_ROTATION Indicates that the list entry is holding an rotation
+TYPE_INVALID Indicates that this wasn't a valid list entry
+
+
+REMOTE_DATA_CHANNEL Value of event_type in remote_event after successful llOpenRemoteDataChannel
+REMOTE_DATA_REQUEST Value of event_type in remote_event if XML-RPC request is received
+REMOTE_DATA_REPLY Value of event_type in remote_event if XML-RPC reply is received
+
+
+PRIM_TYPE Followed by PRIM_TYPE_BOX, PRIM_TYPE_CYLINDER, PRIM_TYPE_PRISM, PRIM_TYPE_SPHERE, PRIM_TYPE_TORUS, PRIM_TYPE_TUBE, or PRIM_TYPE_SCULPT and their arguments
+PRIM_MATERIAL Followed by PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERIAL_GLASS, PRIM_MATERIAL_WOOD, PRIM_MATERIAL_FLESH, PRIM_MATERIAL_PLASTIC, or PRIM_MATERIAL_RUBBER
+PRIM_PHYSICS Sets physics to TRUE or FALSE
+PRIM_FLEXIBLE Followed by TRUE or FALSE, integer softness, float gravity, float friction, float wind, float tension, and vector force
+PRIM_POINT_LIGHT Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff
+PRIM_TEMP_ON_REZ Sets temporary on rez to TRUE or FALSE
+PRIM_PHANTOM Sets phantom to TRUE or FALSE
+PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams
+PRIM_POSITION Sets primitive position to a vector position
+PRIM_SIZE Sets primitive size to a vector size
+PRIM_ROTATION Sets primitive rotation
+PRIM_TEXTURE Followed by an integer face, key id, vector repeats, vector offsets,:and float rotation in radians
+PRIM_COLOR Followed by an integer face, vector color, and float alpha
+PRIM_BUMP_SHINY Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY_LOW,:PRIM_SHINY_MEDIUM, or PRIM_SHINY_HIGH,:and one of PRIM_BUMP_NONE, PRIM_BUMP_BRIGHT, PRIM_BUMP_DARK, etc
+PRIM_FULLBRIGHT Followed by an integer face, and TRUE or FALSE
+PRIM_TEXGEN Followed by an integer face, and one of PRIM_TEXGEN_DEFAULT or PRIM_TEXGEN_PLANAR
+PRIM_GLOW Followed by an integer face, and a float from 0.0 to 1.0 specifying glow amount
+PRIM_TEXT Followed by string text, vector color, and float alpha
+PRIM_NAME Followed by string name
+PRIM_DESC Followed by string description
+PRIM_ROT_LOCAL Followed by rotation rot
+PRIM_PHYSICS_SHAPE_TYPE Followed by PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_NONE, or PRIM_PHYSICS_SHAPE_CONVEX
+PRIM_OMEGA Followed by vector axis, float spinrate, and float gain
+PRIM_POS_LOCAL Followed by vector position
+PRIM_LINK_TARGET Followed by integer link_target, then additional prim parameter flags
+PRIM_SLICE Followed by vector slice
+
+PRIM_PHYSICS_SHAPE_PRIM Use the default physics shape
+PRIM_PHYSICS_SHAPE_CONVEX Use the convex hull of the prim shape for physics
+PRIM_PHYSICS_SHAPE_NONE Ignore this prim in the physics shape
+
+PRIM_TYPE_BOX Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear
+PRIM_TYPE_CYLINDER Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear
+PRIM_TYPE_PRISM Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear
+PRIM_TYPE_SPHERE Followed by integer hole shape, vector cut, float hollow, vector twist,:and vector dimple
+PRIM_TYPE_TORUS Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
+PRIM_TYPE_TUBE Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
+PRIM_TYPE_RING Followed by integer hole shape, vector cut, float hollow, vector twist,:vector hole size, vector top shear, vector advanced cut, vector taper,:float revolutions, float radius offset, and float skew
+PRIM_TYPE_SCULPT Followed by a key/string texture uuid, and one of PRIM_SCULPT_TYPE_SPHERE, PRIM_SCULPT_TYPE_TORUS, PRIM_SCULPT_TYPE_PLANE, or PRIM_SCULPT_TYPE_CYLINDER
+
+PRIM_HOLE_DEFAULT Sets hole type to match the prim type
+PRIM_HOLE_SQUARE Sets hole type to square
+PRIM_HOLE_CIRCLE Sets hole type to circle
+PRIM_HOLE_TRIANGLE Sets hole type to triangle
+
+PRIM_MATERIAL_STONE Sets material to stone
+PRIM_MATERIAL_METAL Sets material to metal
+PRIM_MATERIAL_GLASS Sets material to glass
+PRIM_MATERIAL_WOOD Sets material to wood
+PRIM_MATERIAL_FLESH Sets material to flesh
+PRIM_MATERIAL_PLASTIC Sets material to plastic
+PRIM_MATERIAL_RUBBER Sets material to rubber
+PRIM_MATERIAL_LIGHT Sets material to light
+
+PRIM_SHINY_NONE No shininess
+PRIM_SHINY_LOW Low shininess
+PRIM_SHINY_MEDIUM Medium shininess
+PRIM_SHINY_HIGH High shininess
+
+PRIM_BUMP_NONE No bump map
+PRIM_BUMP_BRIGHT Generate bump map from highlights
+PRIM_BUMP_DARK Generate bump map from lowlights
+PRIM_BUMP_WOOD Wood bump map
+PRIM_BUMP_BARK Bark bump map
+PRIM_BUMP_BRICKS Brick bump map
+PRIM_BUMP_CHECKER Checker bump map
+PRIM_BUMP_CONCRETE Concrete bump map
+PRIM_BUMP_TILE Tile bump map
+PRIM_BUMP_STONE Stone bump map
+PRIM_BUMP_DISKS Disk bump map
+PRIM_BUMP_GRAVEL Gravel bump map
+PRIM_BUMP_BLOBS Blob bump map
+PRIM_BUMP_SIDING Siding bump map
+PRIM_BUMP_LARGETILE Large tile bump map
+PRIM_BUMP_STUCCO Stucco bump map
+PRIM_BUMP_SUCTION Suction cup bump map
+PRIM_BUMP_WEAVE Weave bump map
+
+PRIM_TEXGEN_DEFAULT Default texture mapping
+PRIM_TEXGEN_PLANAR Planar texture mapping
+
+PRIM_SCULPT_TYPE_SPHERE Stitch edges in a sphere-like way
+PRIM_SCULPT_TYPE_TORUS Stitch edges in a torus-like way
+PRIM_SCULPT_TYPE_PLANE Do not stitch edges
+PRIM_SCULPT_TYPE_CYLINDER Stitch edges in a cylinder-like way
+PRIM_SCULPT_TYPE_MASK Mask used to determine stitching type
+PRIM_SCULPT_FLAG_INVERT Flag to specify that the surface normals should be inverted
+PRIM_SCULPT_FLAG_MIRROR Flag to specify that the prim should be reflected along X axis
+
+MASK_BASE Base permissions
+MASK_OWNER Owner permissions
+MASK_GROUP Group permissions
+MASK_EVERYONE Everyone permissions
+MASK_NEXT Next owner permissions
+
+PERM_TRANSFER Transfer permission
+PERM_MODIFY Modify permission
+PERM_COPY Copy permission
+PERM_MOVE Move permission
+PERM_ALL Move/Modify/Copy/Transfer permissions
+
+PARCEL_MEDIA_COMMAND_STOP Stop media stream
+PARCEL_MEDIA_COMMAND_PAUSE Pause media stream
+PARCEL_MEDIA_COMMAND_PLAY Play media stream
+PARCEL_MEDIA_COMMAND_LOOP Loop media stream
+PARCEL_MEDIA_COMMAND_TEXTURE Get or set the parcel's media texture
+PARCEL_MEDIA_COMMAND_URL Get or set the parcel's media url
+PARCEL_MEDIA_COMMAND_TYPE Get or set the parcel's media mimetype
+PARCEL_MEDIA_COMMAND_DESC Get or set the parcel's media description
+PARCEL_MEDIA_COMMAND_TIME Set media stream to specific time
+PARCEL_MEDIA_COMMAND_SIZE Get or set the parcel's media pixel resolution
+PARCEL_MEDIA_COMMAND_AGENT Allows media stream commands to apply to only one agent
+PARCEL_MEDIA_COMMAND_UNLOAD Unloads the media stream
+PARCEL_MEDIA_COMMAND_AUTO_ALIGN Auto aligns the media stream to the texture size. May cause a performance hit and loss of some visual quality
+
+PAY_HIDE Used with llSetPayPrice to hide a button
+PAY_DEFAULT Used with llSetPayPrice to use the default price for a button
+
+LIST_STAT_MAX Used with llListStatistics to find the largest number in a list
+LIST_STAT_MIN Used with llListStatistics to find the smallest number in a list
+LIST_STAT_MEAN Used with llListStatistics to find the mean of the numbers in a list
+LIST_STAT_MEDIAN Used with llListStatistics to find the median of the numbers in a list
+LIST_STAT_STD_DEV Used with llListStatistics to find the standard deviation of the numbers in a list
+LIST_STAT_SUM Used with llListStatistics to find the sum of the numbers in a list
+LIST_STAT_SUM_SQUARES Used with llListStatistics to find the sum of the squares of the numbers in a list
+LIST_STAT_NUM_COUNT Used with llListStatistics to find how many numbers are in a list
+LIST_STAT_GEOMETRIC_MEAN Used with llListStatistics to find the geometric mean of the numbers in a list (all numbers must be > 0)
+LIST_STAT_RANGE Used with llListStatistics to find the range of the numbers in a list
+
+PARCEL_FLAG_ALLOW_FLY Used with llGetParcelFlags to find if a parcel allows flying
+PARCEL_FLAG_ALLOW_GROUP_SCRIPTS Used with llGetParcelFlags to find if a parcel allows group scripts
+PARCEL_FLAG_ALLOW_SCRIPTS Used with llGetParcelFlags to find if a parcel allows outside scripts
+PARCEL_FLAG_ALLOW_LANDMARK Used with llGetParcelFlags to find if a parcel allows landmarks to be created
+PARCEL_FLAG_ALLOW_TERRAFORM Used with llGetParcelFlags to find if a parcel allows anyone to terraform the land
+PARCEL_FLAG_ALLOW_DAMAGE Used with llGetParcelFlags to find if a parcel allows damage
+PARCEL_FLAG_ALLOW_CREATE_OBJECTS Used with llGetParcelFlags to find if a parcel allows anyone to create objects
+PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS Used with llGetParcelFlags to find if a parcel allows group members or objects to create objects
+PARCEL_FLAG_USE_ACCESS_GROUP Used with llGetParcelFlags to find if a parcel limits access to a group
+PARCEL_FLAG_USE_ACCESS_LIST Used with llGetParcelFlags to find if a parcel limits access to a list of residents
+PARCEL_FLAG_USE_BAN_LIST Used with llGetParcelFlags to find if a parcel uses a ban list
+PARCEL_FLAG_USE_LAND_PASS_LIST Used with llGetParcelFlags to find if a parcel allows passes to be purchased
+PARCEL_FLAG_LOCAL_SOUND_ONLY Used with llGetParcelFlags to find if a parcel restricts spacialized sound to the parcel
+PARCEL_FLAG_RESTRICT_PUSHOBJECT Used with llGetParcelFlags to find if a parcel restricts llPushObject() calls
+PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY Used with llGetParcelFlags to find if a parcel allows all objects to enter
+PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY Used with llGetParcelFlags to find if a parcel only allows group (and owner) objects to enter
+
+REGION_FLAG_ALLOW_DAMAGE Used with llGetRegionFlags to find if a region is entirely damage enabled
+REGION_FLAG_FIXED_SUN Used with llGetRegionFlags to find if a region has a fixed sun position
+REGION_FLAG_BLOCK_TERRAFORM Used with llGetRegionFlags to find if a region terraforming disabled
+REGION_FLAG_SANDBOX Used with llGetRegionFlags to find if a region is a sandbox
+REGION_FLAG_DISABLE_COLLISIONS Used with llGetRegionFlags to find if a region has disabled collisions
+REGION_FLAG_DISABLE_PHYSICS Used with llGetRegionFlags to find if a region has disabled physics
+REGION_FLAG_BLOCK_FLY Used with llGetRegionFlags to find if a region blocks flying
+REGION_FLAG_BLOCK_FLYOVER Used with llGetRegionFlags to find if a region enforces higher altitude parcel access rules
+REGION_FLAG_ALLOW_DIRECT_TELEPORT Used with llGetRegionFlags to find if a region allows direct teleports
+REGION_FLAG_RESTRICT_PUSHOBJECT Used with llGetRegionFlags to find if a region restricts llPushObject() calls
+
+HTTP_METHOD Used with llHTTPRequest to specify the method, such as "GET" or "POST"
+HTTP_MIMETYPE Used with llHTTPRequest to specify the MIME type, defaults to "text/plain"
+HTTP_BODY_MAXLENGTH Used with llHTTPRequest to specify the maximum response body to return
+HTTP_VERIFY_CERT Used with llHTTPRequest to specify SSL certificate verification
+HTTP_BODY_TRUNCATED Used with http_response to indicate truncation point in bytes
+
+PARCEL_COUNT_TOTAL Used with llGetParcelPrimCount to get the total number of prims on the parcel
+PARCEL_COUNT_OWNER Used with llGetParcelPrimCount to get the number of prims on the parcel owned by the owner
+PARCEL_COUNT_GROUP Used with llGetParcelPrimCount to get the number of prims on the parcel owned by the group
+PARCEL_COUNT_OTHER Used with llGetParcelPrimCount to get the number of prims on the parcel owned by others
+PARCEL_COUNT_SELECTED Used with llGetParcelPrimCount to get the number of prims on the parcel currently selected or sat upon
+PARCEL_COUNT_TEMP Used with llGetParcelPrimCount to get the number of prims on the parcel that are temp on rez
+
+PARCEL_DETAILS_NAME Used with llGetParcelDetails to get the parcel name
+PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description
+PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id
+PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id
+PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters
+PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id
+PARCEL_DETAILS_SEE_AVATARS Used with llGetParcelDetails to get the avatars visibility setting
+
+STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string
+STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string
+STRING_TRIM Used with llStringTrim to trim both leading and trailing spaces from a string
+
+CLICK_ACTION_NONE Used with llSetClickAction to disable the click action
+CLICK_ACTION_TOUCH Used with llSetClickAction to set touch as the default action when object is clicked
+CLICK_ACTION_SIT Used with llSetClickAction to set sit as the default action when object is clicked
+CLICK_ACTION_BUY Used with llSetClickAction to set buy as the default action when object is clicked
+CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default action when object is clicked
+CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked
+CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked
+CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked
+
+TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid
+TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid
+TOUCH_INVALID_FACE Value returned by llDetectedTouchFace() when the touch position is not valid
+
+PRIM_MEDIA_ALT_IMAGE_ENABLE Used with ll{Get,Set}PrimMediaParams to enable the default alt image for media
+PRIM_MEDIA_CONTROLS Used with ll{Get,Set}PrimMediaParams to determine the controls shown for media
+PRIM_MEDIA_CURRENT_URL Used with ll{Get,Set}PrimMediaParams to navigate/access the current URL
+PRIM_MEDIA_HOME_URL Used with ll{Get,Set}PrimMediaParams to access the home URL
+PRIM_MEDIA_AUTO_LOOP Used with ll{Get,Set}PrimMediaParams to determine if media should auto-loop (if applicable)
+PRIM_MEDIA_AUTO_PLAY Used with ll{Get,Set}PrimMediaParams to determine if media should start playing as soon as it is created
+PRIM_MEDIA_AUTO_SCALE Used with ll{Get,Set}PrimMediaParams to determine if media should scale to fit the face it is on
+PRIM_MEDIA_AUTO_ZOOM Used with ll{Get,Set}PrimMediaParams to determine if the user would zoom in when viewing media
+PRIM_MEDIA_FIRST_CLICK_INTERACT Used with ll{Get,Set}PrimMediaParams to determine whether the user interacts with media or not when she first clicks it (versus selection)
+PRIM_MEDIA_WIDTH_PIXELS Used with ll{Get,Set}PrimMediaParams to access the media's width in pixels
+PRIM_MEDIA_HEIGHT_PIXELS Used with ll{Get,Set}PrimMediaParams to access the media's height in pixels
+PRIM_MEDIA_WHITELIST_ENABLE Used with ll{Get,Set}PrimMediaParams to determine if the domain whitelist is enabled
+PRIM_MEDIA_WHITELIST Used with ll{Get,Set}PrimMediaParams to access the media's list of allowable URL prefixes to navigate to
+PRIM_MEDIA_PERMS_INTERACT Used with ll{Get,Set}PrimMediaParams to determine the permissions for who can interact with the media
+PRIM_MEDIA_PERMS_CONTROL Used with ll{Get,Set}PrimMediaParams to determine the permissions for who has controls
+PRIM_MEDIA_PARAM_MAX The value of the largest media param
+
+PRIM_MEDIA_CONTROLS_STANDARD Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "standard controls"
+PRIM_MEDIA_CONTROLS_MINI Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_CONTROLS value meaning "mini controls"
+
+PRIM_MEDIA_PERM_NONE Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, no permissions
+PRIM_MEDIA_PERM_OWNER Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, owner permissions
+PRIM_MEDIA_PERM_GROUP Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, group permissions
+PRIM_MEDIA_PERM_ANYONE Used with ll{Get,Set}PrimMediaParams, a PRIM_MEDIA_PERMS_INTERACT or PRIM_MEDIA_PERMS_CONTROL bit, anyone has permissions
+
+PRIM_MEDIA_MAX_URL_LENGTH Used with ll{Get,Set}PrimMediaParams, the maximum length of PRIM_MEDIA_CURRENT_URL or PRIM_MEDIA_HOME_URL
+PRIM_MEDIA_MAX_WHITELIST_SIZE Used with ll{Get,Set}PrimMediaParams, the maximum length, in bytes, of PRIM_MEDIA_WHITELIST
+PRIM_MEDIA_MAX_WHITELIST_COUNT Used with ll{Get,Set}PrimMediaParams, the maximum number of items allowed in PRIM_MEDIA_WHITELIST
+PRIM_MEDIA_MAX_WIDTH_PIXELS Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_WIDTH_PIXELS
+PRIM_MEDIA_MAX_HEIGHT_PIXELS Used with ll{Get,Set}PrimMediaParams, the maximum width allowed in PRIM_MEDIA_HEIGHT_PIXELS
+
+STATUS_OK Result of function call was success
+STATUS_MALFORMED_PARAMS Function was called with malformed params
+STATUS_TYPE_MISMATCH Argument(s) passed to function had a type mismatch
+STATUS_BOUNDS_ERROR Argument(s) passed to function had a bounds error
+STATUS_NOT_FOUND Object or other item was not found
+STATUS_NOT_SUPPORTED Feature not supported
+STATUS_INTERNAL_ERROR An internal error occurred
+STATUS_WHITELIST_FAILED URL failed to pass whitelist
+
+PROFILE_NONE Disables profiling
+PROFILE_SCRIPT_MEMORY Enables memory profiling
+
+RC_DATA_FLAGS TODO: add documentation
+RC_DETECT_PHANTOM TODO: add documentation
+RC_GET_LINK_NUM TODO: add documentation
+RC_GET_NORMAL TODO: add documentation
+RC_GET_ROOT_KEY TODO: add documentation
+RC_MAX_HITS TODO: add documentation
+RC_REJECT_TYPES Optional parameter set in llCastRay() to reject hit against certain object types.
+RC_REJECT_AGENTS Bit mask for RC_REJECT_TYPES, rejects hits against avatars.
+RC_REJECT_PHYSICAL Bit mask for RC_REJECT_TYPES, rejects hits against moving objects.
+RC_REJECT_NONPHYSICAL Bit mask for RC_REJECT_TYPES, rejects hits against non-moving objects.
+RC_REJECT_LAND Bit mask for RC_REJECT_TYPES, rejects hits against the terrian.
+
+RCERR_CAST_TIME_EXCEEDED TODO: add documentation
+RCERR_SIM_PERF_LOW TODO: add documentation
+RCERR_UNKNOWN TODO: add documentation
+
+ESTATE_ACCESS_ALLOWED_AGENT_ADD TODO: add documentation
+ESTATE_ACCESS_ALLOWED_AGENT_REMOVE TODO: add documentation
+ESTATE_ACCESS_ALLOWED_GROUP_ADD TODO: add documentation
+ESTATE_ACCESS_ALLOWED_GROUP_REMOVE TODO: add documentation
+ESTATE_ACCESS_BANNED_AGENT_ADD TODO: add documentation
+ESTATE_ACCESS_BANNED_AGENT_REMOVE TODO: add documentation
+
+DENSITY TODO: add documentation
+FRICTION TODO: add documentation
+RESTITUTION TODO: add documentation
+GRAVITY_MULTIPLIER TODO: add documentation
+
+KFM_COMMAND TODO: add documentation
+KFM_CMD_PLAY TODO: add documentation
+KFM_CMD_STOP TODO: add documentation
+KFM_CMD_PAUSE TODO: add documentation
+KFM_CMD_SET_MODE TODO: add documentation
+KFM_MODE TODO: add documentation
+KFM_FORWARD TODO: add documentation
+KFM_LOOP TODO: add documentation
+KFM_PING_PONG TODO: add documentation
+KFM_REVERSE TODO: add documentation
+KFM_DATA TODO: add documentation
+KFM_ROTATION TODO: add documentation
+KFM_TRANSLATION TODO: add documentation
+
+CHARACTER_CMD_STOP TODO: add documentation
+CHARACTER_CMD_JUMP TODO: add documentation
+
+CHARACTER_DESIRED_SPEED TODO: add documentation
+CHARACTER_RADIUS TODO: add documentation
+CHARACTER_LENGTH TODO: add documentation
+CHARACTER_ORIENTATION TODO: add documentation
+CHARACTER_AVOIDANCE_MODE TODO: add documentation
+PURSUIT_OFFSET TODO: add documentation
+REQUIRE_LINE_OF_SIGHT TODO: add documentation
+PURSUIT_FUZZ_FACTOR TODO: add documentation
+PURSUIT_INTERCEPT TODO: add documentation
+FORCE_DIRECT_PATH TODO: add documentation
+VERTICAL TODO: add documentation
+HORIZONTAL TODO: add documentation
+AVOID_CHARACTERS TODO: add documentation
+AVOID_DYNAMIC_OBSTACLES TODO: add documentation
+
+PU_EVADE_HIDDEN Triggered when an llEvade character thinks it has hidden from its pursuer.
+PU_EVADE_SPOTTED Triggered when an llEvade character switches from hiding to running
+PU_FAILURE_INVALID_GOAL Goal is not on the navigation-mesh and cannot be reached.
+PU_FAILURE_INVALID_START Character cannot navigate from the current location - e.g., the character is off the navmesh or too high above it.
+PU_FAILURE_NO_VALID_DESTINATION There's no good place for the character to go - e.g., it is patrolling and all the patrol points are now unreachable.
+PU_FAILURE_OTHER Unknown failure
+PU_FAILURE_TARGET_GONE Target (for llPursue or llEvade) can no longer be tracked - e.g., it left the region or is an avatar that is now more than about 30m outside the region.
+PU_FAILURE_UNREACHABLE Goal is no longer reachable for some reason - e.g., an obstacle blocks the path.
+PU_GOAL_REACHED Character has reached the goal and will stop or choose a new goal (if wandering).
+PU_SLOWDOWN_DISTANCE_REACHED Character is near current goal.
+
+CHARACTER_TYPE TODO: add documentation
+CHARACTER_TYPE_A TODO: add documentation
+CHARACTER_TYPE_B TODO: add documentation
+CHARACTER_TYPE_C TODO: add documentation
+CHARACTER_TYPE_D TODO: add documentation
+CHARACTER_TYPE_NONE TODO: add documentation
+
+TRAVERSAL_TYPE TODO: add documentation
+TRAVERSAL_TYPE_SLOW TODO: add documentation
+TRAVERSAL_TYPE_FAST TODO: add documentation
+TRAVERSAL_TYPE_NONE TODO: add documentation
+
+CHARACTER_MAX_ACCEL TODO: add documentation
+CHARACTER_MAX_DECEL TODO: add documentation
+CHARACTER_MAX_ANGULAR_SPEED TODO: add documentation
+CHARACTER_MAX_ANGULAR_ACCEL TODO: add documentation
+CHARACTER_TURN_SPEED_MULTIPLIER TODO: add documentation
+
+# string constants
+[word .1, .3, .5]
+NULL_KEY Indicates an empty key
+EOF Indicates the last line of a notecard was read
+TEXTURE_BLANK UUID for the "Blank" texture
+TEXTURE_DEFAULT Alias for TEXTURE_PLYWOOD
+TEXTURE_MEDIA UUID for the "Default Media" texture
+TEXTURE_PLYWOOD UUID for the default "Plywood" texture
+TEXTURE_TRANSPARENT UUID for the "White - Transparent" texture
+
+URL_REQUEST_GRANTED Used with http_request when a public URL is successfully granted
+URL_REQUEST_DENIED Used with http_request when a public URL is not available
+
+# float constants
+[word .3, .1, .5]
+PI 3.1415926535897932384626433832795
+TWO_PI 6.283185307179586476925286766559
+PI_BY_TWO 1.5707963267948966192313216916398
+DEG_TO_RAD To convert from degrees to radians
+RAD_TO_DEG To convert from radians to degrees
+SQRT2 1.4142135623730950488016887242097
+
+# compound constants
+[word .4, .2, .4]
+ZERO_VECTOR <0.0, 0.0, 0.0>
+ZERO_ROTATION <0.0, 0.0, 0.0, 1.0>
+
+
+# flow control keywords
+[word 0, 0, .8]
+for for loop:for (initializer; test; iteration):{: statements:}
+do do loop:do:{: statements:} while (test);
+while while loop:while (test):{ statements:}
+if if statement:if (test):{ statements:}
+else else clause:if (test):{ statements:}:else:{ statements:}
+jump jump statement:jump label;:
+return Leave current function or event handler
+
+# flow control label
+[line 0, 0, .8]
+@ Label:Target for jump statement
+
+# Comment
+[one_sided_delimiter .8, .3, .15]
+// Comment:Non-functional commentary or disabled code
+[two_sided_delimiter .8, .3, .15]
+/* */ Comment:Non-functional commentary or disabled code
+
+# String literals
+[double_quotation_marks 0, .2, 0]
+" String literal
+
+#functions are supplied by the program now
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index fd7eb4d9da..be6478d26f 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11462,28 +11462,6 @@
<key>Value</key>
<integer>75</integer>
</map>
- <key>SnapshotSharingEnabled</key>
- <map>
- <key>Comment</key>
- <string>Enable uploading of snapshots to a web service.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>SnapshotConfigURL</key>
- <map>
- <key>Comment</key>
- <string>URL to fetch Snapshot Sharing configuration data from.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string>http://photos.apps.staging.avatarsunited.com/viewer_config</string>
- </map>
<key>SpeedTest</key>
<map>
<key>Comment</key>
@@ -15417,18 +15395,6 @@
<key>Value</key>
<integer>7000</integer>
</map>
- <key>DisablePrecacheDelayAfterTeleporting</key>
- <map>
- <key>Comment</key>
- <string>Disables the artificial delay in the viewer that precaches some incoming assets</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
-
<key>VersionChannelName</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
index a74290bfcd..2487110624 100755
--- a/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/diffuseSkinnedV.glsl
@@ -40,7 +40,7 @@ mat4 getObjectSkinnedTransform();
void main()
{
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
-
+
mat4 mat = getObjectSkinnedTransform();
mat = modelview_matrix * mat;
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 5268498d56..6de5b18c3c 100755
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -3825,7 +3825,7 @@
<volume_morph
name="BELLY"
scale="0.075 0.04 0.03"
- pos="0.07 0 -0.02"/>
+ pos="0.07 0 -0.07"/>
<volume_morph
name="PELVIS"
scale="0.075 0.04 0.03"
@@ -4269,7 +4269,7 @@
label_min="Big Pectorals"
label_max="Sunken Chest"
value_default="0"
- value_min="-1.0"
+ value_min="-0.5"
value_max="1.1"
camera_elevation=".3"
camera_distance="1.2">
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 8efc4ee87d..badbe486b9 100755
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -327,7 +327,8 @@ Intel HD Graphics 4600 .*Intel.*HD Graphics 46.* 3 1 0 4.2
Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4.2
Intel Intel Iris Pro Graphics 5200 .*Intel.*Iris Pro Graphics 52.* 4 1 0 4
Intel Intel Iris Graphics 5100 .*Intel.*Iris Graphics 51.* 4 1 0 4
-Intel Intel Iris OpenGL Engine .*Intel.*Iris (Pro )*OpenGL.* 4 1 0 4
+Intel Intel Iris OpenGL Engine .*Intel.*Iris OpenGL.* 4 1 0 4
+Intel Intel Iris Pro OpenGL Engine .*Intel.*Iris Pro OpenGL.* 5 1 0 4
Intel HD Graphics 5000 .*Intel.*HD Graphics 5.* 4 1 0 4
Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4
Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index 8b3a9a8372..65581a6781 100755
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -106,6 +106,7 @@ Var COMMANDLINE ; command line passed to this installer, set in .onInit
Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall
; GUI and the defaults.
+Var SKIP_AUTORUN ; skip automatic launch of viewer after install
Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation that will be uninstalled.
;;; Function definitions should go before file includes, because calls to
@@ -125,24 +126,9 @@ Var DO_UNINSTALL_V2 ; If non-null, path to a previous Viewer 2 installation
Function .onInstSuccess
Call CheckWindowsServPack ; Warn if not on the latest SP before asking to launch.
Push $R0 # Option value, unused
-
- StrCmp $SKIP_DIALOGS "true" label_launch
-
- ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0
- # If parameter was there (no error) just launch
- # Otherwise ask
- IfErrors label_ask_launch label_launch
-
-label_ask_launch:
- # Don't launch by default when silent
- IfSilent label_no_launch
- MessageBox MB_YESNO $(InstSuccesssQuestion) \
- IDYES label_launch IDNO label_no_launch
-
-label_launch:
+ StrCmp $SKIP_AUTORUN "true" +2;
# Assumes SetOutPath $INSTDIR
Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
-label_no_launch:
Pop $R0
FunctionEnd
@@ -822,7 +808,12 @@ Call CheckWindowsVersion ; Don't install On unsupported systems
IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS
StrCpy $SKIP_DIALOGS "true"
+ ${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0
+ IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN
+ StrCpy $SKIP_AUTORUN "true"
+
${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English
+
; If no language (error), then proceed
IfErrors lbl_configure_default_lang
; No error means we got a language, so use it
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index ab76ea95dd..eaba9e2c55 100755
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3181,6 +3181,13 @@ bool LLAppViewer::initWindow()
LLNotificationsUI::LLNotificationManager::getInstance();
+
+#ifdef LL_DARWIN
+ //Satisfy both MAINT-3135 (OSX 10.6 and earlier) MAINT-3288 (OSX 10.7 and later)
+ if (getOSInfo().mMajorVer == 10 && getOSInfo().mMinorVer < 7)
+ gViewerWindow->getWindow()->setOldResize(true);
+#endif
+
if (gSavedSettings.getBOOL("WindowMaximized"))
{
gViewerWindow->getWindow()->maximize();
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 928c3baafa..b0537a83f1 100755
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -113,33 +113,29 @@ void LLChannelManager::onLoginCompleted()
}
else
{
- // TODO: Seems this code leads to MAINT-3536 new crash in XML_ParserFree.
- // Need to investigate this and fix possible problems with notifications in startup time
- // Viewer can normally receive and show of postponed notifications about purchasing in marketplace on startup time.
- // Other types of postponed notifications did not tested.
- //// create a channel for the StartUp Toast
- //LLScreenChannelBase::Params p;
- //p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
- //p.channel_align = CA_RIGHT;
- //mStartUpChannel = createChannel(p);
-
- //if(!mStartUpChannel)
- //{
- // onStartUpToastClose();
- //}
- //else
- //{
- // gViewerWindow->getRootView()->addChild(mStartUpChannel);
-
- // // init channel's position and size
- // S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
- // S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- // mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
- // mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
-
- // mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
- // mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
- //}
+ // create a channel for the StartUp Toast
+ LLScreenChannelBase::Params p;
+ p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
+ p.channel_align = CA_RIGHT;
+ mStartUpChannel = createChannel(p);
+
+ if(!mStartUpChannel)
+ {
+ onStartUpToastClose();
+ }
+ else
+ {
+ gViewerWindow->getRootView()->addChild(mStartUpChannel);
+
+ // init channel's position and size
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
+ mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
+
+ mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
+ mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
+ }
}
LLPersistentNotificationStorage::getInstance()->loadNotifications();
diff --git a/indra/newview/llconversationmodel.h b/indra/newview/llconversationmodel.h
index d8cdcdfc97..dc74506c53 100644
--- a/indra/newview/llconversationmodel.h
+++ b/indra/newview/llconversationmodel.h
@@ -291,6 +291,9 @@ class LLConversationViewModel
{
public:
typedef LLFolderViewModel<LLConversationSort, LLConversationItem, LLConversationItem, LLConversationFilter> base_t;
+ LLConversationViewModel()
+ : base_t(new LLConversationSort(), new LLConversationFilter())
+ {}
void sort(LLFolderViewFolder* folder);
bool contentsReady() { return true; } // *TODO : we need to check that participants names are available somewhat
diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp
index 9416e7cd29..e1613e4719 100755
--- a/indra/newview/lldeferredsounds.cpp
+++ b/indra/newview/lldeferredsounds.cpp
@@ -39,7 +39,10 @@ void LLDeferredSounds::playdeferredSounds()
{
while(soundVector.size())
{
- gAudiop->triggerSound(soundVector.back());
+ if (gAudiop)
+ {
+ gAudiop->triggerSound(soundVector.back());
+ }
soundVector.pop_back();
}
}
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 0ecdabbbe9..90e6dfe351 100755
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -1518,6 +1518,18 @@ void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>
}
//LL_INFOS() << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << LL_ENDL;
+
+ // Let getGeometryVolume know if a texture matrix is in play
+ if (face->mTextureMatrix)
+ {
+ face->setState(LLFace::TEXTURE_ANIM);
+ }
+ else
+ {
+ face->clearState(LLFace::TEXTURE_ANIM);
+ }
+
+
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
buffer->flush();
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0b080cbdd7..32b510b21a 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1638,7 +1638,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
do_xform = false;
}
- if (getVirtualSize() >= MIN_TEX_ANIM_SIZE)
+ if (getVirtualSize() >= MIN_TEX_ANIM_SIZE || isState(LLFace::RIGGED))
{ //don't override texture transform during tc bake
tex_mode = 0;
}
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 4698f2da1a..8402148a46 100755
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -570,6 +570,7 @@ std::vector<std::string>* LLFilePicker::navOpenFilterProc(ELoadFilter filter) //
allowedv->push_back("lsl");
allowedv->push_back("dic");
allowedv->push_back("xcu");
+ allowedv->push_back("gif");
case FFLOAD_IMAGE:
allowedv->push_back("jpg");
allowedv->push_back("jpeg");
@@ -661,7 +662,7 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena
case FFSAVE_TGAPNG:
type = "PNG";
creator = "prvw";
- extension = "png";
+ extension = "png,tga";
break;
case FFSAVE_BMP:
type = "BMPf";
@@ -779,7 +780,7 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
if(filter == FFLOAD_ALL) // allow application bundles etc. to be traversed; important for DEV-16869, but generally useful
{
- mPickOptions &= F_NAV_SUPPORT;
+ mPickOptions |= F_NAV_SUPPORT;
}
if (blocking)
diff --git a/indra/newview/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm
index 13757904e3..1438e4dc0a 100644
--- a/indra/newview/llfilepicker_mac.mm
+++ b/indra/newview/llfilepicker_mac.mm
@@ -107,7 +107,7 @@ std::string* doSaveDialog(const std::string* file,
NSSavePanel *panel = [NSSavePanel savePanel];
NSString *extensionns = [NSString stringWithCString:extension->c_str() encoding:[NSString defaultCStringEncoding]];
- NSArray *fileType = [[NSArray alloc] initWithObjects:extensionns,nil];
+ NSArray *fileType = [extensionns componentsSeparatedByString:@","];
//[panel setMessage:@"Save Image File"];
[panel setTreatsFilePackagesAsDirectories: ( flags & F_NAV_SUPPORT ) ];
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index a303c2c6b3..a358b7c10b 100755
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -32,6 +32,7 @@
#include "llfloaterimnearbychat.h"
#include "llspinctrl.h"
#include "lltrans.h"
+#include "llnotificationsutil.h"
const std::string LL_FCP_COMPLETE_NAME("complete_name");
const std::string LL_FCP_ACCOUNT_NAME("user_name");
@@ -45,14 +46,20 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),
mMutex(NULL),
- mShowHistory(false)
+ mShowHistory(false),
+ mMessages(NULL),
+ mHistoryThreadsBusy(false),
+ mOpened(false)
+{
+}
+
+LLFloaterConversationPreview::~LLFloaterConversationPreview()
{
}
BOOL LLFloaterConversationPreview::postBuild()
{
mChatHistory = getChild<LLChatHistory>("chat_history");
- LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
std::string name;
@@ -79,31 +86,21 @@ BOOL LLFloaterConversationPreview::postBuild()
std::string title = getString("Title", args);
setTitle(title);
- LLSD load_params;
- load_params["load_all_history"] = true;
- load_params["cut_off_todays_date"] = false;
-
-
- LLSD loading;
- loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
- mMessages.push_back(loading);
- mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
- mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
- mPageSpinner->setMinValue(1);
- mPageSpinner->set(1);
- mPageSpinner->setEnabled(false);
- LLLogChat::startChatHistoryThread(file, load_params);
return LLFloater::postBuild();
}
-void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name)
+void LLFloaterConversationPreview::setPages(std::list<LLSD>* messages, const std::string& file_name)
{
- if(file_name == mChatHistoryFileName)
+ if(file_name == mChatHistoryFileName && messages)
{
// additional protection to avoid changes of mMessages in setPages()
LLMutexLock lock(&mMutex);
+ if (mMessages)
+ {
+ delete mMessages; // Clean up temporary message list with "Loading..." text
+ }
mMessages = messages;
- mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0);
+ mCurrentPage = (mMessages->size() ? (mMessages->size() - 1) / mPageSize : 0);
mPageSpinner->setEnabled(true);
mPageSpinner->setMaxValue(mCurrentPage+1);
@@ -113,6 +110,11 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std:
getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
mShowHistory = true;
}
+ LLLoadHistoryThread* loadThread = LLLogChat::getLoadHistoryThread(mSessionID);
+ if (loadThread)
+ {
+ loadThread->removeLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+ }
}
void LLFloaterConversationPreview::draw()
@@ -127,24 +129,82 @@ void LLFloaterConversationPreview::draw()
void LLFloaterConversationPreview::onOpen(const LLSD& key)
{
+ if (mOpened)
+ {
+ return;
+ }
+ mOpened = true;
+ if (!LLLogChat::historyThreadsFinished(mSessionID))
+ {
+ LLNotificationsUtil::add("ChatHistoryIsBusyAlert");
+ mHistoryThreadsBusy = true;
+ closeFloater();
+ return;
+ }
+ LLSD load_params;
+ load_params["load_all_history"] = true;
+ load_params["cut_off_todays_date"] = false;
+
+ // The temporary message list with "Loading..." text
+ // Will be deleted upon loading completion in setPages() method
+ mMessages = new std::list<LLSD>();
+
+
+ LLSD loading;
+ loading[LL_IM_TEXT] = LLTrans::getString("loading_chat_logs");
+ mMessages->push_back(loading);
+ mPageSpinner = getChild<LLSpinCtrl>("history_page_spin");
+ mPageSpinner->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
+ mPageSpinner->setMinValue(1);
+ mPageSpinner->set(1);
+ mPageSpinner->setEnabled(false);
+
+ // The actual message list to load from file
+ // Will be deleted in a separate thread LLDeleteHistoryThread not to freeze UI
+ // LLDeleteHistoryThread is started in destructor
+ std::list<LLSD>* messages = new std::list<LLSD>();
+
+ LLLogChat::cleanupHistoryThreads();
+
+ LLLoadHistoryThread* loadThread = new LLLoadHistoryThread(mChatHistoryFileName, messages, load_params);
+ loadThread->setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
+ loadThread->start();
+ LLLogChat::addLoadHistoryThread(mSessionID, loadThread);
+
+ LLDeleteHistoryThread* deleteThread = new LLDeleteHistoryThread(messages, loadThread);
+ LLLogChat::addDeleteHistoryThread(mSessionID, deleteThread);
+
mShowHistory = true;
}
+void LLFloaterConversationPreview::onClose(bool app_quitting)
+{
+ mOpened = false;
+ if (!mHistoryThreadsBusy)
+ {
+ LLDeleteHistoryThread* deleteThread = LLLogChat::getDeleteHistoryThread(mSessionID);
+ if (deleteThread)
+ {
+ deleteThread->start();
+ }
+ }
+}
+
void LLFloaterConversationPreview::showHistory()
{
// additional protection to avoid changes of mMessages in setPages
LLMutexLock lock(&mMutex);
- if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size())
+ if(mMessages == NULL || !mMessages->size() || mCurrentPage * mPageSize >= mMessages->size())
{
return;
}
mChatHistory->clear();
std::ostringstream message;
- std::list<LLSD>::const_iterator iter = mMessages.begin();
+ std::list<LLSD>::const_iterator iter = mMessages->begin();
std::advance(iter, mCurrentPage * mPageSize);
- for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num)
+ for (int msg_num = 0; iter != mMessages->end() && msg_num < mPageSize; ++iter, ++msg_num)
{
LLSD msg = *iter;
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index b0488f4ff1..a8dbbc9ffe 100755
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -39,13 +39,14 @@ class LLFloaterConversationPreview : public LLFloater
public:
LLFloaterConversationPreview(const LLSD& session_id);
- virtual ~LLFloaterConversationPreview(){};
+ virtual ~LLFloaterConversationPreview();
virtual BOOL postBuild();
- void setPages(std::list<LLSD>& messages,const std::string& file_name);
+ void setPages(std::list<LLSD>* messages,const std::string& file_name);
virtual void draw();
virtual void onOpen(const LLSD& key);
+ virtual void onClose(bool app_quitting);
private:
void onMoreHistoryBtnClick();
@@ -58,11 +59,13 @@ private:
int mCurrentPage;
int mPageSize;
- std::list<LLSD> mMessages;
+ std::list<LLSD>* mMessages;
std::string mAccountName;
std::string mCompleteName;
- std::string mChatHistoryFileName;
+ std::string mChatHistoryFileName;
bool mShowHistory;
+ bool mHistoryThreadsBusy;
+ bool mOpened;
};
#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index bb39a54f76..ebb44561da 100755
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -1318,7 +1318,12 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
// Extract the single select info
bool is_single_select = (uuids.size() == 1);
const LLUUID& single_id = uuids.front();
-
+
+ if ("can_chat_history" == item && is_single_select)
+ {
+ return LLLogChat::isTranscriptExist(uuids.front(),false);
+ }
+
// Handle options that are applicable to all including the user agent
if ("can_view_profile" == item)
{
diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp
index ec506d1c7e..f61359f87a 100644
--- a/indra/newview/llfloaterimsession.cpp
+++ b/indra/newview/llfloaterimsession.cpp
@@ -716,7 +716,7 @@ void LLFloaterIMSession::setVisible(BOOL visible)
if (visible && isInVisibleChain())
{
sIMFloaterShowedSignal(mSessionID);
-
+ updateMessages();
}
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index e30bff1edf..7213064746 100755
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2336,7 +2336,7 @@ BOOL LLPanelLandAccess::postBuild()
childSetCommitCallback("public_access", onCommitPublicAccess, this);
childSetCommitCallback("limit_payment", onCommitAny, this);
childSetCommitCallback("limit_age_verified", onCommitAny, this);
- childSetCommitCallback("GroupCheck", onCommitAny, this);
+ childSetCommitCallback("GroupCheck", onCommitGroupCheck, this);
childSetCommitCallback("PassCheck", onCommitAny, this);
childSetCommitCallback("pass_combo", onCommitAny, this);
childSetCommitCallback("PriceSpin", onCommitAny, this);
@@ -2501,11 +2501,11 @@ void LLPanelLandAccess::refresh()
}
BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
- getChild<LLUICtrl>("PassCheck")->setValue(use_pass );
+ getChild<LLUICtrl>("PassCheck")->setValue(use_pass);
LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
if (passcombo)
{
- if (public_access || !use_pass || !use_group)
+ if (public_access || !use_pass)
{
passcombo->selectByValue("anyone");
}
@@ -2598,12 +2598,11 @@ void LLPanelLandAccess::refresh_ui()
getChildView("limit_age_verified")->setEnabled(FALSE);
- BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
getChildView("PassCheck")->setEnabled(can_manage_allowed);
if (sell_passes)
{
- getChildView("pass_combo")->setEnabled(group_access && can_manage_allowed);
+ getChildView("pass_combo")->setEnabled(can_manage_allowed);
getChildView("PriceSpin")->setEnabled(can_manage_allowed);
getChildView("HoursSpin")->setEnabled(can_manage_allowed);
}
@@ -2662,6 +2661,32 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)
onCommitAny(ctrl, userdata);
}
+void LLPanelLandAccess::onCommitGroupCheck(LLUICtrl *ctrl, void *userdata)
+{
+ LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+ LLParcel* parcel = self->mParcel->getParcel();
+ if (!parcel)
+ {
+ return;
+ }
+
+ BOOL use_pass_list = !self->getChild<LLUICtrl>("public_access")->getValue().asBoolean();
+ BOOL use_access_group = self->getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean();
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
+ {
+ if (use_access_group && use_pass_list)
+ {
+ if (passcombo->getSelectedValue().asString() == "group")
+ {
+ passcombo->selectByValue("anyone");
+ }
+ }
+ }
+
+ onCommitAny(ctrl, userdata);
+}
+
// static
void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
{
@@ -2699,14 +2724,14 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
{
use_access_list = TRUE;
use_pass_list = self->getChild<LLUICtrl>("PassCheck")->getValue().asBoolean();
- if (use_access_group && use_pass_list)
+ LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
+ if (passcombo)
{
- LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
- if (passcombo)
+ if (use_access_group && use_pass_list)
{
if (passcombo->getSelectedValue().asString() == "group")
{
- use_access_list = FALSE;
+ use_access_group = FALSE;
}
}
}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index dccdfc9acb..1d9bd33720 100755
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -366,6 +366,7 @@ public:
static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
+ static void onCommitGroupCheck(LLUICtrl* ctrl, void *userdata);
static void onClickRemoveAccess(void*);
static void onClickRemoveBanned(void*);
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 8d1114e056..d67089ff85 100755
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -366,6 +366,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
panel->getChild<LLUICtrl>("block_terraform_check")->setValue((region_flags & REGION_FLAGS_BLOCK_TERRAFORM) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("block_fly_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLY) ? TRUE : FALSE );
+ panel->getChild<LLUICtrl>("block_fly_over_check")->setValue((region_flags & REGION_FLAGS_BLOCK_FLYOVER) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("allow_damage_check")->setValue((region_flags & REGION_FLAGS_ALLOW_DAMAGE) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("restrict_pushobject")->setValue((region_flags & REGION_FLAGS_RESTRICT_PUSHOBJECT) ? TRUE : FALSE );
panel->getChild<LLUICtrl>("allow_land_resell_check")->setValue((region_flags & REGION_FLAGS_BLOCK_LAND_RESELL) ? FALSE : TRUE );
@@ -635,6 +636,7 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
// Enable the "Apply" button if something is changed. JC
initCtrl("block_terraform_check");
initCtrl("block_fly_check");
+ initCtrl("block_fly_over_check");
initCtrl("allow_damage_check");
initCtrl("allow_land_resell_check");
initCtrl("allow_parcel_changes_check");
@@ -816,6 +818,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
{
body["block_terraform"] = getChild<LLUICtrl>("block_terraform_check")->getValue();
body["block_fly"] = getChild<LLUICtrl>("block_fly_check")->getValue();
+ body["block_fly_over"] = getChild<LLUICtrl>("block_fly_over_check")->getValue();
body["allow_damage"] = getChild<LLUICtrl>("allow_damage_check")->getValue();
body["allow_land_resell"] = getChild<LLUICtrl>("allow_land_resell_check")->getValue();
body["agent_limit"] = getChild<LLUICtrl>("agent_limit_spin")->getValue();
@@ -891,6 +894,7 @@ BOOL LLPanelRegionDebugInfo::postBuild()
childSetAction("top_scripts_btn", onClickTopScripts, this);
childSetAction("restart_btn", onClickRestart, this);
childSetAction("cancel_restart_btn", onClickCancelRestart, this);
+ childSetAction("region_debug_console_btn", onClickDebugConsole, this);
return TRUE;
}
@@ -912,6 +916,7 @@ bool LLPanelRegionDebugInfo::refreshFromRegion(LLViewerRegion* region)
getChildView("top_scripts_btn")->setEnabled(allow_modify);
getChildView("restart_btn")->setEnabled(allow_modify);
getChildView("cancel_restart_btn")->setEnabled(allow_modify);
+ getChildView("region_debug_console_btn")->setEnabled(allow_modify);
return LLPanelRegionInfo::refreshFromRegion(region);
}
@@ -1074,6 +1079,11 @@ void LLPanelRegionDebugInfo::onClickCancelRestart(void* data)
self->sendEstateOwnerMessage(gMessageSystem, "restart", invoice, strings);
}
+// static
+void LLPanelRegionDebugInfo::onClickDebugConsole(void* data)
+{
+ LLFloaterReg::showInstance("region_debug_console");
+}
BOOL LLPanelRegionTerrainInfo::validateTextureSizes()
{
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index dd961e21b2..5bc4273d5f 100755
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -209,6 +209,7 @@ protected:
static void onClickRestart(void* data);
bool callbackRestart(const LLSD& notification, const LLSD& response);
static void onClickCancelRestart(void* data);
+ static void onClickDebugConsole(void* data);
private:
LLUUID mTargetAvatar;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 8e92821aac..3d5b297fbe 100755
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -44,7 +44,6 @@
#include "lltoolfocus.h"
#include "lltoolmgr.h"
#include "llwebprofile.h"
-#include "llwebsharing.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -360,10 +359,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat");
LLViewerWindow::ESnapshotType layer_type = getLayerType(floater);
-#if 0
- floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled"));
-#endif
-
floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat"));
enableAspectRatioCheckbox(floater, !floater->impl.mAspectRatioCheckOff);
setAspectRatioCheckboxValue(floater, gSavedSettings.getBOOL("KeepAspectForSnapshot"));
@@ -1032,12 +1027,6 @@ LLFloaterSnapshot::~LLFloaterSnapshot()
BOOL LLFloaterSnapshot::postBuild()
{
- // Kick start Web Sharing, to fetch its config data if it needs to.
- if (gSavedSettings.getBOOL("SnapshotSharingEnabled"))
- {
- LLWebSharing::instance().init();
- }
-
mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn");
childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this);
mRefreshLabel = getChild<LLUICtrl>("refresh_lbl");
@@ -1263,7 +1252,7 @@ S32 LLFloaterSnapshot::notify(const LLSD& info)
//static
void LLFloaterSnapshot::update()
{
- LLFloaterSnapshot* inst = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* inst = findInstance();
LLFloaterSocial* floater_social = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social");
if (!inst && !floater_social)
@@ -1291,12 +1280,18 @@ LLFloaterSnapshot* LLFloaterSnapshot::getInstance()
}
// static
+LLFloaterSnapshot* LLFloaterSnapshot::findInstance()
+{
+ return LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+}
+
+// static
void LLFloaterSnapshot::saveTexture()
{
LL_DEBUGS() << "saveTexture" << LL_ENDL;
// FIXME: duplicated code
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (!instance)
{
llassert(instance != NULL);
@@ -1317,7 +1312,7 @@ BOOL LLFloaterSnapshot::saveLocal()
{
LL_DEBUGS() << "saveLocal" << LL_ENDL;
// FIXME: duplicated code
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (!instance)
{
llassert(instance != NULL);
@@ -1337,7 +1332,7 @@ BOOL LLFloaterSnapshot::saveLocal()
void LLFloaterSnapshot::preUpdate()
{
// FIXME: duplicated code
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (instance)
{
// Disable the send/post/save buttons until snapshot is ready.
@@ -1352,7 +1347,7 @@ void LLFloaterSnapshot::preUpdate()
void LLFloaterSnapshot::postUpdate()
{
// FIXME: duplicated code
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (instance)
{
// Enable the send/post/save buttons.
@@ -1373,7 +1368,7 @@ void LLFloaterSnapshot::postUpdate()
// static
void LLFloaterSnapshot::postSave()
{
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (!instance)
{
llassert(instance != NULL);
@@ -1399,7 +1394,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
{
// FIXME: May not work for textures.
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (!instance)
{
llassert(instance != NULL);
@@ -1426,7 +1421,7 @@ LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
// static
const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
{
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (!instance)
{
llassert(instance != NULL);
@@ -1446,7 +1441,7 @@ const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal()
// static
void LLFloaterSnapshot::setAgentEmail(const std::string& email)
{
- LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot");
+ LLFloaterSnapshot* instance = findInstance();
if (instance)
{
LLSideTrayPanelContainer* panel_container = instance->getChild<LLSideTrayPanelContainer>("panel_container");
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 82af8c7a9d..c757bf21c2 100755
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -56,6 +56,7 @@ public:
// TODO: create a snapshot model instead
static LLFloaterSnapshot* getInstance();
+ static LLFloaterSnapshot* findInstance();
static void saveTexture();
static BOOL saveLocal();
static void preUpdate();
diff --git a/indra/newview/llfolderviewmodelinventory.h b/indra/newview/llfolderviewmodelinventory.h
index 9dcfdfa185..8772185ad0 100755
--- a/indra/newview/llfolderviewmodelinventory.h
+++ b/indra/newview/llfolderviewmodelinventory.h
@@ -105,6 +105,10 @@ class LLFolderViewModelInventory
public:
typedef LLFolderViewModel<LLInventorySort, LLFolderViewModelItemInventory, LLFolderViewModelItemInventory, LLInventoryFilter> base_t;
+ LLFolderViewModelInventory(const std::string& name)
+ : base_t(new LLInventorySort(), new LLInventoryFilter(LLInventoryFilter::Params().name(name)))
+ {}
+
void setTaskID(const LLUUID& id) {mTaskID = id;}
void sort(LLFolderViewFolder* folder);
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 9fa40bc6b9..ffddeeb129 100755
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -1337,6 +1337,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
{
S32 in_len = in_str.length();
+ //return whole trigger, if received text equals to it
item_map_t::iterator it;
for (it = mActive.begin(); it != mActive.end(); ++it)
{
@@ -1344,7 +1345,24 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
if (gesture)
{
const std::string& trigger = gesture->getTrigger();
-
+ if (!LLStringUtil::compareInsensitive(in_str, trigger))
+ {
+ *out_str = trigger;
+ return TRUE;
+ }
+ }
+ }
+
+ //return common chars, if more than one trigger matches the prefix
+ std::string rest_of_match = "";
+ std::string buf = "";
+ for (it = mActive.begin(); it != mActive.end(); ++it)
+ {
+ LLMultiGesture* gesture = (*it).second;
+ if (gesture)
+ {
+ const std::string& trigger = gesture->getTrigger();
+
if (in_len > (S32)trigger.length())
{
// too short, bail out
@@ -1355,11 +1373,49 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
LLStringUtil::truncate(trigger_trunc, in_len);
if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
{
- *out_str = trigger;
- return TRUE;
+ if (rest_of_match.compare("") == 0)
+ {
+ rest_of_match = trigger.substr(in_str.size());
+ }
+ std::string cur_rest_of_match = trigger.substr(in_str.size());
+ buf = "";
+ S32 i=0;
+
+ while (i<rest_of_match.length() && i<cur_rest_of_match.length())
+ {
+ if (rest_of_match[i]==cur_rest_of_match[i])
+ {
+ buf.push_back(rest_of_match[i]);
+ }
+ else
+ {
+ if(i==0)
+ {
+ rest_of_match = "";
+ }
+ break;
+ }
+ i++;
+ }
+ if (rest_of_match.compare("") == 0)
+ {
+ return FALSE;
+ }
+ if (buf.compare("") != 0)
+ {
+ rest_of_match = buf;
+ }
+
}
}
}
+
+ if (rest_of_match.compare("") != 0)
+ {
+ *out_str = in_str+rest_of_match;
+ return TRUE;
+ }
+
return FALSE;
}
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index 493dea62ff..813d2081ce 100755
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)
BOOL copyable = false;
if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true;
- if (!copyable && get_is_item_worn(item->getUUID()))
+ if (!copyable || get_is_item_worn(item->getUUID()))
{
acceptable = false;
}
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index bede9b1e6c..c386030329 100755
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -624,7 +624,8 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
LLGLDisable cull(GL_CULL_FACE);
- if (mCollisionBanned == BA_BANNED)
+ if (mCollisionBanned == BA_BANNED ||
+ regionp->getRegionFlag(REGION_FLAGS_BLOCK_FLYOVER))
{
collision_height = BAN_HEIGHT;
}
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 18cdc6ec6d..b2ad737a1d 100755
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -611,6 +611,11 @@ void LLGroupMgrGroupData::recalcAgentPowers(const LLUUID& agent_id)
}
}
+bool LLGroupMgrGroupData::isSingleMemberNotOwner()
+{
+ return mMembers.size() == 1 && !mMembers.begin()->second->isOwner();
+}
+
bool packRoleUpdateMessageBlock(LLMessageSystem* msg,
const LLUUID& group_id,
const LLUUID& role_id,
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index d107fceb49..9b62ecac48 100755
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -243,6 +243,8 @@ public:
BOOL isRoleDataComplete() { return mRoleDataComplete; }
BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
+
+ bool isSingleMemberNotOwner();
F32 getAccessTime() const { return mAccessTime; }
void setAccessed();
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 55904eb028..000eee3317 100755
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -938,7 +938,10 @@ void LLInventoryFilter::toParams(Params& params) const
{
params.filter_ops.types = getFilterObjectTypes();
params.filter_ops.category_types = getFilterCategoryTypes();
- params.filter_ops.wearable_types = getFilterWearableTypes();
+ if (getFilterObjectTypes() & FILTERTYPE_WEARABLE)
+ {
+ params.filter_ops.wearable_types = getFilterWearableTypes();
+ }
params.filter_ops.date_range.min_date = getMinDate();
params.filter_ops.date_range.max_date = getMaxDate();
params.filter_ops.hours_ago = getHoursAgo();
@@ -957,7 +960,10 @@ void LLInventoryFilter::fromParams(const Params& params)
setFilterObjectTypes(params.filter_ops.types);
setFilterCategoryTypes(params.filter_ops.category_types);
- setFilterWearableTypes(params.filter_ops.wearable_types);
+ if (params.filter_ops.wearable_types.isProvided())
+ {
+ setFilterWearableTypes(params.filter_ops.wearable_types);
+ }
setDateRange(params.filter_ops.date_range.min_date, params.filter_ops.date_range.max_date);
setHoursAgo(params.filter_ops.hours_ago);
setShowFolderState(params.filter_ops.show_folder_state);
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 2e592f731a..e74e58015a 100755
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -145,7 +145,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mShowItemLinkOverlays(p.show_item_link_overlays),
mShowEmptyMessage(p.show_empty_message),
mViewsInitialized(false),
- mInvFVBridgeBuilder(NULL)
+ mInvFVBridgeBuilder(NULL),
+ mInventoryViewModel(p.name)
{
mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER;
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 92974b9cef..06e517a861 100755
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -206,7 +206,11 @@ private:
};
LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
-LLLoadHistoryThread::load_end_signal_t * LLLoadHistoryThread::mLoadEndSignal = NULL;
+
+std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads;
+std::map<LLUUID,LLDeleteHistoryThread *> LLLogChat::sDeleteHistoryThreads;
+LLMutex* LLLogChat::sHistoryThreadsMutex = NULL;
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
@@ -337,83 +341,179 @@ void LLLogChat::saveHistory(const std::string& filename,
void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
{
if (file_name.empty())
- {
- LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
- return ;
- }
+ {
+ LL_WARNS("LLLogChat::loadChatHistory") << "Session name is Empty!" << LL_ENDL;
+ return ;
+ }
- bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
+ bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
- LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
- if (!fptr)
- {
- return; //No previous conversation with this name.
- }
- }
+ LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
+ if (!fptr)
+ {
+ return; //No previous conversation with this name.
+ }
+ }
- char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
- char *bptr;
- S32 len;
- bool firstline = TRUE;
-
- if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
- { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
- firstline = FALSE;
- if (fseek(fptr, 0, SEEK_SET))
- {
- fclose(fptr);
- return;
- }
- }
- while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
- {
- len = strlen(buffer) - 1; /*Flawfinder: ignore*/
- for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
-
- if (firstline)
- {
- firstline = FALSE;
- continue;
- }
-
- std::string line(buffer);
-
- //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
- if (' ' == line[0])
- {
- line.erase(0, MULTI_LINE_PREFIX.length());
- append_to_last_message(messages, '\n' + line);
- }
- else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
- {
- //to support old format's multilined messages with new lines used to divide paragraphs
- append_to_last_message(messages, line);
- }
- else
- {
- LLSD item;
- if (!LLChatLogParser::parse(line, item, load_params))
- {
- item[LL_IM_TEXT] = line;
- }
- messages.push_back(item);
- }
- }
- fclose(fptr);
+ char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+ char *bptr;
+ S32 len;
+ bool firstline = TRUE;
+
+ if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
+ firstline = FALSE;
+ if (fseek(fptr, 0, SEEK_SET))
+ {
+ fclose(fptr);
+ return;
+ }
+ }
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+ {
+ len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+ for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
+ if (firstline)
+ {
+ firstline = FALSE;
+ continue;
+ }
+
+ std::string line(buffer);
+
+ //updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
+ if (' ' == line[0])
+ {
+ line.erase(0, MULTI_LINE_PREFIX.length());
+ append_to_last_message(messages, '\n' + line);
+ }
+ else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
+ {
+ //to support old format's multilined messages with new lines used to divide paragraphs
+ append_to_last_message(messages, line);
+ }
+ else
+ {
+ LLSD item;
+ if (!LLChatLogParser::parse(line, item, load_params))
+ {
+ item[LL_IM_TEXT] = line;
+ }
+ messages.push_back(item);
+ }
+ }
+ fclose(fptr);
+}
+
+// static
+bool LLLogChat::historyThreadsFinished(LLUUID session_id)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ bool finished = true;
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ finished = it->second->isFinished();
+ }
+ if (!finished)
+ {
+ return false;
+ }
+ std::map<LLUUID,LLDeleteHistoryThread *>::iterator dit = sDeleteHistoryThreads.find(session_id);
+ if (dit != sDeleteHistoryThreads.end())
+ {
+ finished = finished && dit->second->isFinished();
+ }
+ return finished;
+}
+
+// static
+LLLoadHistoryThread* LLLogChat::getLoadHistoryThread(LLUUID session_id)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ return it->second;
+ }
+ return NULL;
+}
+// static
+LLDeleteHistoryThread* LLLogChat::getDeleteHistoryThread(LLUUID session_id)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLDeleteHistoryThread *>::iterator it = sDeleteHistoryThreads.find(session_id);
+ if (it != sDeleteHistoryThreads.end())
+ {
+ return it->second;
+ }
+ return NULL;
+}
+// static
+bool LLLogChat::addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLLoadHistoryThread *>::const_iterator it = sLoadHistoryThreads.find(session_id);
+ if (it != sLoadHistoryThreads.end())
+ {
+ return false;
+ }
+ sLoadHistoryThreads[session_id] = lthread;
+ return true;
+}
+
+// static
+bool LLLogChat::addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread)
+{
+ LLMutexLock lock(historyThreadsMutex());
+ std::map<LLUUID,LLDeleteHistoryThread *>::const_iterator it = sDeleteHistoryThreads.find(session_id);
+ if (it != sDeleteHistoryThreads.end())
+ {
+ return false;
+ }
+ sDeleteHistoryThreads[session_id] = dthread;
+ return true;
}
-void LLLogChat::startChatHistoryThread(const std::string& file_name, const LLSD& load_params)
+// static
+void LLLogChat::cleanupHistoryThreads()
{
+ LLMutexLock lock(historyThreadsMutex());
+ std::vector<LLUUID> uuids;
+ std::map<LLUUID,LLLoadHistoryThread *>::iterator lit = sLoadHistoryThreads.begin();
+ for (; lit != sLoadHistoryThreads.end(); lit++)
+ {
+ if (lit->second->isFinished() && sDeleteHistoryThreads[lit->first]->isFinished())
+ {
+ delete lit->second;
+ delete sDeleteHistoryThreads[lit->first];
+ uuids.push_back(lit->first);
+ }
+ }
+ std::vector<LLUUID>::iterator uuid_it = uuids.begin();
+ for ( ;uuid_it != uuids.end(); uuid_it++)
+ {
+ sLoadHistoryThreads.erase(*uuid_it);
+ sDeleteHistoryThreads.erase(*uuid_it);
+ }
+}
- LLLoadHistoryThread* mThread = new LLLoadHistoryThread();
- mThread->start();
- mThread->setHistoryParams(file_name, load_params);
+//static
+LLMutex* LLLogChat::historyThreadsMutex()
+{
+ if (sHistoryThreadsMutex == NULL)
+ {
+ sHistoryThreadsMutex = new LLMutex(NULL);
+ }
+ return sHistoryThreadsMutex;
}
+
// static
std::string LLLogChat::oldLogFileName(std::string filename)
{
@@ -475,7 +575,7 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string
//Add Nearby chat history to the list of transcriptions
list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename));
LLFile::close(filep);
- return;
+ continue;
}
char buffer[LOG_RECALL_SIZE];
@@ -845,31 +945,89 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
return true; //parsed name and message text, maybe have a timestamp too
}
-LLLoadHistoryThread::LLLoadHistoryThread() : LLThread("load chat history")
+LLDeleteHistoryThread::LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread)
+ : LLActionThread("delete chat history"),
+ mMessages(messages),
+ mLoadThread(loadThread)
{
- mNewLoad = false;
+}
+LLDeleteHistoryThread::~LLDeleteHistoryThread()
+{
+}
+void LLDeleteHistoryThread::run()
+{
+ if (mLoadThread != NULL)
+ {
+ mLoadThread->waitFinished();
+ }
+ if (NULL != mMessages)
+ {
+ delete mMessages;
+ }
+ mMessages = NULL;
+ setFinished();
}
-void LLLoadHistoryThread::run()
+LLActionThread::LLActionThread(const std::string& name)
+ : LLThread(name),
+ mMutex(NULL),
+ mRunCondition(NULL),
+ mFinished(false)
{
- while (!LLApp::isQuitting())
+}
+
+LLActionThread::~LLActionThread()
+{
+}
+
+void LLActionThread::waitFinished()
+{
+ mMutex.lock();
+ if (!mFinished)
{
- if(mNewLoad)
- {
- loadHistory(mFileName,mMessages,mLoadParams);
- break;
- }
+ mMutex.unlock();
+ mRunCondition.wait();
+ }
+ else
+ {
+ mMutex.unlock();
}
}
-void LLLoadHistoryThread::setHistoryParams(const std::string& file_name, const LLSD& load_params)
+void LLActionThread::setFinished()
{
- mFileName = file_name;
- mLoadParams = load_params;
- mNewLoad = true;
+ mMutex.lock();
+ mFinished = true;
+ mMutex.unlock();
+ mRunCondition.signal();
}
-void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params)
+LLLoadHistoryThread::LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
+ : LLActionThread("load chat history"),
+ mMessages(messages),
+ mFileName(file_name),
+ mLoadParams(load_params),
+ mNewLoad(true),
+ mLoadEndSignal(NULL)
+{
+}
+
+LLLoadHistoryThread::~LLLoadHistoryThread()
+{
+}
+
+void LLLoadHistoryThread::run()
+{
+ if(mNewLoad)
+ {
+ loadHistory(mFileName, mMessages, mLoadParams);
+ int count = mMessages->size();
+ llinfos << "mMessages->size(): " << count << llendl;
+ setFinished();
+ }
+}
+
+void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params)
{
if (file_name.empty())
{
@@ -878,8 +1036,8 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
}
bool load_all_history = load_params.has("load_all_history") ? load_params["load_all_history"].asBoolean() : false;
-
LLFILE* fptr = LLFile::fopen(LLLogChat::makeLogFileName(file_name), "r");/*Flawfinder: ignore*/
+
if (!fptr)
{
fptr = LLFile::fopen(LLLogChat::oldLogFileName(file_name), "r");/*Flawfinder: ignore*/
@@ -892,6 +1050,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
}
char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/
+
char *bptr;
S32 len;
bool firstline = TRUE;
@@ -908,29 +1067,31 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
}
}
- while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
+
+ while (fgets(buffer, LOG_RECALL_SIZE, fptr) && !feof(fptr))
{
len = strlen(buffer) - 1; /*Flawfinder: ignore*/
+
for (bptr = (buffer + len); (*bptr == '\n' || *bptr == '\r') && bptr>buffer; bptr--) *bptr='\0';
+
if (firstline)
{
firstline = FALSE;
continue;
}
-
std::string line(buffer);
//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
{
line.erase(0, MULTI_LINE_PREFIX.length());
- append_to_last_message(messages, '\n' + line);
+ append_to_last_message(*messages, '\n' + line);
}
else if (0 == len && ('\n' == line[0] || '\r' == line[0]))
{
//to support old format's multilined messages with new lines used to divide paragraphs
- append_to_last_message(messages, line);
+ append_to_last_message(*messages, line);
}
else
{
@@ -939,15 +1100,15 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
{
item[LL_IM_TEXT] = line;
}
- messages.push_back(item);
+ messages->push_back(item);
}
}
+
fclose(fptr);
mNewLoad = false;
(*mLoadEndSignal)(messages, file_name);
}
-
-//static
+
boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end_signal_t::slot_type& cb)
{
if (NULL == mLoadEndSignal)
@@ -957,3 +1118,13 @@ boost::signals2::connection LLLoadHistoryThread::setLoadEndSignal(const load_end
return mLoadEndSignal->connect(cb);
}
+
+void LLLoadHistoryThread::removeLoadEndSignal(const load_end_signal_t::slot_type& cb)
+{
+ if (NULL != mLoadEndSignal)
+ {
+ mLoadEndSignal->disconnect_all_slots();
+ delete mLoadEndSignal;
+ }
+ mLoadEndSignal = NULL;
+}
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 86610f99b3..ca597599dd 100755
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -29,23 +29,54 @@
#include "llthread.h"
class LLChat;
-class LLLoadHistoryThread : public LLThread
+
+class LLActionThread : public LLThread
{
+public:
+ LLActionThread(const std::string& name);
+ ~LLActionThread();
+
+ void waitFinished();
+ bool isFinished() { return mFinished; }
+protected:
+ void setFinished();
private:
- std::string mFileName;
- std::list<LLSD> mMessages;
+ bool mFinished;
+ LLMutex mMutex;
+ LLCondition mRunCondition;
+};
+
+class LLLoadHistoryThread : public LLActionThread
+{
+private:
+ const std::string& mFileName;
+ std::list<LLSD>* mMessages;
LLSD mLoadParams;
bool mNewLoad;
public:
- LLLoadHistoryThread();
-
- void setHistoryParams(const std::string& file_name, const LLSD& load_params);
- virtual void loadHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params);
+ LLLoadHistoryThread(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
+ ~LLLoadHistoryThread();
+ //void setHistoryParams(const std::string& file_name, const LLSD& load_params);
+ virtual void loadHistory(const std::string& file_name, std::list<LLSD>* messages, const LLSD& load_params);
virtual void run();
- typedef boost::signals2::signal<void (std::list<LLSD>& messages,const std::string& file_name)> load_end_signal_t;
- static load_end_signal_t * mLoadEndSignal;
- static boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+ typedef boost::signals2::signal<void (std::list<LLSD>* messages,const std::string& file_name)> load_end_signal_t;
+ load_end_signal_t * mLoadEndSignal;
+ boost::signals2::connection setLoadEndSignal(const load_end_signal_t::slot_type& cb);
+ void removeLoadEndSignal(const load_end_signal_t::slot_type& cb);
+};
+
+class LLDeleteHistoryThread : public LLActionThread
+{
+private:
+ std::list<LLSD>* mMessages;
+ LLLoadHistoryThread* mLoadThread;
+public:
+ LLDeleteHistoryThread(std::list<LLSD>* messages, LLLoadHistoryThread* loadThread);
+ ~LLDeleteHistoryThread();
+
+ virtual void run();
+ static void deleteHistory();
};
class LLLogChat
@@ -74,7 +105,6 @@ public:
static void getListOfTranscriptBackupFiles(std::vector<std::string>& list_of_transcriptions);
static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, const LLSD& load_params = LLSD());
- static void startChatHistoryThread(const std::string& file_name, const LLSD& load_params);
typedef boost::signals2::signal<void ()> save_history_signal_t;
static boost::signals2::connection setSaveHistorySignal(const save_history_signal_t::slot_type& cb);
@@ -91,9 +121,21 @@ public:
static bool isTranscriptExist(const LLUUID& avatar_id, bool is_group=false);
static bool isNearbyTranscriptExist();
+ static bool historyThreadsFinished(LLUUID session_id);
+ static LLLoadHistoryThread* getLoadHistoryThread(LLUUID session_id);
+ static LLDeleteHistoryThread* getDeleteHistoryThread(LLUUID session_id);
+ static bool addLoadHistoryThread(LLUUID& session_id, LLLoadHistoryThread* lthread);
+ static bool addDeleteHistoryThread(LLUUID& session_id, LLDeleteHistoryThread* dthread);
+ static void cleanupHistoryThreads();
+
private:
static std::string cleanFileName(std::string filename);
static save_history_signal_t * sSaveHistorySignal;
+
+ static std::map<LLUUID,LLLoadHistoryThread *> sLoadHistoryThreads;
+ static std::map<LLUUID,LLDeleteHistoryThread *> sDeleteHistoryThreads;
+ static LLMutex* sHistoryThreadsMutex;
+ static LLMutex* historyThreadsMutex();
};
/**
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index bf6874e445..109d6b31b2 100755
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -522,7 +522,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
manip2d.set(manipulator->mPosition.mV[VX] * half_width, manipulator->mPosition.mV[VY] * half_height);
delta = manip2d - mousePos;
- if (delta.magVecSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED)
+ if (delta.lengthSquared() < MAX_MANIP_SELECT_DISTANCE_SQUARED)
{
mHighlightedPart = manipulator->mManipID;
@@ -849,7 +849,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )
{
return;
}
-
mLastMouseX = x;
mLastMouseY = y;
@@ -861,7 +860,6 @@ void LLManipScale::dragCorner( S32 x, S32 y )
F32 s = 0;
F32 t = 0;
-
nearestPointOnLineFromMouse(x, y,
drag_start_center_agent,
drag_start_point_agent,
@@ -901,7 +899,7 @@ void LLManipScale::dragCorner( S32 x, S32 y )
F32 relative_snap_dist = fmodf(drag_dist + snap_dist, mScaleSnapUnit1 / cur_subdivisions);
mScaleSnappedValue = llclamp((drag_dist - (relative_snap_dist - snap_dist)), min_scale, max_scale);
- scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
+ scale_factor = mScaleSnappedValue / dist_vec(drag_start_point_agent, drag_start_center_agent);
mScaleSnappedValue /= mScaleSnapUnit1 * 2.f;
mSnapRegime = SNAP_REGIME_UPPER;
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index bf332d1ca7..f4aab6bd4e 100755
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -49,6 +49,7 @@
#include "llpanelgroupnotices.h"
#include "llpanelgroupgeneral.h"
+#include "llpanelgrouproles.h"
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
@@ -275,6 +276,7 @@ void LLPanelGroup::onBtnApply(void* user_data)
{
LLPanelGroup* self = static_cast<LLPanelGroup*>(user_data);
self->apply();
+ self->refreshData();
}
void LLPanelGroup::onBtnGroupCallClicked(void* user_data)
@@ -497,6 +499,22 @@ bool LLPanelGroup::apply(LLPanelGroupTab* tab)
{
//we skip refreshing group after ew manually apply changes since its very annoying
//for those who are editing group
+
+ LLPanelGroupRoles * roles_tab = dynamic_cast<LLPanelGroupRoles*>(tab);
+ if (roles_tab)
+ {
+ LLGroupMgr* gmgrp = LLGroupMgr::getInstance();
+ LLGroupMgrGroupData* gdatap = gmgrp->getGroupData(roles_tab->getGroupID());
+
+ // allow refresh only for one specific case:
+ // there is only one member in group and it is not owner
+ // it's a wrong situation and need refresh panels from server
+ if (gdatap && gdatap->isSingleMemberNotOwner())
+ {
+ return true;
+ }
+ }
+
mSkipRefresh = TRUE;
return true;
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index b941ee1f1b..343f2b413f 100755
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -716,6 +716,11 @@ void LLLandmarksPanel::updateListCommands()
mListCommands->getChildView(TRASH_BUTTON_NAME)->setEnabled(trash_enabled);
}
+void LLLandmarksPanel::updateMenuVisibility(LLUICtrl* menu)
+{
+ onMenuVisibilityChange(menu, LLSD().with("visibility", true));
+}
+
void LLLandmarksPanel::onActionsButtonClick()
{
LLToggleableMenu* menu = mGearFolderMenu;
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 8fae0f0b67..80310d1524 100755
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -80,6 +80,8 @@ public:
LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
+ void updateMenuVisibility(LLUICtrl* menu);
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index 74c810ea79..1cdd1b664e 100755
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -876,7 +876,10 @@ void LLPanelNearByMedia::onClickParcelAudioPlay()
// playing and updated as they cross to other parcels etc.
mParcelAudioAutoStart = true;
if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
return;
+ }
if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
{
@@ -896,7 +899,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
// they explicitly start it again.
mParcelAudioAutoStart = false;
if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
return;
+ }
LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
}
@@ -904,7 +910,10 @@ void LLPanelNearByMedia::onClickParcelAudioStop()
void LLPanelNearByMedia::onClickParcelAudioPause()
{
if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
return;
+ }
// 'true' means pause
gAudiop->pauseInternetStream(true);
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 77bfcec4e0..665b9ab294 100755
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1491,7 +1491,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
mFolders(NULL),
mHaveInventory(FALSE),
mIsInventoryEmpty(TRUE),
- mInventoryNeedsUpdate(FALSE)
+ mInventoryNeedsUpdate(FALSE),
+ mInventoryViewModel(p.name)
{
// Setup context menu callbacks
mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2));
@@ -2010,3 +2011,46 @@ void LLPanelObjectInventory::clearItemIDs()
mItemMap.clear();
}
+BOOL LLPanelObjectInventory::handleKeyHere( KEY key, MASK mask )
+{
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_DELETE:
+ case KEY_BACKSPACE:
+ // Delete selected items if delete or backspace key hit on the inventory panel
+ // Note: on Mac laptop keyboards, backspace and delete are one and the same
+ if (isSelectionRemovable() && mask == MASK_NONE)
+ {
+ LLInventoryAction::doToSelected(&gInventory, mFolders, "delete");
+ handled = TRUE;
+ }
+ break;
+ }
+ return handled;
+}
+
+BOOL LLPanelObjectInventory::isSelectionRemovable()
+{
+ if (!mFolders || !mFolders->getRoot())
+ {
+ return FALSE;
+ }
+ std::set<LLFolderViewItem*> selection_set = mFolders->getRoot()->getSelectionList();
+ if (selection_set.empty())
+ {
+ return FALSE;
+ }
+ for (std::set<LLFolderViewItem*>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ LLFolderViewItem *item = *iter;
+ const LLFolderViewModelItemInventory *listener = dynamic_cast<const LLFolderViewModelItemInventory*>(item->getViewModelItem());
+ if (!listener || !listener->isItemRemovable() || listener->isItemInTrash())
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index f497c695b3..9559f7e886 100755
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -94,6 +94,9 @@ protected:
void removeItemID(const LLUUID& id);
void clearItemIDs();
+ BOOL handleKeyHere( KEY key, MASK mask );
+ BOOL isSelectionRemovable();
+
private:
std::map<LLUUID, LLFolderViewItem*> mItemMap;
diff --git a/indra/newview/llplacesfolderview.cpp b/indra/newview/llplacesfolderview.cpp
index 9e1b75b7e9..fe89c1e314 100755
--- a/indra/newview/llplacesfolderview.cpp
+++ b/indra/newview/llplacesfolderview.cpp
@@ -31,6 +31,7 @@
#include "llplacesinventorypanel.h"
#include "llpanellandmarks.h"
+#include "llmenugl.h"
LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)
: LLFolderView(p)
@@ -67,6 +68,16 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)
return LLFolderView::handleRightMouseDown(x, y, mask);
}
+void LLPlacesFolderView::updateMenu()
+{
+ LLFolderView::updateMenu();
+ LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
+ if (menu && menu->getVisible())
+ {
+ mParentLandmarksPanel->updateMenuVisibility(menu);
+ }
+}
+
void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle)
{
mMenuHandlesByInventoryType[asset_type] = menu_handle;
diff --git a/indra/newview/llplacesfolderview.h b/indra/newview/llplacesfolderview.h
index 8c5be39b5e..65fe76007a 100755
--- a/indra/newview/llplacesfolderview.h
+++ b/indra/newview/llplacesfolderview.h
@@ -51,6 +51,8 @@ public:
*/
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
+ /*virtual*/ void updateMenu();
+
void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle);
void setParentLandmarksPanel(LLLandmarksPanel* panel)
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 5e7b148101..76cb1c1ebc 100755
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -191,11 +191,11 @@ public:
private:
LLScriptEdCore* mEditorCore;
-
static LLFloaterScriptSearch* sInstance;
protected:
LLLineEditor* mSearchBox;
+ LLLineEditor* mReplaceBox;
void onSearchBoxCommit();
};
@@ -204,6 +204,7 @@ LLFloaterScriptSearch* LLFloaterScriptSearch::sInstance = NULL;
LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)
: LLFloater(LLSD()),
mSearchBox(NULL),
+ mReplaceBox(NULL),
mEditorCore(editor_core)
{
buildFromFile("floater_script_search.xml");
@@ -226,6 +227,7 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core)
BOOL LLFloaterScriptSearch::postBuild()
{
+ mReplaceBox = getChild<LLLineEditor>("replace_text");
mSearchBox = getChild<LLLineEditor>("search_text");
mSearchBox->setCommitCallback(boost::bind(&LLFloaterScriptSearch::onSearchBoxCommit, this));
mSearchBox->setCommitOnFocusLost(FALSE);
@@ -241,8 +243,12 @@ BOOL LLFloaterScriptSearch::postBuild()
//static
void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)
{
+ LLSD::String search_text;
+ LLSD::String replace_text;
if (sInstance && sInstance->mEditorCore && sInstance->mEditorCore != editor_core)
{
+ search_text=sInstance->mSearchBox->getValue().asString();
+ replace_text=sInstance->mReplaceBox->getValue().asString();
sInstance->closeFloater();
delete sInstance;
}
@@ -251,6 +257,8 @@ void LLFloaterScriptSearch::show(LLScriptEdCore* editor_core)
{
// sInstance will be assigned in the constructor.
new LLFloaterScriptSearch(editor_core);
+ sInstance->mSearchBox->setValue(search_text);
+ sInstance->mReplaceBox->setValue(replace_text);
}
sInstance->openFloater();
@@ -271,7 +279,7 @@ void LLFloaterScriptSearch::onBtnSearch(void *userdata)
void LLFloaterScriptSearch::handleBtnSearch()
{
LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
- mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get());
+ mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());
}
// static
@@ -284,7 +292,7 @@ void LLFloaterScriptSearch::onBtnReplace(void *userdata)
void LLFloaterScriptSearch::handleBtnReplace()
{
LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
- mEditorCore->mEditor->replaceText(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get());
+ mEditorCore->mEditor->replaceText(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());
}
// static
@@ -297,7 +305,7 @@ void LLFloaterScriptSearch::onBtnReplaceAll(void *userdata)
void LLFloaterScriptSearch::handleBtnReplaceAll()
{
LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
- mEditorCore->mEditor->replaceTextAll(getChild<LLUICtrl>("search_text")->getValue().asString(), getChild<LLUICtrl>("replace_text")->getValue().asString(), caseChk->get());
+ mEditorCore->mEditor->replaceTextAll(mSearchBox->getValue().asString(), mReplaceBox->getValue().asString(), caseChk->get());
}
bool LLFloaterScriptSearch::hasAccelerators() const
@@ -328,7 +336,7 @@ void LLFloaterScriptSearch::onSearchBoxCommit()
if (mEditorCore && mEditorCore->mEditor)
{
LLCheckBoxCtrl* caseChk = getChild<LLCheckBoxCtrl>("case_text");
- mEditorCore->mEditor->selectNext(getChild<LLUICtrl>("search_text")->getValue().asString(), caseChk->get());
+ mEditorCore->mEditor->selectNext(mSearchBox->getValue().asString(), caseChk->get());
}
}
@@ -529,6 +537,10 @@ void LLScriptEdCore::initMenu()
menuItem->setClickCallback(boost::bind(&LLTextEditor::selectAll, mEditor));
menuItem->setEnableCallback(boost::bind(&LLTextEditor::canSelectAll, mEditor));
+ menuItem = getChild<LLMenuItemCallGL>("Deselect");
+ menuItem->setClickCallback(boost::bind(&LLTextEditor::deselect, mEditor));
+ menuItem->setEnableCallback(boost::bind(&LLTextEditor::canDeselect, mEditor));
+
menuItem = getChild<LLMenuItemCallGL>("Search / Replace...");
menuItem->setClickCallback(boost::bind(&LLFloaterScriptSearch::show, this));
@@ -1874,7 +1886,7 @@ void LLLiveLSLEditor::loadAsset()
mIsModifiable = item && gAgent.allowOperation(PERM_MODIFY,
item->getPermissions(),
GP_OBJECT_MANIPULATE);
-
+ refreshFromItem();
// This is commented out, because we don't completely
// handle script exports yet.
/*
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index 33d2d015ad..11b81a58fc 100755
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -55,7 +55,9 @@ BOOL LLPreviewSound::postBuild()
{
getChild<LLUICtrl>("desc")->setValue(item->getDescription());
if (gAudiop)
+ {
gAudiop->preloadSound(item->getAssetUUID()); // preload the sound
+ }
}
childSetAction("Sound play btn",&LLPreviewSound::playSound,this);
@@ -94,6 +96,6 @@ void LLPreviewSound::auditionSound( void *userdata )
if(item && gAudiop)
{
LLVector3d lpos_global = gAgent.getPositionGlobal();
- gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_UI, lpos_global);
+ gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global);
}
}
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 1ed48a978f..5c41c5ad97 100755
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -127,9 +127,28 @@ BOOL LLPreviewTexture::postBuild()
getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
}
+
+ // Fill in ratios list with common aspect ratio values
+ mRatiosList.clear();
+ mRatiosList.push_back(LLTrans::getString("Unconstrained"));
+ mRatiosList.push_back("1:1");
+ mRatiosList.push_back("4:3");
+ mRatiosList.push_back("10:7");
+ mRatiosList.push_back("3:2");
+ mRatiosList.push_back("16:10");
+ mRatiosList.push_back("16:9");
+ mRatiosList.push_back("2:1");
- childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
+ // Now fill combo box with provided list
LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ combo->removeall();
+
+ for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it)
+ {
+ combo->add(*it);
+ }
+
+ childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this);
combo->setCurrentByIndex(0);
return LLPreview::postBuild();
@@ -414,6 +433,13 @@ void LLPreviewTexture::updateDimensions()
{
return;
}
+
+ if (mAssetStatus != PREVIEW_ASSET_LOADED)
+ {
+ mAssetStatus = PREVIEW_ASSET_LOADED;
+ // Asset has been fully loaded, adjust aspect ratio
+ adjustAspectRatio();
+ }
// Update the width/height display every time
getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", mImage->getFullWidth()));
@@ -501,6 +527,46 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
return mAssetStatus;
}
+void LLPreviewTexture::adjustAspectRatio()
+{
+ S32 w = mImage->getFullWidth();
+ S32 h = mImage->getFullHeight();
+
+ // Determine aspect ratio of the image
+ S32 tmp;
+ while (h != 0)
+ {
+ tmp = w % h;
+ w = h;
+ h = tmp;
+ }
+ S32 divisor = w;
+ S32 num = mImage->getFullWidth() / divisor;
+ S32 denom = mImage->getFullHeight() / divisor;
+
+ if (setAspectRatio(num, denom))
+ {
+ // Select corresponding ratio entry in the combo list
+ LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio");
+ if (combo)
+ {
+ std::ostringstream ratio;
+ ratio << num << ":" << denom;
+ std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str());
+ if (found == mRatiosList.end())
+ {
+ combo->setCurrentByIndex(0);
+ }
+ else
+ {
+ combo->setCurrentByIndex(found - mRatiosList.begin());
+ }
+ }
+ }
+
+ mUpdateDimensions = TRUE;
+}
+
void LLPreviewTexture::updateImageID()
{
const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index cd16bacde2..97e74706cc 100755
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -70,6 +70,7 @@ protected:
/* virtual */ BOOL postBuild();
bool setAspectRatio(const F32 width, const F32 height);
static void onAspectRatioCommit(LLUICtrl*,void* userdata);
+ void adjustAspectRatio();
private:
void updateImageID(); // set what image is being uploaded.
@@ -95,5 +96,6 @@ private:
F32 mAspectRatio;
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
+ std::vector<std::string> mRatiosList;
};
#endif // LL_LLPREVIEWTEXTURE_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 243d4cf910..2556714792 100755
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -710,13 +710,13 @@ void LLSidepanelInventory::clearSelections(bool clearMain, bool clearInbox)
if (inv_panel)
{
- inv_panel->clearSelection();
+ inv_panel->getRootFolder()->clearSelection();
}
}
if (clearInbox && mInboxEnabled && mInventoryPanelInbox.get())
{
- mInventoryPanelInbox.get()->clearSelection();
+ mInventoryPanelInbox.get()->getRootFolder()->clearSelection();
}
updateVerbs();
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 5b22c51321..2c40c54c12 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -50,7 +50,6 @@
#include "llviewerstats.h"
#include "llvfile.h"
#include "llvfs.h"
-#include "llwebsharing.h"
#include "llwindow.h"
#include "llworld.h"
@@ -845,30 +844,3 @@ BOOL LLSnapshotLivePreview::saveLocal()
}
return success;
}
-
-void LLSnapshotLivePreview::saveWeb()
-{
- // *FIX: Will break if the window closes because of CloseSnapshotOnKeep!
- // Needs to pass on ownership of the image.
- LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get());
- if(!jpg)
- {
- LL_WARNS() << "Formatted image not a JPEG" << LL_ENDL;
- return;
- }
-
- LLSD metadata;
- metadata["description"] = getChild<LLLineEditor>("description")->getText();
-
- LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(),
- boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4));
-
- gViewerWindow->playSnapshotAnimAndSound();
-}
-
-void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z)
-{
- metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString();
-
- LLWebSharing::instance().shareSnapshot(snapshot, metadata);
-}
diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h
index fe3d257b02..0f09ef214a 100644
--- a/indra/newview/llsnapshotlivepreview.h
+++ b/indra/newview/llsnapshotlivepreview.h
@@ -96,7 +96,6 @@ public:
void setSnapshotQuality(S32 quality);
void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; }
void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f);
- void saveWeb();
void saveTexture();
BOOL saveLocal();
@@ -113,9 +112,6 @@ public:
// Returns TRUE when snapshot generated, FALSE otherwise.
static BOOL onIdle( void* snapshot_preview );
- // callback for region name resolve
- void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z);
-
private:
LLColor4 mColor;
LLPointer<LLViewerTexture> mViewerImage[2]; //used to represent the scene when the frame is frozen.
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a72b93e84e..a76b4bbe09 100755
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -622,25 +622,22 @@ bool idle_startup()
if (FALSE == gSavedSettings.getBOOL("NoAudio"))
{
+ delete gAudiop;
gAudiop = NULL;
#ifdef LL_FMODEX
- if (!gAudiop
#if !LL_WINDOWS
- && NULL == getenv("LL_BAD_FMODEX_DRIVER")
+ if (NULL == getenv("LL_BAD_FMODEX_DRIVER"))
#endif // !LL_WINDOWS
- )
{
gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("FMODExProfilerEnable"));
}
#endif
#ifdef LL_OPENAL
- if (!gAudiop
#if !LL_WINDOWS
- && NULL == getenv("LL_BAD_OPENAL_DRIVER")
+ if (NULL == getenv("LL_BAD_OPENAL_DRIVER"))
#endif // !LL_WINDOWS
- )
{
gAudiop = (LLAudioEngine *) new LLAudioEngine_OpenAL();
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 9d1290b86d..c12753acb0 100755
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -242,7 +242,7 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)
LLUUID item_id = findItemID(mImageAssetID, FALSE);
if (item_id.isNull())
{
- mInventoryPanel->clearSelection();
+ mInventoryPanel->getRootFolder()->clearSelection();
}
else
{
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 12086dad5f..d307a31843 100755
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -1611,16 +1611,19 @@ static void show_item_sharing_confirmation(const std::string name,
llassert(NULL != inv_item);
return;
}
-
- LLSD substitutions;
- substitutions["RESIDENTS"] = name;
- substitutions["ITEMS"] = inv_item->getName();
- LLSD payload;
- payload["agent_id"] = dest_agent;
- payload["item_id"] = inv_item->getUUID();
- payload["session_id"] = session_id;
- payload["d&d_dest"] = dest.asString();
- LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+ if(gInventory.getItem(inv_item->getUUID())
+ && LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+ {
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = name;
+ substitutions["ITEMS"] = inv_item->getName();
+ LLSD payload;
+ payload["agent_id"] = dest_agent;
+ payload["item_id"] = inv_item->getUUID();
+ payload["session_id"] = session_id;
+ payload["d&d_dest"] = dest.asString();
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
+ }
}
static void get_name_cb(const LLUUID& id,
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index b905ea2684..615064c782 100755
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -34,6 +34,7 @@
#include "llfloaterreg.h"
#include "llfloatersidepanelcontainer.h"
#include "llfloaterworldmap.h"
+#include "llnotifications.h"
#include "llpanellogin.h"
#include "llregionhandle.h"
#include "llslurl.h"
@@ -253,13 +254,15 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL&
//---------------------------------------------------------------------------
// Teleportation links are handled here because they are tightly coupled
// to SLURL parsing and sim-fragment parsing
+
class LLTeleportHandler : public LLCommandHandler
{
public:
// Teleport requests *must* come from a trusted browser
// inside the app, otherwise a malicious web page could
// cause a constant teleport loop. JC
- LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_BLOCK) { }
+ LLTeleportHandler() : LLCommandHandler("teleport", UNTRUSTED_THROTTLE) { }
+
bool handle(const LLSD& tokens, const LLSD& query_map,
LLMediaCtrl* web)
@@ -276,18 +279,50 @@ public:
tokens[3].asReal());
}
+ LLSD args;
+ args["LOCATION"] = tokens[0];
+
// Region names may be %20 escaped.
-
std::string region_name = LLURI::unescape(tokens[0]);
+ LLSD payload;
+ payload["region_name"] = region_name;
+ payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString();
+
+ LLNotificationsUtil::add("TeleportViaSLAPP", args, payload);
+ return true;
+ }
+
+ static void teleport_via_slapp(std::string region_name, std::string callback_url)
+ {
+
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionHandleCallback,
- LLSLURL(region_name, coords).getSLURLString(),
+ callback_url,
true); // teleport
- return true;
}
+
+ static bool teleport_via_slapp_callback(const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ std::string region_name = notification["payload"]["region_name"].asString();
+ std::string callback_url = notification["payload"]["callback_url"].asString();
+
+ if (option == 0)
+ {
+ teleport_via_slapp(region_name, callback_url);
+ return true;
+ }
+
+ return false;
+ }
+
};
LLTeleportHandler gTeleportHandler;
+static LLNotificationFunctorRegistration open_landmark_callback_reg("TeleportViaSLAPP", LLTeleportHandler::teleport_via_slapp_callback);
+
+
//---------------------------------------------------------------------------
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index e27ebe8663..7ce9d858dd 100755
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -94,7 +94,12 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
switch (mFadeState)
{
- case FADE_IDLE:
+ case FADE_IDLE:
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ break;
+ }
// If a stream is playing fade it out first
if (!gAudiop->getInternetStreamURL().empty())
{
@@ -116,18 +121,18 @@ void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
break;
}
- case FADE_OUT:
- startFading();
- registerIdleListener();
- break;
+ case FADE_OUT:
+ startFading();
+ registerIdleListener();
+ break;
- case FADE_IN:
- registerIdleListener();
- break;
+ case FADE_IN:
+ registerIdleListener();
+ break;
- default:
- LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL;
- break;
+ default:
+ LL_WARNS() << "Unknown fading state: " << mFadeState << LL_ENDL;
+ break;
}
}
@@ -158,19 +163,26 @@ bool LLViewerAudio::onIdleUpdate()
// we have finished the current fade operation
if (mFadeState == FADE_OUT)
{
- // Clear URI
- gAudiop->startInternetStream(LLStringUtil::null);
- gAudiop->stopInternetStream();
+ if (gAudiop)
+ {
+ // Clear URI
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+ }
if (!mNextStreamURI.empty())
{
mFadeState = FADE_IN;
- LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
- if(stream && stream->supportsAdjustableBufferSizes())
- stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
+ if (gAudiop)
+ {
+ LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl();
+ if(stream && stream->supportsAdjustableBufferSizes())
+ stream->setBufferSizes(gSavedSettings.getU32("FMODExStreamBufferSize"),gSavedSettings.getU32("FMODExDecodeBufferSize"));
+
+ gAudiop->startInternetStream(mNextStreamURI);
+ }
- gAudiop->startInternetStream(mNextStreamURI);
startFading();
}
else
@@ -182,7 +194,7 @@ bool LLViewerAudio::onIdleUpdate()
}
else if (mFadeState == FADE_IN)
{
- if (mNextStreamURI != gAudiop->getInternetStreamURL())
+ if (gAudiop && mNextStreamURI != gAudiop->getInternetStreamURL())
{
mFadeState = FADE_OUT;
startFading();
@@ -204,9 +216,12 @@ void LLViewerAudio::stopInternetStreamWithAutoFade()
mFadeState = FADE_IDLE;
mNextStreamURI = LLStringUtil::null;
mDone = true;
-
- gAudiop->startInternetStream(LLStringUtil::null);
- gAudiop->stopInternetStream();
+
+ if (gAudiop)
+ {
+ gAudiop->startInternetStream(LLStringUtil::null);
+ gAudiop->stopInternetStream();
+ }
}
void LLViewerAudio::startFading()
@@ -268,7 +283,7 @@ F32 LLViewerAudio::getFadeVolume()
void LLViewerAudio::onTeleportStarted()
{
- if (!LLViewerAudio::getInstance()->getForcedTeleportFade())
+ if (gAudiop && !LLViewerAudio::getInstance()->getForcedTeleportFade())
{
// Even though the music was turned off it was starting up (with autoplay disabled) occasionally
// after a failed teleport or after an intra-parcel teleport. Also, the music sometimes was not
@@ -394,9 +409,10 @@ void audio_update_volume(bool force_update)
}
F32 mute_volume = mute_audio ? 0.0f : 1.0f;
- // Sound Effects
if (gAudiop)
{
+ // Sound Effects
+
gAudiop->setMasterGain ( master_volume );
gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
@@ -426,11 +442,9 @@ void audio_update_volume(bool force_update)
gSavedSettings.getBOOL("MuteUI") ? 0.f : gSavedSettings.getF32("AudioLevelUI"));
gAudiop->setSecondaryGain(LLAudioEngine::AUDIO_TYPE_AMBIENT,
gSavedSettings.getBOOL("MuteAmbient") ? 0.f : gSavedSettings.getF32("AudioLevelAmbient"));
- }
- // Streaming Music
- if (gAudiop)
- {
+ // Streaming Music
+
if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade())
{
LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
@@ -528,6 +542,12 @@ void audio_update_wind(bool force_update)
volume_delta = 1.f;
}
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
+
// mute wind when not flying
if (gAgent.getFlying())
{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index f404f0c433..e53e191ab8 100755
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -67,7 +67,6 @@
#include "llvoavatarself.h"
#include "llvovolume.h"
#include "llwebprofile.h"
-#include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this!
#include "llwindow.h"
#include "llvieweraudio.h"
@@ -1426,9 +1425,6 @@ void LLViewerMedia::setOpenIDCookie()
getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start));
- // *HACK: Doing this here is nasty, find a better way.
- LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
-
// Do a web profile get so we can store the cookie
LLSD headers = LLSD::emptyMap();
headers["Accept"] = "*/*";
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 88f1dd14ff..9c08ec7e77 100755
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -8225,6 +8225,45 @@ class LLWorldEnvSettings : public view_listener_t
}
};
+class LLWorldEnableEnvSettings : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool result = false;
+ std::string tod = userdata.asString();
+
+ if (tod == "region")
+ {
+ return LLEnvManagerNew::instance().getUseRegionSettings();
+ }
+
+ if (LLEnvManagerNew::instance().getUseFixedSky())
+ {
+ if (tod == "sunrise")
+ {
+ result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunrise");
+ }
+ else if (tod == "noon")
+ {
+ result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midday");
+ }
+ else if (tod == "sunset")
+ {
+ result = (LLEnvManagerNew::instance().getSkyPresetName() == "Sunset");
+ }
+ else if (tod == "midnight")
+ {
+ result = (LLEnvManagerNew::instance().getSkyPresetName() == "Midnight");
+ }
+ else
+ {
+ llwarns << "Unknown item" << llendl;
+ }
+ }
+ return result;
+ }
+};
+
class LLWorldEnvPreset : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -8563,6 +8602,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldCheckAlwaysRun(), "World.CheckAlwaysRun");
view_listener_t::addMenu(new LLWorldEnvSettings(), "World.EnvSettings");
+ view_listener_t::addMenu(new LLWorldEnableEnvSettings(), "World.EnableEnvSettings");
view_listener_t::addMenu(new LLWorldEnvPreset(), "World.EnvPreset");
view_listener_t::addMenu(new LLWorldEnableEnvPreset(), "World.EnableEnvPreset");
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index e1c59fdfe9..58f85c770c 100755
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -494,7 +494,9 @@ class LLFileEnableCloseAllWindows : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool open_children = gFloaterView->allChildrenClosed() && !LLFloaterSnapshot::getInstance()->isInVisibleChain();
+ LLFloaterSnapshot* floater_snapshot = LLFloaterSnapshot::findInstance();
+ bool is_floater_snapshot_opened = floater_snapshot && floater_snapshot->isInVisibleChain();
+ bool open_children = gFloaterView->allChildrenClosed() && !is_floater_snapshot_opened;
return !open_children;
}
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 92fd2c0d73..8761b8cfb0 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3566,6 +3566,12 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
}
else
{
+ // make sure that we don't have an empty or all-whitespace name
+ LLStringUtil::trim(from_name);
+ if (from_name.empty())
+ {
+ from_name = LLTrans::getString("Unnamed");
+ }
chat.mFromName = from_name;
}
@@ -4701,7 +4707,11 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
void process_sound_trigger(LLMessageSystem *msg, void **)
{
- if (!gAudiop) return;
+ if (!gAudiop)
+ {
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
+ return;
+ }
U64 region_handle = 0;
F32 gain = 0;
@@ -4761,6 +4771,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
{
if (!gAudiop)
{
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
return;
}
@@ -4791,9 +4802,9 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
LLVector3d pos_global = objectp->getPositionGlobal();
if (gAgent.canAccessMaturityAtGlobal(pos_global))
{
- // Add audioData starts a transfer internally.
- sourcep->addAudioData(datap, FALSE);
-}
+ // Add audioData starts a transfer internally.
+ sourcep->addAudioData(datap, FALSE);
+ }
}
void process_attached_sound(LLMessageSystem *msg, void **user_data)
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 602c0cfb13..b1858df008 100755
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -5177,6 +5177,7 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
{
if (!gAudiop)
{
+ LL_WARNS("AudioEngine") << "LLAudioEngine instance doesn't exist!" << LL_ENDL;
return;
}
@@ -5259,7 +5260,10 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
LLAudioSourceVO *asvop = new LLAudioSourceVO(mID, owner_id, 0.01f, this);
mAudioSourcep = asvop;
- if(gAudiop) gAudiop->addAudioSource(asvop);
+ if(gAudiop)
+ {
+ gAudiop->addAudioSource(asvop);
+ }
}
return mAudioSourcep;
@@ -5267,10 +5271,6 @@ LLAudioSource *LLViewerObject::getAudioSource(const LLUUID& owner_id)
void LLViewerObject::adjustAudioGain(const F32 gain)
{
- if (!gAudiop)
- {
- return;
- }
if (mAudioSourcep)
{
mAudioGain = gain;
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 7f6a8186a5..00d3900a88 100755
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -117,7 +117,7 @@ public:
void setAllowSetHome(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_SET_HOME, b); }
void setResetHomeOnTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_RESET_HOME_ON_TELEPORT, b); }
void setSunFixed(BOOL b) { setRegionFlag(REGION_FLAGS_SUN_FIXED, b); }
- void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); }
+ //void setBlockFly(BOOL b) { setRegionFlag(REGION_FLAGS_BLOCK_FLY, b); } Never used
void setAllowDirectTeleport(BOOL b) { setRegionFlag(REGION_FLAGS_ALLOW_DIRECT_TELEPORT, b); }
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 69f9bbdff8..0c4f55d704 100755
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -542,8 +542,8 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
case LLAssetType::AT_BODYPART: img_name = "Inv_Skin"; break;
case LLAssetType::AT_ANIMATION: img_name = "Inv_Animation"; break;
case LLAssetType::AT_GESTURE: img_name = "Inv_Gesture"; break;
- case LLAssetType::AT_MESH: img_name = "Inv_Mesh"; break;
- default: llassert(0);
+ case LLAssetType::AT_MESH: img_name = "Inv_Mesh"; break;
+ default: img_name = "Inv_Invalid"; break; // use the Inv_Invalid icon for undefined object types (see MAINT-3981)
}
return LLUI::getUIImage(img_name);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index aa75bae712..ec794e527d 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -443,10 +443,7 @@ public:
}
if (gDisplayWindInfo)
{
- if (gAudiop)
- {
- audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled());
- }
+ audio_text = llformat("Audio for wind: %d", gAudiop ? gAudiop->isWindEnabled() : -1);
addText(xpos, ypos, audio_text); ypos += y_inc;
}
if (gDisplayFOV)
@@ -3246,6 +3243,8 @@ void LLViewerWindow::updateUI()
updateLayout();
+ saveLastMouse(mCurrentMousePoint);
+
// cleanup unused selections when no modal dialogs are open
if (LLModalDialog::activeCount() == 0)
{
diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp
deleted file mode 100755
index 3a80051b9b..0000000000
--- a/indra/newview/llwebsharing.cpp
+++ /dev/null
@@ -1,603 +0,0 @@
-/**
- * @file llwebsharing.cpp
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&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$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llwebsharing.h"
-
-#include "llagentui.h"
-#include "llbufferstream.h"
-#include "llhttpclient.h"
-#include "llhttpstatuscodes.h"
-#include "llsdserialize.h"
-#include "llsdutil.h"
-#include "llurl.h"
-#include "llviewercontrol.h"
-
-#include <boost/regex.hpp>
-#include <boost/algorithm/string/replace.hpp>
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingConfigResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingConfigResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- }
-
- virtual void result(const LLSD& content)
- {
- LLWebSharing::instance().receiveConfig(content);
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingOpenIDAuthResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingOpenIDAuthResponder);
-public:
- /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
- {
- completed(status, reason, content);
- }
-
- /* virtual */ void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- /// Left empty to override the default LLSD parsing behaviour.
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- if (HTTP_UNAUTHORIZED == status)
- {
- LL_WARNS("WebSharing") << "AU account not authenticated." << LL_ENDL;
- // *TODO: No account found on AU, so start the account creation process here.
- }
- else
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
-
- }
-
- virtual void result(const LLSD& content)
- {
- if (content.has("set-cookie"))
- {
- // OpenID request succeeded and returned a session cookie.
- LLWebSharing::instance().receiveSessionCookie(content["set-cookie"].asString());
- }
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingSecurityTokenResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingSecurityTokenResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- LLWebSharing::instance().retryOpenIDAuth();
- }
-
- virtual void result(const LLSD& content)
- {
- if (content[0].has("st") && content[0].has("expires"))
- {
- const std::string& token = content[0]["st"].asString();
- const std::string& expires = content[0]["expires"].asString();
- if (LLWebSharing::instance().receiveSecurityToken(token, expires))
- {
- // Sucessfully received a valid security token.
- return;
- }
- }
- else
- {
- LL_WARNS("WebSharing") << "No security token received." << LL_ENDL;
- }
-
- LLWebSharing::instance().retryOpenIDAuth();
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-class LLWebSharingUploadResponder : public LLHTTPClient::Responder
-{
- LOG_CLASS(LLWebSharingUploadResponder);
-public:
- /// Overrides the default LLSD parsing behaviour, to allow parsing a JSON response.
- virtual void completedRaw(U32 status, const std::string& reason,
- const LLChannelDescriptors& channels,
- const LLIOPipe::buffer_ptr_t& buffer)
- {
-/*
- // Dump the body, for debugging.
-
- LLBufferStream istr1(channels, buffer.get());
- std::ostringstream ostr;
- std::string body;
-
- while (istr1.good())
- {
- char buf[1024];
- istr1.read(buf, sizeof(buf));
- body.append(buf, istr1.gcount());
- }
- LL_DEBUGS("WebSharing") << body << LL_ENDL;
-*/
- LLSD content;
- LLBufferStream istr(channels, buffer.get());
- LLPointer<LLSDParser> parser = new LLSDNotationParser();
-
- if (parser->parse(istr, content, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
- {
- LL_WARNS("WebSharing") << "Failed to deserialize LLSD from JSON response. " << " [" << status << "]: " << reason << LL_ENDL;
- }
- else
- {
- completed(status, reason, content);
- }
- }
-
- virtual void errorWithContent(U32 status, const std::string& reason, const LLSD& content)
- {
- LL_WARNS("WebSharing") << "Error [status:" << status << "]: " << content << LL_ENDL;
- }
-
- virtual void result(const LLSD& content)
- {
- if (content[0].has("result") && content[0].has("id") &&
- content[0]["id"].asString() == "newMediaItem")
- {
- // *TODO: Upload successful, continue from here to post metadata and create AU activity.
- }
- else
- {
- LL_WARNS("WebSharing") << "Error [" << content[0]["code"].asString()
- << "]: " << content[0]["message"].asString() << LL_ENDL;
- }
- }
-};
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLWebSharing::LLWebSharing()
-: mConfig(),
- mSecurityToken(LLSD::emptyMap()),
- mEnabled(false),
- mRetries(0),
- mImage(NULL),
- mMetadata(LLSD::emptyMap())
-{
-}
-
-void LLWebSharing::init()
-{
- if (!mEnabled)
- {
- sendConfigRequest();
- }
-}
-
-bool LLWebSharing::shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata)
-{
- LL_INFOS("WebSharing") << metadata << LL_ENDL;
-
- if (mImage)
- {
- // *TODO: Handle this possibility properly, queue them up?
- LL_WARNS("WebSharing") << "Snapshot upload already in progress." << LL_ENDL;
- return false;
- }
-
- mImage = snapshot;
- mMetadata = metadata;
-
- // *TODO: Check whether we have a valid security token already and re-use it.
- sendOpenIDAuthRequest();
- return true;
-}
-
-bool LLWebSharing::setOpenIDCookie(const std::string& cookie)
-{
- LL_DEBUGS("WebSharing") << "Setting OpenID cookie " << cookie << LL_ENDL;
- mOpenIDCookie = cookie;
- return validateConfig();
-}
-
-bool LLWebSharing::receiveConfig(const LLSD& config)
-{
- LL_DEBUGS("WebSharing") << "Received config data: " << config << LL_ENDL;
- mConfig = config;
- return validateConfig();
-}
-
-bool LLWebSharing::receiveSessionCookie(const std::string& cookie)
-{
- LL_DEBUGS("WebSharing") << "Received AU session cookie: " << cookie << LL_ENDL;
- mSessionCookie = cookie;
-
- // Fetch a security token using the new session cookie.
- LLWebSharing::instance().sendSecurityTokenRequest();
-
- return (!mSessionCookie.empty());
-}
-
-bool LLWebSharing::receiveSecurityToken(const std::string& token, const std::string& expires)
-{
- mSecurityToken["st"] = token;
- mSecurityToken["expires"] = LLDate(expires);
-
- if (!securityTokenIsValid(mSecurityToken))
- {
- LL_WARNS("WebSharing") << "Invalid security token received: \"" << token << "\" Expires: " << expires << LL_ENDL;
- return false;
- }
-
- LL_DEBUGS("WebSharing") << "Received security token: \"" << token << "\" Expires: " << expires << LL_ENDL;
- mRetries = 0;
-
- // Continue the upload process now that we have a security token.
- sendUploadRequest();
-
- return true;
-}
-
-void LLWebSharing::sendConfigRequest()
-{
- std::string config_url = gSavedSettings.getString("SnapshotConfigURL");
- LL_DEBUGS("WebSharing") << "Requesting Snapshot Sharing config data from: " << config_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Accept"] = "application/json";
-
- LLHTTPClient::get(config_url, new LLWebSharingConfigResponder(), headers);
-}
-
-void LLWebSharing::sendOpenIDAuthRequest()
-{
- std::string auth_url = mConfig["openIdAuthUrl"];
- LL_DEBUGS("WebSharing") << "Starting OpenID Auth: " << auth_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mOpenIDCookie;
- headers["Accept"] = "*/*";
-
- // Send request, successful login will trigger fetching a security token.
- LLHTTPClient::get(auth_url, new LLWebSharingOpenIDAuthResponder(), headers);
-}
-
-bool LLWebSharing::retryOpenIDAuth()
-{
- if (mRetries++ >= MAX_AUTH_RETRIES)
- {
- LL_WARNS("WebSharing") << "Exceeded maximum number of authorization attempts, aborting." << LL_ENDL;
- mRetries = 0;
- return false;
- }
-
- LL_WARNS("WebSharing") << "Authorization failed, retrying (" << mRetries << "/" << MAX_AUTH_RETRIES << ")" << LL_ENDL;
- sendOpenIDAuthRequest();
- return true;
-}
-
-void LLWebSharing::sendSecurityTokenRequest()
-{
- std::string token_url = mConfig["securityTokenUrl"];
- LL_DEBUGS("WebSharing") << "Fetching security token from: " << token_url << LL_ENDL;
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mSessionCookie;
-
- headers["Accept"] = "application/json";
- headers["Content-Type"] = "application/json";
-
- std::ostringstream body;
- body << "{ \"gadgets\": [{ \"url\":\""
- << mConfig["gadgetSpecUrl"].asString()
- << "\" }] }";
-
- // postRaw() takes ownership of the buffer and releases it later.
- size_t size = body.str().size();
- U8 *data = new U8[size];
- memcpy(data, body.str().data(), size);
-
- // Send request, receiving a valid token will trigger snapshot upload.
- LLHTTPClient::postRaw(token_url, data, size, new LLWebSharingSecurityTokenResponder(), headers);
-}
-
-void LLWebSharing::sendUploadRequest()
-{
- LLUriTemplate upload_template(mConfig["openSocialRpcUrlTemplate"].asString());
- std::string upload_url(upload_template.buildURI(mSecurityToken));
-
- LL_DEBUGS("WebSharing") << "Posting upload to: " << upload_url << LL_ENDL;
-
- static const std::string BOUNDARY("------------abcdef012345xyZ");
-
- LLSD headers = LLSD::emptyMap();
- headers["Cookie"] = mSessionCookie;
-
- headers["Accept"] = "application/json";
- headers["Content-Type"] = "multipart/form-data; boundary=" + BOUNDARY;
-
- std::ostringstream body;
- body << "--" << BOUNDARY << "\r\n"
- << "Content-Disposition: form-data; name=\"request\"\r\n\r\n"
- << "[{"
- << "\"method\":\"mediaItems.create\","
- << "\"params\": {"
- << "\"userId\":[\"@me\"],"
- << "\"groupId\":\"@self\","
- << "\"mediaItem\": {"
- << "\"mimeType\":\"image/jpeg\","
- << "\"type\":\"image\","
- << "\"url\":\"@field:image1\""
- << "}"
- << "},"
- << "\"id\":\"newMediaItem\""
- << "}]"
- << "--" << BOUNDARY << "\r\n"
- << "Content-Disposition: form-data; name=\"image1\"\r\n\r\n";
-
- // Insert the image data.
- // *FIX: Treating this as a string will probably screw it up ...
- U8* image_data = mImage->getData();
- for (S32 i = 0; i < mImage->getDataSize(); ++i)
- {
- body << image_data[i];
- }
-
- body << "\r\n--" << BOUNDARY << "--\r\n";
-
- // postRaw() takes ownership of the buffer and releases it later.
- size_t size = body.str().size();
- U8 *data = new U8[size];
- memcpy(data, body.str().data(), size);
-
- // Send request, successful upload will trigger posting metadata.
- LLHTTPClient::postRaw(upload_url, data, size, new LLWebSharingUploadResponder(), headers);
-}
-
-bool LLWebSharing::validateConfig()
-{
- // Check the OpenID Cookie has been set.
- if (mOpenIDCookie.empty())
- {
- mEnabled = false;
- return mEnabled;
- }
-
- if (!mConfig.isMap())
- {
- mEnabled = false;
- return mEnabled;
- }
-
- // Template to match the received config against.
- LLSD required(LLSD::emptyMap());
- required["gadgetSpecUrl"] = "";
- required["loginTokenUrl"] = "";
- required["openIdAuthUrl"] = "";
- required["photoPageUrlTemplate"] = "";
- required["openSocialRpcUrlTemplate"] = "";
- required["securityTokenUrl"] = "";
- required["tokenBasedLoginUrlTemplate"] = "";
- required["viewerIdUrl"] = "";
-
- std::string mismatch(llsd_matches(required, mConfig));
- if (!mismatch.empty())
- {
- LL_WARNS("WebSharing") << "Malformed config data response: " << mismatch << LL_ENDL;
- mEnabled = false;
- return mEnabled;
- }
-
- mEnabled = true;
- return mEnabled;
-}
-
-// static
-bool LLWebSharing::securityTokenIsValid(LLSD& token)
-{
- return (token.has("st") &&
- token.has("expires") &&
- (token["st"].asString() != "") &&
- (token["expires"].asDate() > LLDate::now()));
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-//
-LLUriTemplate::LLUriTemplate(const std::string& uri_template)
- :
- mTemplate(uri_template)
-{
-}
-
-std::string LLUriTemplate::buildURI(const LLSD& vars)
-{
- // *TODO: Separate parsing the template from building the URI.
- // Parsing only needs to happen on construction/assignnment.
-
- static const std::string VAR_NAME_REGEX("[[:alpha:]][[:alnum:]\\._-]*");
- // Capture var name with and without surrounding {}
- static const std::string VAR_REGEX("\\{(" + VAR_NAME_REGEX + ")\\}");
- // Capture delimiter and comma separated list of var names.
- static const std::string JOIN_REGEX("\\{-join\\|(&)\\|(" + VAR_NAME_REGEX + "(?:," + VAR_NAME_REGEX + ")*)\\}");
-
- std::string uri = mTemplate;
- boost::smatch results;
-
- // Validate and expand join operators : {-join|&|var1,var2,...}
-
- boost::regex join_regex(JOIN_REGEX);
-
- while (boost::regex_search(uri, results, join_regex))
- {
- // Extract the list of var names from the results.
- std::string delim = results[1].str();
- std::string var_list = results[2].str();
-
- // Expand the list of vars into a query string with their values
- std::string query = expandJoin(delim, var_list, vars);
-
- // Substitute the query string into the template.
- uri = boost::regex_replace(uri, join_regex, query, boost::format_first_only);
- }
-
- // Expand vars : {var1}
-
- boost::regex var_regex(VAR_REGEX);
-
- std::set<std::string> var_names;
- std::string::const_iterator start = uri.begin();
- std::string::const_iterator end = uri.end();
-
- // Extract the var names used.
- while (boost::regex_search(start, end, results, var_regex))
- {
- var_names.insert(results[1].str());
- start = results[0].second;
- }
-
- // Replace each var with its value.
- for (std::set<std::string>::const_iterator it = var_names.begin(); it != var_names.end(); ++it)
- {
- std::string var = *it;
- if (vars.has(var))
- {
- boost::replace_all(uri, "{" + var + "}", vars[var].asString());
- }
- }
-
- return uri;
-}
-
-std::string LLUriTemplate::expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars)
-{
- std::ostringstream query;
-
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(",");
- tokenizer var_names(var_list, sep);
- tokenizer::const_iterator it = var_names.begin();
-
- // First var does not need a delimiter
- if (it != var_names.end())
- {
- const std::string& name = *it;
- if (vars.has(name))
- {
- // URL encode the value before appending the name=value pair.
- query << name << "=" << escapeURL(vars[name].asString());
- }
- }
-
- for (++it; it != var_names.end(); ++it)
- {
- const std::string& name = *it;
- if (vars.has(name))
- {
- // URL encode the value before appending the name=value pair.
- query << delim << name << "=" << escapeURL(vars[name].asString());
- }
- }
-
- return query.str();
-}
-
-// static
-std::string LLUriTemplate::escapeURL(const std::string& unescaped)
-{
- char* escaped = curl_escape(unescaped.c_str(), unescaped.size());
- std::string result = escaped;
- curl_free(escaped);
- return result;
-}
-
diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h
deleted file mode 100755
index ad9c99c224..0000000000
--- a/indra/newview/llwebsharing.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * @file llwebsharing.h
- * @author Aimee
- * @brief Web Snapshot Sharing
- *
- * $LicenseInfo:firstyear=2010&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$
- */
-
-#ifndef LL_LLWEBSHARING_H
-#define LL_LLWEBSHARING_H
-
-#include "llimagejpeg.h"
-#include "llsingleton.h"
-
-
-
-/**
- * @class LLWebSharing
- *
- * Manages authentication to, and interaction with, a web service allowing the
- * upload of snapshot images taken within the viewer, using OpenID and the
- * OpenSocial APIs.
- * http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/RPC-Protocol.html
- */
-class LLWebSharing : public LLSingleton<LLWebSharing>
-{
- LOG_CLASS(LLWebSharing);
-public:
- /*
- * Performs initial setup, by requesting config data from the web service if
- * it has not already been received.
- */
- void init();
-
- /*
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool enabled() const { return mEnabled; };
-
- /*
- * Sets the OpenID cookie to use for login to the web service.
- *
- * @param cookie a string containing the OpenID cookie.
- *
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool setOpenIDCookie(const std::string& cookie);
-
- /*
- * Receive config data used to connect to the web service.
- *
- * @param config an LLSD map of URL templates for the web service end-points.
- *
- * @return true if both the OpenID cookie and config data have been received.
- *
- * @see sendConfigRequest()
- */
- bool receiveConfig(const LLSD& config);
-
- /*
- * Receive the session cookie from the web service, which is the result of
- * the OpenID login process.
- *
- * @see sendOpenIDAuthRequest()
- */
- bool receiveSessionCookie(const std::string& cookie);
-
- /*
- * Receive a security token for the upload service.
- *
- * @see sendSecurityTokenRequest()
- */
- bool receiveSecurityToken(const std::string& token, const std::string& expires);
-
- /*
- * Restarts the authentication process if the maximum number of retries has
- * not been exceeded.
- *
- * @return true if retrying, false if LLWebSharing::MAX_AUTH_RETRIES has been exceeded.
- */
- bool retryOpenIDAuth();
-
- /*
- * Post a snapshot to the upload service.
- *
- * @return true if accepted for upload, false if already uploading another image.
- */
- bool shareSnapshot(LLImageJPEG* snapshot, LLSD& metadata);
-
-private:
- static const S32 MAX_AUTH_RETRIES = 4;
-
- friend class LLSingleton<LLWebSharing>;
-
- LLWebSharing();
- ~LLWebSharing() {};
-
- /*
- * Request a map of URLs and URL templates to the web service end-points.
- *
- * @see receiveConfig()
- */
- void sendConfigRequest();
-
- /*
- * Initiate the OpenID login process.
- *
- * @see receiveSessionCookie()
- */
- void sendOpenIDAuthRequest();
-
- /*
- * Request a security token for the upload service.
- *
- * @see receiveSecurityToken()
- */
- void sendSecurityTokenRequest();
-
- /*
- * Request a security token for the upload service.
- *
- * @see receiveSecurityToken()
- */
- void sendUploadRequest();
-
- /*
- * Checks all necessary config information has been received, and sets mEnabled.
- *
- * @return true if both the OpenID cookie and config data have been received.
- */
- bool validateConfig();
-
- /*
- * Checks the security token is present and has not expired.
- *
- * @param token an LLSD map containing the token string and the time it expires.
- *
- * @return true if the token is not empty and has not expired.
- */
- static bool securityTokenIsValid(LLSD& token);
-
- std::string mOpenIDCookie;
- std::string mSessionCookie;
- LLSD mSecurityToken;
-
- LLSD mConfig;
- bool mEnabled;
-
- LLPointer<LLImageJPEG> mImage;
- LLSD mMetadata;
-
- S32 mRetries;
-};
-
-/**
- * @class LLUriTemplate
- *
- * @brief Builds complete URIs, given URI template and a map of keys and values
- * to use for substition.
- * Note: This is only a partial implementation of a draft standard required
- * by the web API used by LLWebSharing.
- * See: http://tools.ietf.org/html/draft-gregorio-uritemplate-03
- *
- * @see LLWebSharing
- */
-class LLUriTemplate
-{
- LOG_CLASS(LLUriTemplate);
-public:
- LLUriTemplate(const std::string& uri_template);
- ~LLUriTemplate() {};
-
- /*
- * Builds a complete URI from the template.
- *
- * @param vars an LLSD map of keys and values for substitution.
- *
- * @return a string containing the complete URI.
- */
- std::string buildURI(const LLSD& vars);
-
-private:
- /*
- * Builds a URL query string.
- *
- * @param delim a string containing the separator to use between name=value pairs.
- * @param var_list a string containing a comma separated list of variable names.
- * @param vars an LLSD map of keys and values for substitution.
- *
- * @return a URL query string.
- */
- std::string expandJoin(const std::string& delim, const std::string& var_list, const LLSD& vars);
-
- /*
- * URL escape the given string.
- * LLWeb::escapeURL() only does a partial escape, so this uses curl_escape() instead.
- */
- static std::string escapeURL(const std::string& unescaped);
-
- std::string mTemplate;
-};
-
-
-
-#endif // LL_LLWEBSHARING_H
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 11d100eeff..74d160dfae 100755
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1172,7 +1172,8 @@ Prøv venligst om lidt igen.
<string name="InventoryNoTexture">
Du har ikke en kopi af denne tekstur i din beholdning
</string>
- <string name="no_transfer" value=" (ikke overdragbar)"/>
+ <string name="Unconstrained">Ikke låst</string>
+ <string name="no_transfer" value=" (ikke overdragbar)"/>
<string name="no_modify" value=" (ikke redigere)"/>
<string name="no_copy" value=" (ikke kopiere)"/>
<string name="worn" value=" (båret)"/>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 4268b95370..082febd709 100755
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1267,7 +1267,8 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden.
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
</string>
- <string name="InventoryInboxNoItems">
+ <string name="Unconstrained">keines</string>
+ <string name="InventoryInboxNoItems">
Einkäufe aus dem Marktplatz erscheinen hier. Sie können diese dann zur Verwendung in Ihr Inventar ziehen.
</string>
<string name="MarketplaceURL">
diff --git a/indra/newview/skins/default/xui/en/floater_places.xml b/indra/newview/skins/default/xui/en/floater_places.xml
index b241e265a9..31dd6d2c64 100755
--- a/indra/newview/skins/default/xui/en/floater_places.xml
+++ b/indra/newview/skins/default/xui/en/floater_places.xml
@@ -2,6 +2,7 @@
<floater
positioning="cascading"
+ default_tab_group="1"
legacy_header_height="18"
can_resize="true"
height="588"
@@ -16,6 +17,7 @@
width="333">
<panel
top="18"
+ tab_group="1"
class="panel_places"
name="main_panel"
filename="panel_places.xml"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 137e278ddc..e1e7e1c8c8 100755
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -79,30 +79,6 @@
width="108"
name="combo_aspect_ratio"
tool_tip="Preview at a fixed aspect ratio">
- <combo_item name="Unconstrained" value="Unconstrained">
- Unconstrained
- </combo_item>
- <combo_item name="1:1" value="1:1" tool_tip="Group insignia or Real World profile">
- 1:1
- </combo_item>
- <combo_item name="4:3" value="4:3" tool_tip="[SECOND_LIFE] profile">
- 4:3
- </combo_item>
- <combo_item name="10:7" value="10:7" tool_tip="Classifieds and search listings, landmarks">
- 10:7
- </combo_item>
- <combo_item name="3:2" value="3:2" tool_tip="About land">
- 3:2
- </combo_item>
- <combo_item name="16:10" value="16:10">
- 16:10
- </combo_item>
- <combo_item name="16:9" value="16:9" tool_tip="Profile picks">
- 16:9
- </combo_item>
- <combo_item name="2:1" value="2:1">
- 2:1
- </combo_item>
</combo_box>
<button
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 52c4fb1613..e91eea04d1 100755
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -35,14 +35,72 @@
tear_off="true"
name="Help">
<menu_item_call
- label="[SECOND_LIFE] Help"
- name="Second Life Help"
+ label="How to..."
+ name="How To"
shortcut="F1">
<menu_item_call.on_click
- function="ShowHelp"
- parameter="f1_help" />
+ function="Help.ToggleHowTo"
+ parameter="" />
</menu_item_call>
- <menu_item_separator />
+ <menu_item_call
+ label="Quickstart"
+ name="Quickstart">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Quickstart/ta-p/1087919"/>
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Knowledge Base"
+ name="Knowledge Base">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Wiki"
+ name="Wiki">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://wiki.secondlife.com"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Community Forums"
+ name="Community Forums">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Forums/ct-p/Forums"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Support portal"
+ name="Support portal">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="https://support.secondlife.com/"/>
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="[SECOND_LIFE] News"
+ name="Second Life News">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Featured-News/bg-p/blog_feature_news"/>
+ </menu_item_call>
+ <menu_item_call
+ label="[SECOND_LIFE] Blogs"
+ name="Second Life Blogs">
+ <menu_item_call.on_click
+ function="Advanced.ShowURL"
+ parameter="http://community.secondlife.com/t5/Blogs/ct-p/Blogs"/>
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Report Bug"
+ name="Report Bug">
+ <menu_item_call.on_click
+ function="Advanced.ReportBug"/>
+ </menu_item_call>
+ <menu_item_separator/>
<menu_item_call
label="About [APP_NAME]"
name="About Second Life">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 7428a1cf37..767acd1d74 100755
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -606,44 +606,59 @@
label="Sun"
name="Sun"
tear_off="true">
- <menu_item_call
+ <menu_item_check
label="Sunrise"
name="Sunrise">
- <menu_item_call.on_click
+ <menu_item_check.on_click
function="World.EnvSettings"
parameter="sunrise" />
- </menu_item_call>
- <menu_item_call
+ <menu_item_check.on_check
+ function="World.EnableEnvSettings"
+ parameter="sunrise" />
+ </menu_item_check>
+ <menu_item_check
label="Midday"
name="Noon"
shortcut="control|shift|Y">
- <menu_item_call.on_click
+ <menu_item_check.on_click
function="World.EnvSettings"
parameter="noon" />
- </menu_item_call>
- <menu_item_call
+ <menu_item_check.on_check
+ function="World.EnableEnvSettings"
+ parameter="noon" />
+ </menu_item_check>
+ <menu_item_check
label="Sunset"
name="Sunset"
shortcut="control|shift|N">
- <menu_item_call.on_click
+ <menu_item_check.on_click
function="World.EnvSettings"
parameter="sunset" />
- </menu_item_call>
- <menu_item_call
+ <menu_item_check.on_check
+ function="World.EnableEnvSettings"
+ parameter="sunset" />
+ </menu_item_check>
+ <menu_item_check
label="Midnight"
name="Midnight">
- <menu_item_call.on_click
+ <menu_item_check.on_click
function="World.EnvSettings"
parameter="midnight" />
- </menu_item_call>
+ <menu_item_check.on_check
+ function="World.EnableEnvSettings"
+ parameter="midnight" />
+ </menu_item_check>
<menu_item_separator/>
- <menu_item_call
+ <menu_item_check
label="Use Region Settings"
name="Use Region Settings">
- <menu_item_call.on_click
+ <menu_item_check.on_click
function="World.EnvSettings"
parameter="region" />
- </menu_item_call>
+ <menu_item_check.on_check
+ function="World.EnableEnvSettings"
+ parameter="region" />
+ </menu_item_check>
</menu>
@@ -1551,7 +1566,8 @@
<menu_item_check
label="Highlight Transparent"
name="Highlight Transparent"
- shortcut="control|alt|T">
+ shortcut="control|alt|T"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="View.CheckHighlightTransparent" />
<menu_item_check.on_click
@@ -3175,18 +3191,6 @@
<menu_item_call.on_click
function="Advanced.PrintAgentInfo" />
</menu_item_call>
- <menu_item_check
- label="Region Debug Console"
- name="Region Debug Console"
- shortcut="control|shift|`"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="region_debug_console" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="region_debug_console" />
- </menu_item_check>
<menu_item_separator />
<menu_item_check
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 9af80a23a7..ba6bbd0eed 100755
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4137,6 +4137,19 @@ Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
notext="Cancel"
yestext="Teleport"/>
</notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="TeleportViaSLAPP"
+ type="alertmodal">
+Are you sure you want to teleport to &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <tag>confirm</tag>
+ <usetemplate
+ ignoretext="Confirm that I want to teleport via SLAPP"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Teleport"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -7634,7 +7647,7 @@ Are you sure you want to share the following items:
With the following Residents:
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -7654,7 +7667,7 @@ Are you sure you want to share the following items:
With the following Residents:
-[RESIDENTS]
+&lt;nolink&gt;[RESIDENTS]&lt;/nolink&gt;
<tag>confirm</tag>
<usetemplate
name="okcancelbuttons"
@@ -10235,4 +10248,14 @@ Cannot create large prims that intersect other players. Please re-try when othe
yestext="OK"/>
</notification>
+ <notification
+ icon="alert.tga"
+ name="ChatHistoryIsBusyAlert"
+ type="alertmodal">
+ Chat history file is busy with previous operation. Please try again in a few minutes or choose chat with another person.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
</notifications>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index f169dbb702..7d171490e8 100755
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -27,6 +27,7 @@ background_visible="true"
label="Filter My Places"
max_length_chars="300"
name="Filter"
+ tab_group="1"
top="3"
width="303" />
<tab_container
@@ -39,7 +40,7 @@ background_visible="true"
tab_min_width="80"
tab_max_width="157"
tab_height="30"
- tab_group="1"
+ tab_group="2"
tab_position="top"
top_pad="10"
width="315" />
diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml
index 81b2281adb..fea5f1b19f 100755
--- a/indra/newview/skins/default/xui/en/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml
@@ -201,4 +201,14 @@
tool_tip="Cancel region restart"
top_delta="0"
width="150" />
+ <button
+ follows="left|top"
+ height="20"
+ label="Region Debug Console"
+ layout="topleft"
+ left="10"
+ name="region_debug_console_btn"
+ tool_tip="Open Region Debug Console"
+ top_pad="5"
+ width="150" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 44c84e69a1..489d286e67 100755
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -94,11 +94,20 @@
width="80" />
<check_box
height="20"
+ label="Block Parcel Fly Over"
+ layout="topleft"
+ left="10"
+ name="block_fly_over_check"
+ tool_tip="Extend access checks upwards to prevent flying over a parcel"
+ top="110"
+ width="90" />
+ <check_box
+ height="20"
label="Allow Damage"
layout="topleft"
left="10"
name="allow_damage_check"
- top="110"
+ top="130"
width="80" />
<check_box
height="20"
@@ -106,7 +115,7 @@
layout="topleft"
left="10"
name="restrict_pushobject"
- top="130"
+ top="150"
width="80" />
<check_box
height="20"
@@ -114,7 +123,7 @@
layout="topleft"
left="10"
name="allow_land_resell_check"
- top="150"
+ top="170"
width="80" />
<check_box
height="20"
@@ -122,7 +131,7 @@
layout="topleft"
left="10"
name="allow_parcel_changes_check"
- top="170"
+ top="190"
width="80" />
<check_box
height="20"
@@ -131,7 +140,7 @@
left="10"
name="block_parcel_search_check"
tool_tip="Let people see this region and its parcels in search results"
- top="190"
+ top="210"
width="80" />
<spinner
decimal_digits="0"
@@ -145,7 +154,7 @@
max_val="100"
min_val="1"
name="agent_limit_spin"
- top="240"
+ top="260"
width="170" />
<spinner
follows="left|top"
@@ -158,7 +167,7 @@
max_val="10"
min_val="1"
name="object_bonus_spin"
- top="260"
+ top="280"
width="170" />
<text
follows="left|top"
@@ -167,7 +176,7 @@
layout="topleft"
left="10"
name="access_text"
- top="290"
+ top="310"
width="100">
Rating:
</text>
@@ -224,7 +233,7 @@
layout="topleft"
left="108"
name="apply_btn"
- top="320"
+ top="340"
width="100"/>
<button
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b85541461a..9043872871 100755
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2269,6 +2269,7 @@ The [[MARKETPLACE_CREATE_STORE_URL] Marketplace store] is returning errors.
<string name="Marketplace Error Internal Import">Error: There was a problem with this item. Try again later.</string>
<string name="Open landmarks">Open landmarks</string>
+ <string name="Unconstrained">Unconstrained</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 484511a08b..2b91c542ad 100755
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1252,7 +1252,8 @@ Intenta iniciar sesión de nuevo en unos instantes.
<string name="InventoryInboxNoItems">
Aquí aparecerán algunos de los objetos que recibas, como los regalos Premium. Después puedes arrastrarlos a tu inventario.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sin restricciones</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 78d846ff4f..b8721420cb 100755
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1270,7 +1270,8 @@ Veuillez réessayer de vous connecter dans une minute.
<string name="InventoryInboxNoItems">
Les achats que vous avez effectués sur la Place du marché s&apos;affichent ici. Vous pouvez alors les faire glisser vers votre inventaire afin de les utiliser.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sans contraintes</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 60ed2b0929..86d7f75b83 100755
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1261,7 +1261,8 @@ Prova ad accedere nuovamente tra un minuto.
<string name="InventoryInboxNoItems">
Gli acquissti dal mercato verranno mostrati qui. Potrai quindi trascinarli nel tuo inventario per usarli.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Libero</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index a0f45e5a55..36966d6825 100755
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1270,7 +1270,8 @@ support@secondlife.com にお問い合わせください。
<string name="InventoryInboxNoItems">
マーケットプレイスで購入した商品はここに表示されます。その後、アイテムをインベントリにドラッグすれば、それらのアイテムを使用できます。
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">非拘束</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index f6dec8536b..f86e393646 100755
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1035,6 +1035,7 @@
<string name="InventoryNoTexture">
Nie posiadasz kopii tej tekstury w Twojej Szafie.
</string>
+ <string name="Unconstrained">Swobodny</string>
<string name="no_transfer" value=" (brak oddawania)"/>
<string name="no_modify" value=" (brak modyfikowania)"/>
<string name="no_copy" value=" (brak kopiowania)"/>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2eb4c0a02e..8436452228 100755
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1216,7 +1216,8 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para
<string name="InventoryInboxNoItems">
Suas compras do Marketplace aparecerão aqui. Depois, você poderá arrastá-las para seu inventário para usá-las.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Sem limites</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 0f71edcee0..8faf834f8f 100755
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -1267,7 +1267,8 @@ support@secondlife.com.
<string name="InventoryInboxNoItems">
Здесь будут показаны ваши покупки из торгового центра. Их можно будет перетащить в ваш инвентарь для использования.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Без ограничения</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">
diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml
index c4b1530b2b..31c5d2d310 100755
--- a/indra/newview/skins/default/xui/tr/strings.xml
+++ b/indra/newview/skins/default/xui/tr/strings.xml
@@ -1267,7 +1267,8 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin.
<string name="InventoryInboxNoItems">
Pazaryerinda satın aldıklarınız burada görünecektir. Bunları kullanmak için envanterinize sürükleyebilirsiniz.
</string>
- <string name="MarketplaceURL">
+ <string name="Unconstrained">Kısıtsız</string>
+ <string name="MarketplaceURL">
https://marketplace.[MARKETPLACE_DOMAIN_NAME]/
</string>
<string name="MarketplaceURL_CreateStore">