merge from viewer2.

master
Tofu Linden 2010-02-04 11:44:11 +00:00
commit 05e15ccb82
100 changed files with 817 additions and 508 deletions

View File

@ -172,8 +172,8 @@ if (LINUX)
if (NOT STANDALONE)
# this stops us requiring a really recent glibc at runtime
add_definitions(-fno-stack-protector)
# linking can be so slow - give us a chance to figure out why
set(CMAKE_CXX_LINK_FLAGS "-Wl,--stats,--no-keep-memory")
# linking can be very memory-hungry, especially the final viewer link
set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
endif (NOT STANDALONE)
endif (VIEWER)

View File

@ -181,6 +181,8 @@ LLVorbisDecodeState::LLVorbisDecodeState(const LLUUID &uuid, const std::string &
mFileHandle = LLLFSThread::nullHandle();
#endif
// No default value for mVF, it's an ogg structure?
// Hey, let's zero it anyway, for predictability.
memset(&mVF, 0, sizeof(mVF));
}
LLVorbisDecodeState::~LLVorbisDecodeState()

View File

@ -114,7 +114,11 @@ static timer_tree_dfs_iterator_t end_timer_tree()
class NamedTimerFactory : public LLSingleton<NamedTimerFactory>
{
public:
NamedTimerFactory()
NamedTimerFactory()
: mActiveTimerRoot(NULL),
mTimerRoot(NULL),
mAppTimer(NULL),
mRootFrameState(NULL)
{}
/*virtual */ void initSingleton()

View File

@ -565,19 +565,23 @@ LLEventTimer::LLEventTimer(F32 period)
: mEventTimer()
{
mPeriod = period;
mBusy = false;
}
LLEventTimer::LLEventTimer(const LLDate& time)
: mEventTimer()
{
mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
mBusy = false;
}
LLEventTimer::~LLEventTimer()
{
llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad. if you want tick() to cause destruction of its own timer, make it return true.
}
//static
void LLEventTimer::updateClass()
{
std::list<LLEventTimer*> completed_timers;
@ -587,10 +591,12 @@ void LLEventTimer::updateClass()
F32 et = timer.mEventTimer.getElapsedTimeF32();
if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
timer.mEventTimer.reset();
timer.mBusy = true;
if ( timer.tick() )
{
completed_timers.push_back( &timer );
}
timer.mBusy = false;
}
}

View File

@ -188,6 +188,7 @@ public:
protected:
LLTimer mEventTimer;
F32 mPeriod;
bool mBusy;
};
U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds

View File

@ -343,20 +343,20 @@ public:
/// Instantiate an LLTreeDFSIter to start a depth-first walk. Pass
/// functors to extract the 'child begin' and 'child end' iterators from
/// each node.
LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc):
mBeginFunc(beginfunc),
mEndFunc(endfunc),
mSkipChildren(false)
LLTreeDFSIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc)
: mBeginFunc(beginfunc),
mEndFunc(endfunc),
mSkipChildren(false)
{
// Only push back this node if it's non-NULL!
if (node)
mPending.push_back(node);
}
/// Instantiate an LLTreeDFSIter to mark the end of the walk
LLTreeDFSIter() {}
LLTreeDFSIter() : mSkipChildren(false) {}
/// flags iterator logic to skip traversing children of current node on next increment
void skipDescendants(bool skip = true) { mSkipChildren = skip; }
/// flags iterator logic to skip traversing children of current node on next increment
void skipDescendants(bool skip = true) { mSkipChildren = skip; }
private:
/// leverage boost::iterator_facade
@ -405,8 +405,8 @@ private:
func_type mBeginFunc;
/// functor to extract end() child iterator
func_type mEndFunc;
/// flag which controls traversal of children (skip children of current node if true)
bool mSkipChildren;
/// flag which controls traversal of children (skip children of current node if true)
bool mSkipChildren;
};
/**
@ -451,21 +451,21 @@ public:
/// Instantiate an LLTreeDFSPostIter to start a depth-first walk. Pass
/// functors to extract the 'child begin' and 'child end' iterators from
/// each node.
LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc):
mBeginFunc(beginfunc),
mEndFunc(endfunc),
mSkipAncestors(false)
{
LLTreeDFSPostIter(const ptr_type& node, const func_type& beginfunc, const func_type& endfunc)
: mBeginFunc(beginfunc),
mEndFunc(endfunc),
mSkipAncestors(false)
{
if (! node)
return;
mPending.push_back(typename list_type::value_type(node, false));
makeCurrent();
}
/// Instantiate an LLTreeDFSPostIter to mark the end of the walk
LLTreeDFSPostIter() {}
LLTreeDFSPostIter() : mSkipAncestors(false) {}
/// flags iterator logic to skip traversing ancestors of current node on next increment
void skipAncestors(bool skip = true) { mSkipAncestors = skip; }
/// flags iterator logic to skip traversing ancestors of current node on next increment
void skipAncestors(bool skip = true) { mSkipAncestors = skip; }
private:
/// leverage boost::iterator_facade

View File

@ -188,6 +188,7 @@ LLWorkerClass::LLWorkerClass(LLWorkerThread* workerthread, const std::string& na
: mWorkerThread(workerthread),
mWorkerClassName(name),
mRequestHandle(LLWorkerThread::nullHandle()),
mRequestPriority(LLWorkerThread::PRIORITY_NORMAL),
mMutex(NULL),
mWorkFlags(0)
{

View File

@ -97,7 +97,8 @@ void info_callback(const char* msg, void*)
}
LLImageJ2COJ::LLImageJ2COJ() : LLImageJ2CImpl()
LLImageJ2COJ::LLImageJ2COJ()
: LLImageJ2CImpl()
{
}

View File

@ -51,9 +51,6 @@ protected:
// Divide a by b to the power of 2 and round upwards.
return (a + (1 << b) - 1) >> b;
}
// Temporary variables for in-progress decodes...
LLImageRaw *mRawImagep;
};
#endif

View File

@ -45,7 +45,8 @@ LLCamera::LLCamera() :
mNearPlane(DEFAULT_NEAR_PLANE),
mFarPlane(DEFAULT_FAR_PLANE),
mFixedDistance(-1.f),
mPlaneCount(6)
mPlaneCount(6),
mFrustumCornerDist(0.f)
{
calculateFrustumPlanes();
}
@ -55,7 +56,8 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
LLCoordFrame(),
mViewHeightInPixels(view_height_in_pixels),
mFixedDistance(-1.f),
mPlaneCount(6)
mPlaneCount(6),
mFrustumCornerDist(0.f)
{
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
@ -648,7 +650,6 @@ void LLCamera::ignoreAgentFrustumPlane(S32 idx)
void LLCamera::calcAgentFrustumPlanes(LLVector3* frust)
{
for (int i = 0; i < 8; i++)
{
mAgentFrustum[i] = frust[i];

View File

@ -42,11 +42,14 @@
LLPacketBuffer::LLPacketBuffer(const LLHost &host, const char *datap, const S32 size) : mHost(host)
{
mSize = 0;
mData[0] = '!';
if (size > NET_BUFFER_SIZE)
{
llerrs << "Sending packet > " << NET_BUFFER_SIZE << " of size " << size << llendl;
}
else // we previously relied on llerrs being fatal to not get here...
else
{
if (datap != NULL)
{

View File

@ -1196,6 +1196,7 @@ LLTransferTarget::LLTransferTarget(
mType(type),
mSourceType(source_type),
mID(transfer_id),
mChannelp(NULL),
mGotInfo(FALSE),
mSize(0),
mLastPacketID(-1)

View File

@ -226,7 +226,10 @@ void LLTransferSourceAsset::responderCallback(LLVFS *vfs, const LLUUID& uuid, LL
LLTransferSourceParamsAsset::LLTransferSourceParamsAsset() : LLTransferSourceParams(LLTST_ASSET)
LLTransferSourceParamsAsset::LLTransferSourceParamsAsset()
: LLTransferSourceParams(LLTST_ASSET),
mAssetType(LLAssetType::AT_NONE)
{
}

View File

@ -40,7 +40,12 @@ typedef void (*LLTTFCompleteCallback)(const LLTSCode status, void *user_data);
class LLTransferTargetParamsFile : public LLTransferTargetParams
{
public:
LLTransferTargetParamsFile() : LLTransferTargetParams(LLTTT_FILE) {}
LLTransferTargetParamsFile()
: LLTransferTargetParams(LLTTT_FILE),
mCompleteCallback(NULL),
mUserData(NULL)
{}
void setFilename(const std::string& filename) { mFilename = filename; }
void setCallback(LLTTFCompleteCallback cb, void *user_data) { mCompleteCallback = cb; mUserData = user_data; }

View File

@ -68,7 +68,6 @@ protected:
LLTTVFCompleteCallback mCompleteCallback;
void* mUserDatap;
S32 mErrCode;
LLVFSThread::handle_t mHandle;
};

View File

@ -104,6 +104,8 @@ void LLPluginClassMedia::reset()
mSetMediaHeight = -1;
mRequestedMediaWidth = 0;
mRequestedMediaHeight = 0;
mRequestedTextureWidth = 0;
mRequestedTextureHeight = 0;
mFullMediaWidth = 0;
mFullMediaHeight = 0;
mTextureWidth = 0;

View File

@ -43,6 +43,7 @@ static const F32 PLUGIN_IDLE_SECONDS = 1.0f / 100.0f; // Each call to idle will
LLPluginProcessChild::LLPluginProcessChild()
{
mState = STATE_UNINITIALIZED;
mInstance = NULL;
mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz

View File

@ -89,8 +89,9 @@ private:
STATE_ERROR, // generic bailout state
STATE_DONE // state machine will sit in this state after either error or normal termination.
};
EState mState;
void setState(EState state);
EState mState;
LLHost mLauncherHost;
LLSocket::ptr_t mSocket;

View File

@ -50,6 +50,8 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
mOwner = owner;
mBoundPort = 0;
mState = STATE_UNINITIALIZED;
mSleepTime = 0.0;
mCPUUsage = 0.0;
mDisableTimeout = false;
mDebug = false;

View File

@ -63,6 +63,12 @@ LLCubeMap::LLCubeMap()
mTextureCoordStage(0),
mMatrixStage(0)
{
mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB;
mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB;
mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB;
mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB;
mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB;
mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB;
}
LLCubeMap::~LLCubeMap()
@ -75,13 +81,6 @@ void LLCubeMap::initGL()
if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
{
mTargets[0] = GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB;
mTargets[1] = GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB;
mTargets[2] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB;
mTargets[3] = GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB;
mTargets[4] = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB;
mTargets[5] = GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB;
// Not initialized, do stuff.
if (mImages[0].isNull())
{

View File

@ -332,6 +332,8 @@ LLGLManager::LLGLManager() :
mHasFragmentShader(FALSE),
mHasOcclusionQuery(FALSE),
mHasPointParameters(FALSE),
mHasDrawBuffers(FALSE),
mHasTextureRectangle(FALSE),
mHasAnisotropic(FALSE),
mHasARBEnvCombine(FALSE),
@ -671,7 +673,7 @@ void LLGLManager::initExtensions()
llinfos << "initExtensions() checking shell variables to adjust features..." << llendl;
// Our extension support for the Linux Client is very young with some
// potential driver gotchas, so offer a semi-secret way to turn it off.
if (getenv("LL_GL_NOEXT")) /* Flawfinder: ignore */
if (getenv("LL_GL_NOEXT"))
{
//mHasMultitexture = FALSE; // NEEDED!
mHasARBEnvCombine = FALSE;

View File

@ -70,7 +70,7 @@ hasGamma(false), hasLighting(false), calculatesAtmospherics(false)
// LLGLSL Shader implementation
//===============================
LLGLSLShader::LLGLSLShader()
: mProgramObject(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT)
: mProgramObject(0), mActiveTextureChannels(0), mShaderLevel(0), mShaderGroup(SG_DEFAULT), mUniformsDirty(FALSE)
{
}

View File

@ -59,6 +59,8 @@ LLPostProcess::LLPostProcess(void) :
mSceneRenderTexture = NULL ;
mNoiseTexture = NULL ;
mTempBloomTexture = NULL ;
noiseTextureScale = 1.0f;
/* Do nothing. Needs to be updated to use our current shader system, and to work with the move into llrender.
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", XML_FILENAME));

View File

@ -733,8 +733,11 @@ void LLTexUnit::debugTextureUnit(void)
LLRender::LLRender()
: mDirty(false), mCount(0), mMode(LLRender::TRIANGLES),
mMaxAnisotropy(0.f)
: mDirty(false),
mCount(0),
mMode(LLRender::TRIANGLES),
mCurrTextureUnitIndex(0),
mMaxAnisotropy(0.f)
{
mBuffer = new LLVertexBuffer(immediate_mask, 0);
mBuffer->allocateBuffer(4096, 0, TRUE);

View File

@ -215,14 +215,18 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indices_offset) const
{
llassert(mRequestedNumVerts >= 0);
if (start >= (U32) mRequestedNumVerts ||
end >= (U32) mRequestedNumVerts)
end >= (U32) mRequestedNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << start << ", " << end << "]" << llendl;
}
llassert(mRequestedNumIndices >= 0);
if (indices_offset >= (U32) mRequestedNumIndices ||
indices_offset + count > (U32) mRequestedNumIndices)
indices_offset + count > (U32) mRequestedNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
@ -251,8 +255,9 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
{
llassert(mRequestedNumIndices >= 0);
if (indices_offset >= (U32) mRequestedNumIndices ||
indices_offset + count > (U32) mRequestedNumIndices)
indices_offset + count > (U32) mRequestedNumIndices)
{
llerrs << "Bad index buffer draw range: [" << indices_offset << ", " << indices_offset+count << "]" << llendl;
}
@ -281,8 +286,9 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
{
llassert(mRequestedNumVerts >= 0);
if (first >= (U32) mRequestedNumVerts ||
first + count > (U32) mRequestedNumVerts)
first + count > (U32) mRequestedNumVerts)
{
llerrs << "Bad vertex buffer draw range: [" << first << ", " << first+count << "]" << llendl;
}
@ -354,7 +360,14 @@ void LLVertexBuffer::clientCopy(F64 max_time)
LLVertexBuffer::LLVertexBuffer(U32 typemask, S32 usage) :
LLRefCount(),
mNumVerts(0), mNumIndices(0), mUsage(usage), mGLBuffer(0), mGLIndices(0),
mNumVerts(0),
mNumIndices(0),
mRequestedNumVerts(-1),
mRequestedNumIndices(-1),
mUsage(usage),
mGLBuffer(0),
mGLIndices(0),
mMappedData(NULL),
mMappedIndexData(NULL), mLocked(FALSE),
mFinal(FALSE),
@ -600,6 +613,8 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_VERTS);
llassert(nverts >= 0);
if (nverts >= 65535)
{
llwarns << "Vertex buffer overflow!" << llendl;
@ -628,6 +643,9 @@ void LLVertexBuffer::updateNumVerts(S32 nverts)
void LLVertexBuffer::updateNumIndices(S32 nindices)
{
LLMemType mt2(LLMemType::MTYPE_VERTEX_UPDATE_INDICES);
llassert(nindices >= 0);
mRequestedNumIndices = nindices;
if (!mDynamicSize)
{
@ -668,6 +686,9 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
void LLVertexBuffer::resizeBuffer(S32 newnverts, S32 newnindices)
{
llassert(newnverts >= 0);
llassert(newnindices >= 0);
mRequestedNumVerts = newnverts;
mRequestedNumIndices = newnindices;

View File

@ -371,7 +371,7 @@ private:
// this is just for making it easy to look things up in a set organized by UUID -- DON'T USE IT
// for anything real!
LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mTemporaryResponder(false) {}
LLNotification(LLUUID uuid) : mId(uuid), mCancelled(false), mRespondedTo(false), mIgnored(false), mPriority(NOTIFICATION_PRIORITY_UNSPECIFIED), mTemporaryResponder(false) {}
void cancel();

View File

@ -2333,8 +2333,6 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
LLColor4 color = (mEditor.getReadOnly() ? mStyle->getReadOnlyColor() : mStyle->getColor()) % alpha;
font = mStyle->getFont();
if( selection_start > seg_start )
{
// Draw normally

View File

@ -2507,7 +2507,7 @@ void LLTextEditor::updateLinkSegments()
// then update the link's HREF to be the same as the label text.
// This lets users edit Urls in-place.
LLStyleConstSP style = segment->getStyle();
LLStyle* new_style = new LLStyle(*style);
LLStyleSP new_style(new LLStyle(*style));
LLWString url_label = wtext.substr(segment->getStart(), segment->getEnd()-segment->getStart());
if (LLUrlRegistry::instance().hasUrl(url_label))
{

View File

@ -232,7 +232,7 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const
LLUrlEntrySLURL::LLUrlEntrySLURL()
{
// see http://slurl.com/about.php for details on the SLURL format
mPattern = boost::regex("http://slurl.com/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_slurl.xml";
mTooltip = LLTrans::getString("TooltipSLURL");

View File

@ -68,8 +68,12 @@ class LLPidLockFile
{
public:
LLPidLockFile( ) :
mSaving(FALSE), mWaiting(FALSE),
mClean(TRUE), mPID(getpid())
mAutosave(false),
mSaving(false),
mWaiting(false),
mPID(getpid()),
mNameTable(NULL),
mClean(true)
{
mLockName = gDirUtilp->getTempDir() + gDirUtilp->getDirDelimiter() + "savelock";
}

View File

@ -88,7 +88,6 @@ protected:
S32 mMode;
LLVFS *mVFS;
F32 mPriority;
BOOL mOnReadQueue;
S32 mBytesRead;
LLVFSThread::handle_t mHandle;

View File

@ -131,6 +131,8 @@ LLXMLNode::LLXMLNode(const LLXMLNode& rhs) :
mPrecision(rhs.mPrecision),
mType(rhs.mType),
mEncoding(rhs.mEncoding),
mLineNumber(0),
mParser(NULL),
mParent(NULL),
mChildren(NULL),
mAttributes(),

View File

@ -510,7 +510,8 @@ LLXmlTreeParser::LLXmlTreeParser(LLXmlTree* tree)
: mTree(tree),
mRoot( NULL ),
mCurrent( NULL ),
mDump( FALSE )
mDump( FALSE ),
mKeepContents(FALSE)
{
}

View File

@ -724,8 +724,8 @@ private:
return false;
// allocate some space and grab it
UInt8* item_data = new UInt8( size + 1 );
memset( item_data, 0, ( size + 1 ) * sizeof( UInt8* ) );
UInt8* item_data = new UInt8[ size + 1 ];
memset( item_data, 0, ( size + 1 ) * sizeof( UInt8 ) );
result = QTMetaDataGetItemValue( media_data_ref, item, item_data, size, NULL );
if ( noErr != result )
{

View File

@ -608,6 +608,9 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
mLastMouseX = 0;
mLastMouseY = 0;
mFirstFocus = true;
mBackgroundR = 0.0f;
mBackgroundG = 0.0f;
mBackgroundB = 0.0f;
}
MediaPluginWebKit::~MediaPluginWebKit()

View File

@ -2817,16 +2817,16 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>FirstRunThisInstall</key>
<key>HadFirstSuccessfulLogin</key>
<map>
<key>Comment</key>
<string>Specifies that you have not run the viewer since you installed the latest update</string>
<string>Specifies whether you have successfully logged in at least once before</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
<integer>0</integer>
</map>
<key>FirstSelectedDisabledPopups</key>
<map>

View File

@ -2300,7 +2300,7 @@ public:
virtual ~LLLibraryOutfitsCopyDone()
{
if (!!LLApp::isExiting() && mLibraryOutfitsFetcher)
if (!LLApp::isExiting() && mLibraryOutfitsFetcher)
{
gInventory.addObserver(mLibraryOutfitsFetcher);
mLibraryOutfitsFetcher->done();

View File

@ -279,7 +279,7 @@ public:
virtual ~LLUpdateAppearanceOnDestroy()
{
if (!!LLApp::isExiting())
if (!LLApp::isExiting())
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
}

View File

@ -2632,7 +2632,7 @@ void LLAppViewer::handleViewerCrash()
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
gDebugInfo["HadFirstSuccessfulLogin"] = gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
if(gLogoutInProgress)
{

View File

@ -612,3 +612,13 @@ bool LLAvatarActions::isBlocked(const LLUUID& id)
gCacheName->getFullName(id, name);
return LLMuteList::getInstance()->isMuted(id, name);
}
// static
bool LLAvatarActions::canBlock(const LLUUID& id)
{
std::string firstname, lastname;
gCacheName->getName(id, firstname, lastname);
bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
bool is_self = id == gAgentID;
return !is_self && !is_linden;
}

View File

@ -123,6 +123,11 @@ public:
*/
static bool isBlocked(const LLUUID& id);
/**
* @return true if you can block the avatar
*/
static bool canBlock(const LLUUID& id);
/**
* Return true if the avatar is in a P2P voice call with a given user
*/

View File

@ -280,7 +280,13 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
break;
}
mSpeakBtn->setEnabled(enable);
// We have to enable/disable right and left parts of speak button separately (EXT-4648)
mSpeakBtn->setSpeakBtnEnabled(enable);
// skipped to avoid button blinking
if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
}
}
void LLBottomTray::onMouselookModeOut()
@ -410,9 +416,10 @@ BOOL LLBottomTray::postBuild()
mSpeakPanel = getChild<LLPanel>("speak_panel");
mSpeakBtn = getChild<LLSpeakButton>("talk");
// Speak button should be initially disabled because
// Both parts of speak button should be initially disabled because
// it takes some time between logging in to world and connecting to voice channel.
mSpeakBtn->setEnabled(FALSE);
mSpeakBtn->setSpeakBtnEnabled(false);
mSpeakBtn->setFlyoutBtnEnabled(false);
// Localization tool doesn't understand custom buttons like <talk_button>
mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );

View File

@ -52,6 +52,7 @@
#include "lltransientfloatermgr.h"
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "llviewerparcelmgr.h"
static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids);
void reshape_floater(LLCallFloater* floater, S32 delta_height);
@ -677,7 +678,8 @@ void LLCallFloater::resetVoiceRemoveTimers()
void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
{
mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
bool delete_it = true;
mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it);
}
bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
@ -731,11 +733,11 @@ void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state)
}
else
{
reset();
reset(new_state);
}
}
void LLCallFloater::reset()
void LLCallFloater::reset(const LLVoiceChannel::EState& new_state)
{
// lets forget states from the previous session
// for timers...
@ -748,8 +750,18 @@ void LLCallFloater::reset()
mParticipants = NULL;
mAvatarList->clear();
// update floater to show Loading while waiting for data.
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
// "loading" is shown in parcel with disabled voice only when state is "ringing"
// to avoid showing it in nearby chat vcp all the time- "no_one_near" is now shown there (EXT-4648)
bool show_loading = LLVoiceChannel::STATE_RINGING == new_state;
if(!show_loading && !LLViewerParcelMgr::getInstance()->allowAgentVoice() && mVoiceType == VC_LOCAL_CHAT)
{
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
}
else
{
// update floater to show Loading while waiting for data.
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
}
mAvatarList->setVisible(TRUE);
mNonAvatarCaller->setVisible(FALSE);

View File

@ -220,7 +220,7 @@ private:
*
* Clears all data from the latest voice session.
*/
void reset();
void reset(const LLVoiceChannel::EState& new_state);
private:
speaker_state_map_t mSpeakerStateMap;

View File

@ -370,7 +370,8 @@ struct LLFavoritesSort
LLFavoritesBarCtrl::Params::Params()
: image_drag_indication("image_drag_indication"),
chevron_button("chevron_button")
chevron_button("chevron_button"),
label("label")
{
}
@ -401,6 +402,10 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params);
addChild(mChevronButton);
LLTextBox::Params label_param(p.label);
mBarLabel = LLUICtrlFactory::create<LLTextBox> (label_param);
addChild(mBarLabel);
}
LLFavoritesBarCtrl::~LLFavoritesBarCtrl()

View File

@ -35,6 +35,7 @@
#include "llbutton.h"
#include "lluictrl.h"
#include "lltextbox.h"
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
@ -46,6 +47,7 @@ public:
{
Optional<LLUIImage*> image_drag_indication;
Optional<LLButton::Params> chevron_button;
Optional<LLTextBox::Params> label;
Params();
};
@ -139,6 +141,7 @@ private:
LLUICtrl* mLandingTab;
LLUICtrl* mLastTab;
LLButton* mChevronButton;
LLTextBox* mBarLabel;
LLUUID mDragItemId;
BOOL mStartDrag;

View File

@ -117,7 +117,7 @@ std::string STATUS[] =
"E_ST_NO_XLT_EASEOUT",
"E_ST_NO_XLT_HAND",
"E_ST_NO_XLT_EMOTE",
"E_ST_BAD_ROOT"
"E_ST_BAD_ROOT"
};
//-----------------------------------------------------------------------------

View File

@ -161,12 +161,17 @@ void LLGroupActions::join(const LLUUID& group_id)
S32 cost = gdatap->mMembershipFee;
LLSD args;
args["COST"] = llformat("%d", cost);
args["NAME"] = gdatap->mName;
LLSD payload;
payload["group_id"] = group_id;
if (can_afford_transaction(cost))
{
LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup);
if(cost > 0)
LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup);
else
LLNotificationsUtil::add("JoinGroupNoCost", args, payload, onJoinGroup);
}
else
{

View File

@ -1708,6 +1708,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
bool start_message = true;
LLMessageSystem* msg = gMessageSystem;
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!group_datap) return;
@ -1715,6 +1717,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
it != member_ids.end(); ++it)
{
LLUUID& ejected_member_id = (*it);
llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl;
// Can't use 'eject' to leave a group.
if ((*it) == gAgent.getID()) continue;
@ -1751,11 +1755,14 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
if ((*rit).first.notNull() && (*rit).second!=0)
{
(*rit).second->removeMember(ejected_member_id);
llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl;
}
}
group_datap->mMembers.erase(*it);
llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl;
delete (*mit).second;
}
}
@ -1764,6 +1771,8 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
{
gAgent.sendReliableMessage();
}
llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl;
}
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)

View File

@ -51,6 +51,7 @@
#include "llmenubutton.h"
#include "llresmgr.h" // getMonetaryString
#include "llsafehandle.h"
#include "llsidetray.h"
#include "lltextbox.h" // for description truncation
#include "lltrans.h"
#include "llui.h" // positionViewNearMouse()
@ -643,8 +644,9 @@ void LLInspectObject::onClickOpen()
void LLInspectObject::onClickMoreInfo()
{
// *TODO: Show object info side panel, once that is implemented.
LLNotificationsUtil::add("ClickUnimplemented");
LLSD key;
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
closeFloater();
}

View File

@ -609,12 +609,12 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
std::vector<std::string> disabled_items;
if(isInTrash())
{
items.push_back(std::string("PurgeItem"));
items.push_back(std::string("Purge Item"));
if (!isItemRemovable())
{
disabled_items.push_back(std::string("PurgeItem"));
disabled_items.push_back(std::string("Purge Item"));
}
items.push_back(std::string("RestoreItem"));
items.push_back(std::string("Restore Item"));
}
else
{
@ -2630,14 +2630,17 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("New Gesture"));
mItems.push_back(std::string("New Clothes"));
mItems.push_back(std::string("New Body Parts"));
mItems.push_back(std::string("Change Type"));
LLViewerInventoryCategory *cat = getCategory();
// Changing folder types is just a debug feature; this is fairly unsupported
// and can lead to unexpected behavior if enabled.
#if !LL_RELEASE_FOR_DOWNLOAD
mItems.push_back(std::string("Change Type"));
const LLViewerInventoryCategory *cat = getCategory();
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
mDisabledItems.push_back(std::string("Change Type"));
}
#endif
getClipboardEntries(false, mItems, mDisabledItems, flags);
}
else

View File

@ -432,7 +432,26 @@ void LLInventoryPanel::initializeViews()
rebuildViewsFor(mStartFolderID);
mViewsInitialized = true;
openStartFolderOrMyInventory();
// Special case for new user login
if (gAgent.isFirstLogin())
{
// Auto open the user's library
LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID());
if (lib_folder)
{
lib_folder->setOpen(TRUE);
}
// Auto close the user's my inventory folder
LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID());
if (my_inv_folder)
{
my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
}
}
}
void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)

View File

@ -542,9 +542,9 @@ void LLMediaCtrl::navigateToLocalPage( const std::string& subdir, const std::str
if (! gDirUtilp->fileExists(expanded_filename))
{
if (language != "en-us")
if (language != "en")
{
expanded_filename = gDirUtilp->findSkinnedFilename("html", "en-us", filename);
expanded_filename = gDirUtilp->findSkinnedFilename("html", "en", filename);
if (! gDirUtilp->fileExists(expanded_filename))
{
llwarns << "File " << subdir << delim << filename_in << "not found" << llendl;

View File

@ -483,6 +483,7 @@ BOOL LLPanelAvatarProfile::postBuild()
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this));
registrar.add("Profile.Kick", boost::bind(&LLPanelAvatarProfile::kick, this));
registrar.add("Profile.Freeze", boost::bind(&LLPanelAvatarProfile::freeze, this));
registrar.add("Profile.Unfreeze", boost::bind(&LLPanelAvatarProfile::unfreeze, this));
@ -490,6 +491,8 @@ BOOL LLPanelAvatarProfile::postBuild()
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
enable.add("Profile.EnableGod", boost::bind(&enable_god));
enable.add("Profile.CheckItem", boost::bind(&LLPanelAvatarProfile::checkOverflowMenuItem, this, _2));
enable.add("Profile.EnableItem", boost::bind(&LLPanelAvatarProfile::enableOverflowMenuItem, this, _2));
mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
@ -666,6 +669,26 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
childSetValue("acc_status_text", caption_text);
}
bool LLPanelAvatarProfile::checkOverflowMenuItem(const LLSD& param)
{
std::string item = param.asString();
if (item == "is_blocked")
return LLAvatarActions::isBlocked(getAvatarId());
return false;
}
bool LLPanelAvatarProfile::enableOverflowMenuItem(const LLSD& param)
{
std::string item = param.asString();
if (item == "can_block")
return LLAvatarActions::canBlock(getAvatarId());
return false;
}
void LLPanelAvatarProfile::pay()
{
LLAvatarActions::pay(getAvatarId());
@ -676,6 +699,11 @@ void LLPanelAvatarProfile::share()
LLAvatarActions::share(getAvatarId());
}
void LLPanelAvatarProfile::toggleBlock()
{
LLAvatarActions::toggleBlock(getAvatarId());
}
void LLPanelAvatarProfile::kick()
{
LLAvatarActions::kick(getAvatarId());

View File

@ -192,12 +192,18 @@ protected:
*/
void share();
/**
* Add/remove resident to/from your block list.
*/
void toggleBlock();
void kick();
void freeze();
void unfreeze();
void csr();
bool checkOverflowMenuItem(const LLSD& param);
bool enableOverflowMenuItem(const LLSD& param);
bool enableGod();

View File

@ -81,11 +81,15 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E
void LLPanelChatControlPanel::updateCallButton()
{
// hide/show call button
bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
if (!session) return;
if (!session)
{
childSetEnabled("call_btn", false);
return;
}
bool session_initialized = session->mSessionInitialized;
bool callback_enabled = session->mCallBackEnabled;

View File

@ -676,7 +676,7 @@ void LLPanelLogin::refreshLocation( bool force_visible )
// Don't show on first run after install
// Otherwise ShowStartLocation defaults to true.
show_start = gSavedSettings.getBOOL("ShowStartLocation")
&& !gSavedSettings.getBOOL("FirstRunThisInstall");
&& gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
}
sInstance->childSetVisible("start_location_combo", show_start);
@ -847,7 +847,7 @@ void LLPanelLogin::loadLoginPage()
oStr << "&auto_login=TRUE";
}
if (gSavedSettings.getBOOL("ShowStartLocation")
&& !gSavedSettings.getBOOL("FirstRunThisInstall"))
&& gSavedSettings.getBOOL("HadFirstSuccessfulLogin"))
{
oStr << "&show_start_location=TRUE";
}

View File

@ -69,6 +69,20 @@ BOOL LLPanelMe::postBuild()
void LLPanelMe::onOpen(const LLSD& key)
{
LLPanelProfile::onOpen(key);
if(key.isUndefined() || key.has("edit_my_profile"))
{
// Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823)
buildEditPanel();
openPanel(mEditPanel, getAvatarId());
}
else if(mEditPanel)
{
// When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice.
// First time key can be undefined and second time - key may contain some data.
// Lets close Edit Panel if key does contain some data on second call.
closePanel(mEditPanel);
}
}
bool LLPanelMe::notifyChildren(const LLSD& info)

View File

@ -164,11 +164,7 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
if (item == std::string("can_block"))
{
const LLUUID& id = mUUIDs.front();
std::string firstname, lastname;
gCacheName->getName(id, firstname, lastname);
bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden");
bool is_self = id == gAgentID;
return !is_self && !is_linden;
return LLAvatarActions::canBlock(id);
}
else if (item == std::string("can_add"))
{

View File

@ -197,11 +197,7 @@ void LLPanelProfile::togglePanel(LLPanel* panel, const LLSD& key)
}
else
{
panel->setVisible(FALSE);
if (panel->getParent() == this)
{
removeChild(panel);
}
closePanel(panel);
getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
}
@ -248,6 +244,16 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
panel->setRect(new_rect);
}
void LLPanelProfile::closePanel(LLPanel* panel)
{
panel->setVisible(FALSE);
if (panel->getParent() == this)
{
removeChild(panel);
}
}
S32 LLPanelProfile::notifyParent(const LLSD& info)
{
std::string action = info["action"];

View File

@ -55,6 +55,8 @@ public:
virtual void openPanel(LLPanel* panel, const LLSD& params);
virtual void closePanel(LLPanel* panel);
S32 notifyParent(const LLSD& info);
protected:

View File

@ -74,7 +74,7 @@ public:
/*virtual*/ BOOL postBuild();
void setObjectID(const LLUUID& object_id);
virtual void setObjectID(const LLUUID& object_id);
void setItem( LLInventoryItem* item );
void setAssetId(const LLUUID& asset_id);

View File

@ -74,22 +74,10 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
mLastHeight(0),
mLastWidth(0),
mAspectRatio(0.f),
mPreviewToSave(FALSE)
mPreviewToSave(FALSE),
mImage(NULL)
{
const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
if(item)
{
mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
mImageID = item->getAssetUUID();
mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
else // not an item, assume it's an asset id
{
mImageID = mItemUUID;
mCopyToInv = TRUE;
mIsCopyable = TRUE;
}
updateImageID();
if (key.has("save_as"))
{
mPreviewToSave = TRUE;
@ -97,7 +85,6 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE);
}
LLPreviewTexture::~LLPreviewTexture()
{
if( mLoadingFullImage )
@ -493,3 +480,42 @@ LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
}
return mAssetStatus;
}
void LLPreviewTexture::updateImageID()
{
const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
if(item)
{
mImageID = item->getAssetUUID();
mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
mCopyToInv = FALSE;
mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
else // not an item, assume it's an asset id
{
mImageID = mItemUUID;
mShowKeepDiscard = FALSE;
mCopyToInv = TRUE;
mIsCopyable = TRUE;
}
}
/* virtual */
void LLPreviewTexture::setObjectID(const LLUUID& object_id)
{
mObjectUUID = object_id;
const LLUUID old_image_id = mImageID;
// Update what image we're pointing to, such as if we just specified the mObjectID
// that this mItemID is part of.
updateImageID();
// If the imageID has changed, start over and reload the new image.
if (mImageID != old_image_id)
{
mAssetStatus = PREVIEW_ASSET_UNLOADED;
loadAsset();
}
}

View File

@ -69,6 +69,8 @@ public:
void openToSave();
static void onSaveAsBtn(void* data);
/*virtual*/ void setObjectID(const LLUUID& object_id);
protected:
void init();
/* virtual */ BOOL postBuild();
@ -76,6 +78,7 @@ protected:
static void onAspectRatioCommit(LLUICtrl*,void* userdata);
private:
void updateImageID(); // set what image is being uploaded.
void updateDimensions();
LLUUID mImageID;
LLPointer<LLViewerFetchedTexture> mImage;

View File

@ -39,7 +39,8 @@
const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app.";
const std::string LLSLURL::PREFIX_SL = "sl://";
const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://";
const std::string LLSLURL::PREFIX_SLURL = "http://slurl.com/secondlife/";
const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/";
const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/";
const std::string LLSLURL::APP_TOKEN = "app/";
@ -63,6 +64,11 @@ std::string LLSLURL::stripProtocol(const std::string& url)
{
stripped.erase(0, PREFIX_SLURL.length());
}
else if (matchPrefix(stripped, PREFIX_SLURL_OLD))
{
stripped.erase(0, PREFIX_SLURL_OLD.length());
}
return stripped;
}
@ -74,6 +80,7 @@ bool LLSLURL::isSLURL(const std::string& url)
if (matchPrefix(url, PREFIX_SL)) return true;
if (matchPrefix(url, PREFIX_SECONDLIFE)) return true;
if (matchPrefix(url, PREFIX_SLURL)) return true;
if (matchPrefix(url, PREFIX_SLURL_OLD)) return true;
return false;
}
@ -83,7 +90,8 @@ bool LLSLURL::isSLURLCommand(const std::string& url)
{
if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||
matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL + APP_TOKEN) )
matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ||
matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )
{
return true;
}

View File

@ -50,6 +50,7 @@ public:
static const std::string PREFIX_SL;
static const std::string PREFIX_SECONDLIFE;
static const std::string PREFIX_SLURL;
static const std::string PREFIX_SLURL_OLD;
static const std::string APP_TOKEN;

View File

@ -66,6 +66,16 @@ void LLSpeakButton::draw()
mOutputMonitor->setIsMuted(!voiceenabled);
LLUICtrl::draw();
}
void LLSpeakButton::setSpeakBtnEnabled(bool enabled)
{
LLButton* speak_btn = getChild<LLButton>("speak_btn");
speak_btn->setEnabled(enabled);
}
void LLSpeakButton::setFlyoutBtnEnabled(bool enabled)
{
LLButton* show_btn = getChild<LLButton>("speak_flyout_btn");
show_btn->setEnabled(enabled);
}
LLSpeakButton::LLSpeakButton(const Params& p)
: LLUICtrl(p)

View File

@ -61,6 +61,10 @@ public:
/*virtual*/ ~LLSpeakButton();
/*virtual*/ void draw();
// methods for enabling/disabling right and left parts of speak button separately(EXT-4648)
void setSpeakBtnEnabled(bool enabled);
void setFlyoutBtnEnabled(bool enabled);
// *HACK: Need to put tooltips in a translatable location,
// the panel that contains this button.

View File

@ -205,7 +205,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
}
}
void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it)
{
if (mActionTimersMap.size() == 0) return;
@ -213,7 +213,10 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
if (it_speaker != mActionTimersMap.end())
{
delete it_speaker->second;
if (delete_it)
{
delete it_speaker->second;
}
mActionTimersMap.erase(it_speaker);
}
}
@ -230,16 +233,15 @@ void LLSpeakersDelayActionsStorage::removeAllTimers()
bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
{
unsetActionTimer(speaker_id);
bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it
unsetActionTimer(speaker_id, delete_it);
if (mActionCallback)
{
mActionCallback(speaker_id);
}
// do not return true to avoid deleting of an timer twice:
// in LLSpeakersDelayActionsStorage::unsetActionTimer() & LLEventTimer::updateClass()
return false;
return true;
}
@ -291,7 +293,8 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
}
}
mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
bool delete_it = true;
mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it);
return speakerp;
}

View File

@ -176,11 +176,11 @@ public:
void setActionTimer(const LLUUID& speaker_id);
/**
* Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and deletes it.
* Removes stored LLSpeakerActionTimer for passed speaker UUID from internal map and optionally deletes it.
*
* @see onTimerActionCallback()
*/
void unsetActionTimer(const LLUUID& speaker_id);
void unsetActionTimer(const LLUUID& speaker_id, bool delete_it);
void removeAllTimers();
private:

View File

@ -773,8 +773,6 @@ bool idle_startup()
LLPanelLogin::giveFocus();
gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
}
else
@ -1845,21 +1843,6 @@ bool idle_startup()
{
F32 timeout_frac = timeout.getElapsedTimeF32()/PRECACHING_DELAY;
// We now have an inventory skeleton, so if this is a user's first
// login, we can start setting up their clothing and avatar
// appearance. This helps to avoid the generic "Ruth" avatar in
// the orientation island tutorial experience. JC
if (gAgent.isFirstLogin()
&& !sInitialOutfit.empty() // registration set up an outfit
&& !sInitialOutfitGender.empty() // and a gender
&& gAgent.getAvatarObject() // can't wear clothes without object
&& !gAgent.isGenderChosen() ) // nothing already loading
{
// Start loading the wearables, textures, gestures
LLStartUp::loadInitialOutfit( sInitialOutfit, sInitialOutfitGender );
}
// We now have an inventory skeleton, so if this is a user's first
// login, we can start setting up their clothing and avatar
// appearance. This helps to avoid the generic "Ruth" avatar in
@ -2012,6 +1995,9 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_STARTED );
// Mark that we have successfully logged in at least once
gSavedSettings.setBOOL("HadFirstSuccessfulLogin", TRUE);
// Unmute audio if desired and setup volumes.
// Unmute audio if desired and setup volumes.
// This is a not-uncommon crash site, so surround it with
@ -2536,6 +2522,11 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response)
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
// Not going through the processAgentInitialWearables path, so need to set this here.
LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
S32 gender = 0;
std::string gestures;
if (gender_name == "male")
@ -2554,7 +2545,7 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
LLNameCategoryCollector has_name(outfit_folder_name);
gInventory.collectDescendentsIf(LLUUID::null,
gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(),
cat_array,
item_array,
LLInventoryModel::EXCLUDE_TRASH,
@ -2565,7 +2556,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
}
else
{
LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name);
LLInventoryCategory* cat = cat_array.get(0);
bool do_copy = true;
bool do_append = false;
LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
}
LLAppearanceManager::instance().wearOutfitByName(gestures);
LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);

View File

@ -37,6 +37,7 @@
#include "llfloaterreg.h"
#include "llgroupactions.h"
#include "llgroupiconctrl.h"
#include "llimview.h"
#include "llnotifications.h"
#include "llinstantmessage.h"
#include "lltooltip.h"
@ -52,9 +53,9 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml");
LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
mGroupIcon = getChild<LLGroupIconCtrl>("group_icon");
mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");
mAdhocIcon = getChild<LLAvatarIconCtrl>("adhoc_icon");
mAvatarName = getChild<LLTextBox>("user_name");
mTime = getChild<LLTextBox>("time_box");
mMessage = getChild<LLTextBox>("message");
@ -90,27 +91,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
mAvatarID = p.avatar_id;
mNotification = p.notification;
mAvatarIcon->setVisible(FALSE);
mGroupIcon->setVisible(FALSE);
sys_msg_icon->setVisible(FALSE);
if(p.from == SYSTEM_FROM)
{
sys_msg_icon->setVisible(TRUE);
}
else
{
if(LLGroupActions::isInGroup(mSessionID))
{
mGroupIcon->setVisible(TRUE);
mGroupIcon->setValue(p.session_id);
}
else
{
mAvatarIcon->setVisible(TRUE);
mAvatarIcon->setValue(p.avatar_id);
}
}
initIcon();
S32 maxLinesCount;
std::istringstream ss( getString("message_max_lines_count") );
@ -162,13 +143,27 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)
void LLToastIMPanel::showInspector()
{
if(LLGroupActions::isInGroup(mSessionID))
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
if(!im_session)
{
LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID));
llwarns << "Invalid IM session" << llendl;
return;
}
else
switch(im_session->mSessionType)
{
case LLIMModel::LLIMSession::P2P_SESSION:
LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID));
break;
case LLIMModel::LLIMSession::GROUP_SESSION:
LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID));
break;
case LLIMModel::LLIMSession::ADHOC_SESSION:
LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID));
break;
default:
llwarns << "Unknown IM session type" << llendl;
break;
}
}
@ -217,4 +212,48 @@ void LLToastIMPanel::spawnGroupIconToolTip()
LLToolTipMgr::getInstance()->show(params);
}
void LLToastIMPanel::initIcon()
{
LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
mAvatarIcon->setVisible(FALSE);
mGroupIcon->setVisible(FALSE);
sys_msg_icon->setVisible(FALSE);
mAdhocIcon->setVisible(FALSE);
if(mAvatarName->getValue().asString() == SYSTEM_FROM)
{
sys_msg_icon->setVisible(TRUE);
}
else
{
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
if(!im_session)
{
llwarns << "Invalid IM session" << llendl;
return;
}
switch(im_session->mSessionType)
{
case LLIMModel::LLIMSession::P2P_SESSION:
mAvatarIcon->setVisible(TRUE);
mAvatarIcon->setValue(mAvatarID);
break;
case LLIMModel::LLIMSession::GROUP_SESSION:
mGroupIcon->setVisible(TRUE);
mGroupIcon->setValue(mSessionID);
break;
case LLIMModel::LLIMSession::ADHOC_SESSION:
mAdhocIcon->setVisible(TRUE);
mAdhocIcon->setValue(im_session->mOtherParticipantID);
mAdhocIcon->setToolTip(im_session->mName);
break;
default:
llwarns << "Unknown IM session type" << llendl;
break;
}
}
}
// EOF

View File

@ -66,6 +66,8 @@ private:
void spawnNameToolTip();
void spawnGroupIconToolTip();
void initIcon();
static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
LLNotificationPtr mNotification;
@ -73,6 +75,7 @@ private:
LLUUID mAvatarID;
LLAvatarIconCtrl* mAvatarIcon;
LLGroupIconCtrl* mGroupIcon;
LLAvatarIconCtrl* mAdhocIcon;
LLTextBox* mAvatarName;
LLTextBox* mTime;
LLTextBox* mMessage;

View File

@ -603,6 +603,10 @@ class LLAdvancedToggleHUDInfo : public view_listener_t
{
gDisplayFOV = !(gDisplayFOV);
}
else if ("badge" == info_type)
{
gDisplayBadge = !(gDisplayBadge);
}
return true;
}
};
@ -625,6 +629,10 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
{
new_value = gDisplayFOV;
}
else if ("badge" == info_type)
{
new_value = gDisplayBadge;
}
return new_value;
}
};
@ -7179,25 +7187,7 @@ void handle_buy_currency_test(void*)
LLStringUtil::format_map_t replace;
replace["[AGENT_ID]"] = gAgent.getID().asString();
replace["[SESSION_ID]"] = gAgent.getSecureSessionID().asString();
// *TODO: Replace with call to LLUI::getLanguage() after windows-setup
// branch merges in. JC
std::string language = "en";
language = gSavedSettings.getString("Language");
if (language.empty() || language == "default")
{
language = gSavedSettings.getString("InstallLanguage");
}
if (language.empty() || language == "default")
{
language = gSavedSettings.getString("SystemLanguage");
}
if (language.empty() || language == "default")
{
language = "en";
}
replace["[LANGUAGE]"] = language;
replace["[LANGUAGE]"] = LLUI::getLanguage();
LLStringUtil::format(url, replace);
llinfos << "buy currency url " << url << llendl;

View File

@ -1478,6 +1478,11 @@ void inventory_offer_handler(LLOfferInfo* info)
// Strip any SLURL from the message display. (DEV-2754)
std::string msg = info->mDesc;
int indx = msg.find(" ( http://slurl.com/secondlife/");
if(indx == std::string::npos)
{
// try to find new slurl host
indx = msg.find(" ( http://maps.secondlife.com/secondlife/");
}
if(indx >= 0)
{
LLStringUtil::truncate(msg, indx);

View File

@ -1597,14 +1597,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
instance->mTeleportInProgress = FALSE;
instance->mTeleportFinishedSignal(gAgent.getPositionGlobal());
}
// HACK: This makes agents drop from the sky if they enter a parcel
// which is set to no fly.
BOOL was_flying = gAgent.getFlying();
if (was_flying && !parcel->getAllowFly())
{
gAgent.setFlying(gAgent.canFly());
}
}
}

View File

@ -233,6 +233,7 @@ S32 gDebugRaycastFaceHit;
BOOL gDisplayWindInfo = FALSE;
BOOL gDisplayCameraPos = FALSE;
BOOL gDisplayFOV = FALSE;
BOOL gDisplayBadge = FALSE;
S32 CHAT_BAR_HEIGHT = 28;
S32 OVERLAY_BAR_HEIGHT = 20;
@ -422,6 +423,11 @@ public:
addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * LLViewerCamera::getInstance()->getView()));
ypos += y_inc;
}
if (gDisplayBadge)
{
addText(xpos, ypos+(y_inc/2), llformat("Hippos!", RAD_TO_DEG * LLViewerCamera::getInstance()->getView()));
ypos += y_inc * 2;
}
/*if (LLViewerJoystick::getInstance()->getOverrideCamera())
{

View File

@ -506,5 +506,6 @@ extern S32 CHAT_BAR_HEIGHT;
extern BOOL gDisplayCameraPos;
extern BOOL gDisplayWindInfo;
extern BOOL gDisplayFOV;
extern BOOL gDisplayBadge;
#endif

View File

@ -145,11 +145,20 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["VERSION_PATCH"] = LLVersionInfo::getPatch();
substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
substitution["CHANNEL"] = LLVersionInfo::getChannel();
substitution["LANGUAGE"] = LLUI::getLanguage();
substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel();
substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
// work out the current language
std::string lang = LLUI::getLanguage();
if (lang == "en-us")
{
// *HACK: the correct fix is to change English.lproj/language.txt,
// but we're late in the release cycle and this is a less risky fix
lang = "en";
}
substitution["LANGUAGE"] = lang;
// find the region ID
LLUUID region_id;
LLViewerRegion *region = gAgent.getRegion();
@ -159,14 +168,14 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
}
substitution["REGION_ID"] = region_id;
// find the parcel ID
LLUUID parcel_id;
// find the parcel local ID
S32 parcel_id = 0;
LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
if (parcel)
{
parcel_id = parcel->getID();
parcel_id = parcel->getLocalID();
}
substitution["PARCEL_ID"] = parcel_id;
substitution["PARCEL_ID"] = llformat("%d", parcel_id);
// expand all of the substitution strings and escape the url
std::string expanded_url = url;

View File

@ -290,7 +290,7 @@
reference="Black" />
<color
name="ContextSilhouetteColor"
value="0.94 0.61 0 1" />
reference="EmphasisColor" />
<color
name="DefaultHighlightDark"
reference="White_10" />
@ -602,7 +602,7 @@
value="0.39 0.39 0.39 1" />
<color
name="ScriptErrorColor"
value="Red" />
reference="Red" />
<color
name="ScrollBGStripeColor"
reference="Transparent" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 B

After

Width:  |  Height:  |  Size: 334 B

View File

@ -369,7 +369,7 @@ with the same filename but different name
<texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
<texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
<texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
<texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
<texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
<texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" />
<texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" />
@ -377,6 +377,7 @@ with the same filename but different name
<texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
<texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" />
<texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" />
<texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
<texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
<texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
<texture name="Parcel_Push_Dark" file_name="icons/Parcel_Push_Dark.png" preload="false" />

View File

@ -178,8 +178,8 @@
follows="top|left"
height="16"
halign="right"
left="150"
width="170"
left="140"
width="180"
layout="topleft"
name="buy_action">
[NAME] L$ [PRICE]

View File

@ -114,7 +114,7 @@
left="6"
name="Keep"
top_pad="5"
width="100" />
width="110" />
<button
follows="right|bottom"
height="22"
@ -123,7 +123,7 @@
left_pad="5"
name="Discard"
top_delta="0"
width="100" />
width="110" />
<button
follows="right|bottom"
height="22"
@ -132,5 +132,5 @@
left_pad="5"
name="save_tex_btn"
top_delta="0"
width="100" />
width="110" />
</floater>

View File

@ -13,11 +13,11 @@
function="Self.EnableStandUp" />
</menu_item_call>
<context_menu
label="Take Off &gt;"
label="Take Off "
layout="topleft"
name="Take Off &gt;">
<context_menu
label="Clothes &gt;"
label="Clothes "
layout="topleft"
name="Clothes &gt;">
<menu_item_call
@ -151,7 +151,7 @@
<menu_item_call.on_enable
function="Edit.EnableTakeOff"
parameter="alpha" />
</menu_item_call>
</menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_call
@ -164,11 +164,11 @@
</menu_item_call>
</context_menu>
<context_menu
label="HUD &gt;"
label="HUD "
layout="topleft"
name="Object Detach HUD" />
<context_menu
label="Detach &gt;"
label="Detach "
layout="topleft"
name="Object Detach" />
<menu_item_call

View File

@ -65,7 +65,7 @@
</menu_item_call>
<menu_item_separator layout="topleft" />
<context_menu
label="Put On &gt;"
label="Put On "
name="Put On" >
<menu_item_call
enabled="false"
@ -77,15 +77,25 @@
function="Object.EnableWear" />
</menu_item_call>
<context_menu
label="Attach &gt;"
label="Attach "
name="Object Attach" />
<context_menu
label="Attach HUD &gt;"
label="Attach HUD "
name="Object Attach HUD" />
</context_menu>
<context_menu
label="Remove &gt;"
label="Remove "
name="Remove">
<menu_item_call
enabled="false"
label="Take"
name="Pie Object Take">
<menu_item_call.on_click
function="Tools.BuyOrTake" />
<menu_item_call.on_enable
function="Tools.EnableBuyOrTake"
parameter="Buy,Take" />
</menu_item_call>
<menu_item_call
enabled="false"
label="Report Abuse"
@ -124,16 +134,6 @@
</menu_item_call>
</context_menu>
<menu_item_separator layout="topleft" />
<menu_item_call
enabled="false"
label="Take"
name="Pie Object Take">
<menu_item_call.on_click
function="Tools.BuyOrTake" />
<menu_item_call.on_enable
function="Tools.EnableBuyOrTake"
parameter="Buy,Take" />
</menu_item_call>
<menu_item_call
enabled="false"
label="Take Copy"

View File

@ -19,6 +19,19 @@
<menu_item_call.on_click
function="Profile.Share" />
</menu_item_call>
<menu_item_check
label="Block/Unblock"
layout="topleft"
name="block_unblock">
<menu_item_check.on_click
function="Profile.BlockUnblock" />
<menu_item_check.on_check
function="Profile.CheckItem"
parameter="is_blocked" />
<menu_item_check.on_enable
function="Profile.EnableItem"
parameter="can_block" />
</menu_item_check>
<menu_item_call
label="Kick"
layout="topleft"

View File

@ -1998,6 +1998,18 @@
function="Advanced.ToggleHUDInfo"
parameter="fov" />
</menu_item_check>
<menu_item_check
label="Badge"
layout="topleft"
name="Badge"
shortcut="alt|control|shift|h">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
parameter="badge" />
<menu_item_check.on_click
function="Advanced.ToggleHUDInfo"
parameter="badge" />
</menu_item_check>
</menu>
<menu
create_jump_keys="true"

View File

@ -391,14 +391,6 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
notext="No"
yestext="Yes"/>
</notification>
<notification
icon="alertmodal.tga"
name="ClickUnimplemented"
type="alertmodal">
Sorry, not implemented yet.
</notification>
<notification
icon="alertmodal.tga"
name="JoinGroupCanAfford"
@ -411,6 +403,19 @@ Do you wish to proceed?
yestext="Join"/>
</notification>
<notification
icon="alertmodal.tga"
name="JoinGroupNoCost"
type="alertmodal">
You are Joining group [NAME].
Do you wish to proceed?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
yestext="Join"/>
</notification>
<notification
icon="alertmodal.tga"
name="JoinGroupCannotAfford"

View File

@ -45,6 +45,17 @@
name="group_icon"
top="3"
width="18" />
<avatar_icon
color="Green"
follows="right"
height="18"
image_name="Generic_Person"
layout="topleft"
left="3"
mouse_opaque="false"
name="adhoc_icon"
top="3"
width="18" />
<!--<icon
follows="right"
height="20"

View File

@ -118,7 +118,7 @@ control_name="RememberPassword"
follows="left|bottom"
font="SansSerifSmall"
height="16"
label="Remember"
label="Remember password"
top_pad="3"
name="remember_check"
width="135" />

View File

@ -141,12 +141,25 @@
font="SansSerifSmall"
height="15"
layout="topleft"
left="102"
left="0"
name="favorite"
image_drag_indication="Accordion_ArrowOpened_Off"
bottom="55"
tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
width="590">
<label
follows="left|top"
font.style="BOLD"
height="15"
layout="topleft"
left="10"
name="favorites_bar_label"
text_color="LtGray"
tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
top="12"
width="102">
Favorites Bar
</label>
<chevron_button name=">>"
image_unselected="TabIcon_Close_Off"
image_selected="TabIcon_Close_Off"
@ -157,15 +170,4 @@
top="15"
height="15"/>
</favorites_bar>
<text
follows="left|top"
font.style="BOLD"
height="15"
layout="topleft"
left="10"
top_pad="-12"
name="favorites_bar_label"
text_color="LtGray"
tool_tip="Drag Landmarks here for quick access to your favorite places in Second Life!"
width="102">Favorites Bar</text>
</panel>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<panel
border="true"
follows="left|top|right|bottom"
follows="all"
height="408"
label="Advanced"
layout="topleft"
left="102"
name="advanced"
@ -13,130 +13,29 @@
name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
<check_box
control_name="UseChatBubbles"
follows="left|top"
height="16"
label="Bubble chat"
layout="topleft"
left="30"
top="10"
name="bubble_text_chat"
width="150" />
<color_swatch
can_apply_immediately="true"
color="0 0 0 1"
control_name="BackgroundChatColor"
follows="left|top"
height="47"
layout="topleft"
left_delta="280"
name="background"
tool_tip="Choose color for bubble chat"
top_delta="1"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="BackgroundChatColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="BackgroundChatColor" />
</color_swatch>
<slider
control_name="ChatBubbleOpacity"
follows="left|top"
height="16"
increment="0.05"
initial_value="1"
label="Opacity"
layout="topleft"
left_delta="-230"
top_pad="-28"
label_width="50"
name="bubble_chat_opacity"
width="200" />
<text
follows="left|top"
type="string"
length="1"
height="25"
layout="topleft"
left="30"
top_pad="5"
name="AspectRatioLabel1"
tool_tip="width / height"
label_width="50"
width="120">
Aspect ratio
</text>
<combo_box
allow_text_entry="true"
height="23"
follows="left|top"
layout="topleft"
left_pad="0"
max_chars="100"
name="aspect_ratio"
tool_tip="width / height"
top_delta="0"
width="150">
<combo_box.item
enabled="true"
label=" 4:3 (Standard CRT)"
name="item1"
value="1.333333" />
<combo_box.item
enabled="true"
label=" 5:4 (1280x1024 LCD)"
name="item2"
value="1.25" />
<combo_box.item
enabled="true"
label=" 8:5 (Widescreen)"
name="item3"
value="1.6" />
<combo_box.item
enabled="true"
label=" 16:9 (Widescreen)"
name="item4"
value="1.7777777" />
</combo_box>
<check_box
control_name="FullScreenAutoDetectAspectRatio"
follows="left|top"
height="25"
label="Auto-detect"
layout="topleft"
left_pad="10"
name="aspect_auto_detect"
width="256">
<check_box.commit_callback
function="Pref.AutoDetectAspect" />
</check_box>
<text
follows="left|top"
type="string"
length="1"
height="10"
left="30"
name="heading1"
top_pad="5"
width="270">
Camera:
</text>
<icon
follows="left|top"
height="18"
image_name="Cam_FreeCam_Off"
layout="topleft"
name="camera_icon"
mouse_opaque="false"
visible="true"
width="18"
left="30"
top="10"/>
<slider
can_edit_text="true"
control_name="CameraAngle"
control_name="CameraAngle"
decimal_digits="2"
top_pad="5"
follows="left|top"
height="16"
increment="0.025"
initial_value="1.57"
layout="topleft"
label_width="100"
label="View Angle"
left_delta="50"
label="View angle"
left_pad="30"
max_val="2.97"
min_val="0.17"
name="camera_fov"
@ -165,11 +64,11 @@ Camera:
type="string"
length="1"
height="10"
left="30"
left="80"
name="heading2"
width="270"
top_pad="5">
Automatic positioning for:
Automatic position for:
</text>
<check_box
control_name="EditCameraMovement"
@ -177,7 +76,7 @@ Automatic positioning for:
follows="left|top"
label="Build/Edit"
layout="topleft"
left_delta="50"
left_delta="30"
name="edit_camera_movement"
tool_tip="Use automatic camera positioning when entering and exiting edit mode"
width="280"
@ -191,27 +90,27 @@ Automatic positioning for:
name="appearance_camera_movement"
tool_tip="Use automatic camera positioning while in edit mode"
width="242" />
<text
follows="left|top"
type="string"
length="1"
height="10"
left="30"
name="heading3"
top_pad="5"
width="270">
Avatars:
</text>
<icon
follows="left|top"
height="18"
image_name="Move_Walk_Off"
layout="topleft"
name="avatar_icon"
mouse_opaque="false"
visible="true"
width="18"
top_pad="2"
left="30"
/>
<check_box
control_name="FirstPersonAvatarVisible"
follows="left|top"
height="20"
label="Show me in Mouselook"
layout="topleft"
left_delta="50"
left_pad="30"
name="first_person_avatar_visible"
width="256"
top_pad="0"/>
width="256" />
<check_box
control_name="ArrowKeysAlwaysMove"
follows="left|top"
@ -242,22 +141,61 @@ Avatars:
name="enable_lip_sync"
width="237"
top_pad="0" />
<check_box
control_name="UseChatBubbles"
follows="left|top"
height="16"
label="Bubble chat"
layout="topleft"
left="78"
top_pad="6"
name="bubble_text_chat"
width="150" />
<slider
control_name="ChatBubbleOpacity"
follows="left|top"
height="16"
increment="0.05"
initial_value="1"
label="Opacity"
layout="topleft"
left="80"
label_width="50"
name="bubble_chat_opacity"
width="200" />
<color_swatch
can_apply_immediately="true"
color="0 0 0 1"
control_name="BackgroundChatColor"
follows="left|top"
height="50"
layout="topleft"
left_pad="10"
name="background"
tool_tip="Choose color for bubble chat"
width="38">
<color_swatch.init_callback
function="Pref.getUIColor"
parameter="BackgroundChatColor" />
<color_swatch.commit_callback
function="Pref.applyUIColor"
parameter="BackgroundChatColor" />
</color_swatch>
<check_box
control_name="ShowScriptErrors"
follows="left|top"
height="20"
label="Show script errors"
label="Show script errors in:"
layout="topleft"
left="30"
name="show_script_errors"
width="256"
top_pad="5"/>
width="256" />
<radio_group
enabled_control="ShowScriptErrors"
control_name="ShowScriptErrorsLocation"
follows="top|left"
draw_border="false"
height="40"
height="16"
layout="topleft"
left_delta="50"
name="show_location"
@ -265,7 +203,7 @@ Avatars:
width="364">
<radio_item
height="16"
label="In chat"
label="Nearby chat"
layout="topleft"
left="3"
name="0"
@ -273,7 +211,7 @@ Avatars:
width="315" />
<radio_item
height="16"
label="In a window"
label="Separate window"
layout="topleft"
left_delta="175"
name="1"
@ -284,50 +222,105 @@ Avatars:
follows="top|left"
enabled_control="EnableVoiceChat"
control_name="PushToTalkToggle"
height="20"
label="Toggle mode for microphone when I press the Speak trigger key:"
height="15"
label="Toggle speak on/off when I press:"
layout="topleft"
left="30"
name="push_to_talk_toggle_check"
width="237"
top_pad="-25"
tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/>
<line_editor
follows="top|left"
control_name="PushToTalkButton"
enabled="false"
enabled="false"
enabled_control="EnableVoiceChat"
height="19"
left_delta="50"
max_length="254"
height="23"
left="80"
max_length="200"
name="modifier_combo"
label="Push-to-Speak trigger"
top_pad="0"
width="280" />
top_pad="5"
width="200" />
<button
follows="top|left"
enabled_control="EnableVoiceChat"
height="23"
label="Set Key"
left_delta="0"
left_pad="5"
name="set_voice_hotkey_button"
width="115"
top_pad="5">
width="100">
<button.commit_callback
function="Pref.VoiceSetKey" />
</button>
<button
bottom_delta="0"
enabled_control="EnableVoiceChat"
follows="left"
follows="top|left"
halign="center"
height="23"
label="Middle Mouse Button"
left_delta="120"
image_overlay="Refresh_Off"
tool_tip="Reset to Middle Mouse Button"
mouse_opaque="true"
name="set_voice_middlemouse_button"
width="160">
left_pad="5"
width="25">
<button.commit_callback
function="Pref.VoiceSetMiddleMouse" />
</button>
<text
follows="left|top"
type="string"
length="1"
height="13"
layout="topleft"
left="30"
top_pad="8"
name="AspectRatioLabel1"
tool_tip="width / height"
label_width="50"
width="120">
Aspect ratio
</text>
<combo_box
allow_text_entry="true"
height="23"
follows="left|top"
layout="topleft"
left="80"
max_chars="100"
name="aspect_ratio"
tool_tip="width / height"
width="150">
<combo_box.item
enabled="true"
label=" 4:3 (Standard CRT)"
name="item1"
value="1.333333" />
<combo_box.item
enabled="true"
label=" 5:4 (1280x1024 LCD)"
name="item2"
value="1.25" />
<combo_box.item
enabled="true"
label=" 8:5 (Widescreen)"
name="item3"
value="1.6" />
<combo_box.item
enabled="true"
label=" 16:9 (Widescreen)"
name="item4"
value="1.7777777" />
</combo_box>
<check_box
control_name="FullScreenAutoDetectAspectRatio"
follows="left|top"
height="25"
label="Automatic"
layout="topleft"
left_pad="10"
name="aspect_auto_detect"
width="256">
<check_box.commit_callback
function="Pref.AutoDetectAspect" />
</check_box>
</panel>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="true"
height="500"
height="408"
label="Popups"
layout="topleft"
left="0"
@ -14,7 +14,7 @@
follows="top|left"
height="12"
layout="topleft"
left="30"
left="10"
name="tell_me_label"
top="10"
width="300">
@ -32,7 +32,7 @@
<check_box
control_name="ChatOnlineNotification"
height="16"
label="When my friends log out or in"
label="When my friends log in or out"
layout="topleft"
left_delta="0"
name="friends_online_notify_checkbox"
@ -42,38 +42,33 @@
type="string"
length="1"
follows="top|left"
font="SansSerifBold"
height="12"
layout="topleft"
left="30"
left="10"
name="show_label"
top_pad="14"
top_pad="8"
width="450">
Always show these notifications:
Always show:
</text>
<scroll_list
follows="top|left"
height="92"
height="140"
layout="topleft"
left="10"
multi_select="true"
multi_select="true"
name="enabled_popups"
width="475" />
<button
enabled_control="FirstSelectedDisabledPopups"
follows="top|left"
height="23"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_overlay="Arrow_Up"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
layout="topleft"
left_delta="137"
left="180"
name="enable_this_popup"
top_pad="10"
width="43">
top_pad="5"
width="40">
<button.commit_callback
function="Pref.ClickEnablePopup" />
</button>
@ -81,17 +76,13 @@
enabled_control="FirstSelectedEnabledPopups"
follows="top|left"
height="23"
image_disabled="PushButton_Disabled"
image_disabled_selected="PushButton_Disabled"
image_overlay="Arrow_Down"
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
hover_glow_amount="0.15"
layout="topleft"
left_pad="50"
left_pad="40"
name="disable_this_popup"
top_delta="0"
width="43">
width="40">
<button.commit_callback
function="Pref.ClickDisablePopup" />
</button>
@ -99,21 +90,20 @@
type="string"
length="1"
follows="top|left"
font="SansSerifBold"
height="12"
layout="topleft"
left="30"
left="10"
name="dont_show_label"
top_pad="10"
top_pad="-10"
width="450">
Never show these notifications:
Never show:
</text>
<scroll_list
follows="top|left"
height="92"
height="140"
layout="topleft"
left="10"
multi_select="true"
multi_select="true"
name="disabled_popups"
width="475" />
</panel>

View File

@ -89,11 +89,12 @@
<text
font="SansSerifSmall"
type="string"
text_color="White_50"
length="1"
follows="left|top"
height="18"
layout="topleft"
left_pad="5"
left_pad="10"
name="language_textbox2"
width="200">
(Requires restart)
@ -179,7 +180,7 @@
left_pad="5"
name="show_location_checkbox"
top_delta="5"
width="256" />
width="256" />
<text
type="string"
length="1"
@ -203,21 +204,21 @@
layout="topleft"
name="radio"
value="0"
width="100" />
width="75" />
<radio_item
label="On"
layout="topleft"
left_pad="12"
name="radio2"
value="1"
width="100" />
width="75" />
<radio_item
label="Show briefly"
layout="topleft"
left_pad="12"
name="radio3"
value="2"
width="100" />
value="2"
width="160" />
</radio_group>
<check_box
enabled_control="AvatarNameTagMode"
@ -326,7 +327,7 @@
left="30"
mouse_opaque="false"
name="text_box3"
top_pad="15"
top_pad="10"
width="240">
Busy mode response:
</text>
@ -335,18 +336,16 @@
text_readonly_color="LabelDisabledColor"
bg_writeable_color="LtGray"
use_ellipses="false"
bg_visible="true"
border_visible="true"
hover="false"
commit_on_focus_lost = "true"
follows="left|top"
height="50"
height="60"
layout="topleft"
left="50"
name="busy_response"
width="400"
width="440"
word_wrap="true">
log_in_to_change
</text_editor>
</panel>

View File

@ -33,16 +33,15 @@
<button
control_name="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<check_box
control_name="MuteWhenMinimized"
height="15"
@ -74,20 +73,19 @@
function="Pref.setControlFalse"
parameter="MuteAmbient" />
</slider>
<button
control_name="MuteAmbient"
<button
control_name="MuteAmbient"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_wind"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<slider
control_name="AudioLevelUI"
disabled_control="MuteAudio"
@ -113,16 +111,15 @@
control_name="MuteUI"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_ui"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<slider
control_name="AudioLevelMedia"
disabled_control="MuteAudio"
@ -144,20 +141,19 @@
function="Pref.setControlFalse"
parameter="MuteMedia" />
</slider>
<button
<button
control_name="MuteMedia"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_media"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<slider
control_name="AudioLevelSFX"
disabled_control="MuteAudio"
@ -179,20 +175,19 @@
function="Pref.setControlFalse"
parameter="MuteSounds" />
</slider>
<button
<button
control_name="MuteSounds"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_sfx"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<slider
control_name="AudioLevelMusic"
disabled_control="MuteAudio"
@ -214,20 +209,19 @@
function="Pref.setControlFalse"
parameter="MuteMusic" />
</slider>
<button
<button
control_name="MuteMusic"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_music"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<check_box
label_text.halign="left"
follows="left|top"
@ -236,10 +230,9 @@
disabled_control="CmdLineDisableVoice"
label="Enable voice"
layout="topleft"
font.style="BOLD"
left="101"
left="28"
name="enable_voice_check"
top_pad="13"
top_pad="5"
width="110"
>
</check_box>
@ -265,21 +258,19 @@
function="Pref.setControlFalse"
parameter="MuteVoice" />
</slider>
<button
<button
control_name="MuteVoice"
enabled_control="EnableVoiceChat"
disabled_control="MuteAudio"
follows="top|right"
height="18"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
left_pad="16"
name="mute_voice"
left_pad="10"
name="mute_audio"
tab_stop="false"
top_delta="-2"
width="22" />
width="16" />
<text
type="string"
length="1"
@ -366,7 +357,7 @@
name="device_settings_panel"
class="panel_voice_device_settings"
width="501"
top="280">
top="285">
<panel.string
name="default_text">
Default

View File

@ -115,9 +115,6 @@
<!-- Avatar name: More than one avatar is selected/used here -->
<string name="AvatarNameMultiple">(multiple)</string>
<!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
<string name="AvatarNameHippos">(hippos)</string>
<!-- Group name: text shown for LLUUID::null -->
<string name="GroupNameNone">(none)</string>

View File

@ -99,7 +99,7 @@
top="19"
left="2"
follows="right|top"
image_name="Parcel_Damage_Dark"
image_name="Parcel_Health_Dark"
/>
<!-- Default text color is invisible on top of nav bar background -->
<damage_text

View File

@ -269,6 +269,7 @@ namespace tut
template<> template<>
void HTTPClientTestObject::test<2>()
{
skip("error test depends on dev's local ISP not supplying \"helpful\" search page");
LLHTTPClient::get("http://www.invalid", newResult());
runThePump();
ensureStatusError();

View File

@ -226,30 +226,30 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>609c469ee1857723260b5a9943b9c2c1</string>
<string>84821102cb819257a66c8f38732647fc</string>
<key>url</key>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20091202.tar.bz2</uri>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100119.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>7085044567999489d82b9ed28f16e480</string>
<string>ee8e1b4bbcf137a84d6a85a1c51386ff</string>
<key>url</key>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20091202.tar.bz2</uri>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100119.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
<key>md5sum</key>
<string>b4aeefcba3d749f1e9f2a12c6f70192b</string>
<string>af4badd6b2c10bc4db82ff1256695892</string>
<key>url</key>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20091202.tar.bz2</uri>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux64-20100119.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>6746ae9fd9aff98b15f7b9f0f40334ab</string>
<string>acbf7a4165a917a4e087879d1756b355</string>
<key>url</key>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20091204.tar.bz2</uri>
<uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100119.tar.bz2</uri>
</map>
</map>
</map>